blob: 3061f639df42af7bb374e0ed3602f8bd979629c8 [file] [log] [blame]
/*
* Copyright 2008 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package com.google.gwt.emultest.benchmarks.java.lang;
import com.google.gwt.benchmarks.client.Benchmark;
import com.google.gwt.benchmarks.client.IntRange;
import com.google.gwt.benchmarks.client.IterationTimeLimit;
import com.google.gwt.benchmarks.client.Operator;
import com.google.gwt.benchmarks.client.RangeField;
import com.google.gwt.core.client.GWT;
import com.google.gwt.core.client.impl.StringBufferImpl;
import com.google.gwt.core.client.impl.StringBufferImplAppend;
import com.google.gwt.core.client.impl.StringBufferImplArray;
import com.google.gwt.core.client.impl.StringBufferImplConcat;
import com.google.gwt.core.client.impl.StringBufferImplPush;
/**
* Tests StringBuilder impl directly against each other. Useful when profiling
* browser behavior.
*/
public class StringBufferImplBenchmark extends Benchmark {
/**
* The type of StringBuilder to use for a test.
*/
protected enum SBType {
APPEND("Append"), ARRAY("Array"), CONCAT("Concat"), PUSH("Push");
public String description;
private SBType(String description) {
this.description = description;
}
@Override
public String toString() {
return description;
}
}
@SuppressWarnings("unused")
private static volatile String result;
private static volatile Object[] stashSomeGarbage;
static {
if (GWT.isClient()) {
stashSomeGarbage = new Object[10000];
for (int i = 0; i < stashSomeGarbage.length; ++i) {
stashSomeGarbage[i] = new Object();
}
}
}
final SBType[] appendKindsRange = new SBType[] {
SBType.APPEND, SBType.ARRAY, SBType.CONCAT, SBType.PUSH};
final IntRange manyTimesRange = new IntRange(32, 8192, Operator.MULTIPLY, 2);
final IntRange singleTimesRange = new IntRange(32, 8192, Operator.MULTIPLY, 2);
@Override
public String getModuleName() {
return "com.google.gwt.emultest.EmulSuiteBenchmarks";
}
public void testManyAppends() {
}
@IterationTimeLimit(0)
public void testManyAppends(@RangeField("manyTimesRange")
Integer times, @RangeField("appendKindsRange")
SBType sbtype) {
int number = (int) Math.sqrt(times.intValue());
switch (sbtype) {
case APPEND:
for (int i = 0; i < number; ++i) {
result = doAppend(number);
result = null;
}
break;
case ARRAY:
for (int i = 0; i < number; ++i) {
result = doArray(number);
result = null;
}
break;
case CONCAT:
for (int i = 0; i < number; ++i) {
result = doConcat(number);
result = null;
}
break;
case PUSH:
for (int i = 0; i < number; ++i) {
result = doPush(number);
result = null;
}
break;
}
}
public void testSingleAppend() {
}
@IterationTimeLimit(0)
public void testSingleAppend(@RangeField("singleTimesRange")
Integer times, @RangeField("appendKindsRange")
SBType sbtype) {
int number = times;
switch (sbtype) {
case APPEND:
result = doAppend(number);
break;
case ARRAY:
result = doArray(number);
break;
case CONCAT:
result = doConcat(number);
break;
case PUSH:
result = doPush(number);
break;
}
result = null;
}
private String doAppend(int limit) {
StringBufferImpl impl = new StringBufferImplAppend();
Object data = impl.createData();
for (int i = 0; i < limit; i++) {
impl.appendNonNull(data, "hello");
}
return impl.toString(data);
}
private String doArray(int limit) {
StringBufferImpl impl = new StringBufferImplArray();
Object data = impl.createData();
for (int i = 0; i < limit; i++) {
impl.appendNonNull(data, "hello");
}
return impl.toString(data);
}
private String doConcat(int limit) {
StringBufferImpl impl = new StringBufferImplConcat();
Object data = impl.createData();
for (int i = 0; i < limit; i++) {
impl.appendNonNull(data, "hello");
}
return impl.toString(data);
}
private String doPush(int limit) {
StringBufferImpl impl = new StringBufferImplPush();
Object data = impl.createData();
for (int i = 0; i < limit; i++) {
impl.appendNonNull(data, "hello");
}
return impl.toString(data);
}
}