blob: 5669374da5b8b15151061cd9bf5c904e0f137014 [file] [log] [blame]
/*
* Copyright 2009 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.reference.microbenchmark.client;
import com.google.gwt.core.client.Duration;
import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.core.client.GWT;
import com.google.gwt.core.client.Scheduler;
import com.google.gwt.core.client.Scheduler.ScheduledCommand;
import com.google.gwt.dom.client.Element;
import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.reference.microbenchmark.client.MicrobenchmarkSurvey.NanoTest;
import com.google.gwt.reference.microbenchmark.client.MicrobenchmarkSurvey.WidgetMaker;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.uibinder.client.UiHandler;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.DeckPanel;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.HTMLPanel;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.SimplePanel;
import com.google.gwt.user.client.ui.UIObject;
import com.google.gwt.user.client.ui.Widget;
import java.util.ArrayList;
import java.util.List;
/**
* Offers up a selection of {@link Microbenchmark} implementations to run.
*/
public class Microbenchmarks implements EntryPoint {
interface Binder extends UiBinder<Widget, Microbenchmarks> {}
private static final Binder BINDER = GWT.create(Binder.class);
private final Microbenchmark[] benchmarks;
double elapsedMs = 0;
@UiField ListBox listBox;
@UiField DeckPanel deck;
@UiField Button button;
@UiField Element running;
@UiField Element runs;
@UiField Element sum;
public Microbenchmarks() {
// Add entries for new widget benchmarks here.
List<NanoTest> widgetMakers = new ArrayList<NanoTest>();
widgetMakers.add(new WidgetMaker("SimplePanel") {
@Override
public Widget make() {
return new SimplePanel();
}
});
widgetMakers.add(new WidgetMaker("FlowPanel") {
@Override
public Widget make() {
return new FlowPanel();
}
});
widgetMakers.add(new WidgetMaker("HTMLPanel") {
@Override
public Widget make() {
return new HTMLPanel("");
}
});
widgetMakers.add(new EmptyBinder.Maker());
widgetMakers.add(new TestEmptyDomViaApi.Maker());
widgetMakers.add(new TestEmptyDom.Maker());
widgetMakers.add(new TestEmptyCursorDomCrawl.Maker());
widgetMakers.add(new TestEmptyRealisticDomCrawl.Maker());
widgetMakers.add(new TestDomViaApi.Maker());
widgetMakers.add(new TestDomInnerHtmlById.Maker());
if (Util.hasQSA) {
widgetMakers.add(new TestDomInnerHtmlQuerySelectorAll.Maker());
}
widgetMakers.add(new TestCursorDomCrawl.Maker());
widgetMakers.add(new TestRealisticDomCrawl.Maker());
widgetMakers.add(new TestDomBinder.Maker());
widgetMakers.add(new TestFlows.Maker());
widgetMakers.add(new TestManualHTMLPanel.Maker());
widgetMakers.add(new TestWidgetBinder.Maker());
// Add entries for table creation benchmarks here.
List<NanoTest> tableMakers = new ArrayList<NanoTest>();
tableMakers.add(new TestCreateTableInnerHtml.Maker());
tableMakers.add(new TestCreateTablePrecreatedInnerHtml.Maker());
tableMakers.add(new TestCreateTableDom.Maker());
tableMakers.add(new TestCreateTableDomWithEvents.Maker());
// Add entries for table update benchmarks here.
List<NanoTest> tableUpdaters = new ArrayList<NanoTest>();
tableUpdaters.add(new TestCreateTableInnerHtml.Updater());
tableUpdaters.add(new TestCreateTablePrecreatedInnerHtml.Updater());
tableUpdaters.add(new TestCreateTableDom.Updater());
tableUpdaters.add(new TestCreateTableDomWithEvents.Updater());
// Combine all table tests.
List<NanoTest> allTableTests = new ArrayList<MicrobenchmarkSurvey.NanoTest>();
allTableTests.addAll(tableMakers);
allTableTests.addAll(tableUpdaters);
benchmarks = new Microbenchmark[4];
benchmarks[0] = new MicrobenchmarkSurvey("Widget Creation Survey", widgetMakers);
benchmarks[1] = new MicrobenchmarkSurvey("Table Creation and Update Survey", allTableTests);
benchmarks[2] = new MicrobenchmarkSurvey("Table Creation Survey", tableMakers);
benchmarks[3] = new MicrobenchmarkSurvey("Table Update Survey", tableUpdaters);
}
@UiHandler("listBox")
public void onChange(@SuppressWarnings("unused") ChangeEvent ignored) {
int index = listBox.getSelectedIndex();
deck.showWidget(index);
}
@UiHandler("button")
public void onClick(@SuppressWarnings("unused") ClickEvent ignored) {
final int index = listBox.getSelectedIndex();
UIObject.setVisible(running, true);
button.setEnabled(false);
Scheduler.get().scheduleDeferred(new ScheduledCommand() {
public void execute() {
double start = Duration.currentTimeMillis();
benchmarks[index].run();
double end = Duration.currentTimeMillis();
UIObject.setVisible(running, false);
button.setEnabled(true);
double run = end - start;
runs.setInnerText(runs.getInnerText() + Util.format(run) + " ");
elapsedMs += run;
sum.setInnerText("(" + Util.format(elapsedMs) + ")");
}
});
}
public void onModuleLoad() {
Widget root = BINDER.createAndBindUi(this);
for (Microbenchmark benchmark : benchmarks) {
listBox.addItem(benchmark.getName());
deck.add(benchmark.getWidget());
}
deck.showWidget(0);
RootPanel.get().add(root);
}
}