Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(443)

Unified Diff: third_party/WebKit/PerformanceTests/Layout/resources/line-layout-perf-test.js

Issue 2284113003: Add performance tests for long words/lines (Closed)
Patch Set: eae review Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/PerformanceTests/Layout/resources/line-layout-perf-test.js
diff --git a/third_party/WebKit/PerformanceTests/Layout/resources/line-layout-perf-test.js b/third_party/WebKit/PerformanceTests/Layout/resources/line-layout-perf-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..286b4bf791fe5b244238ab8d937334476b664145
--- /dev/null
+++ b/third_party/WebKit/PerformanceTests/Layout/resources/line-layout-perf-test.js
@@ -0,0 +1,110 @@
+'use strict';
+
+class LineLayoutPerfTest {
+ constructor(container) {
+ this.container = container;
+ this.spanCount = 0;
+ this.lineCount = 10000;
+ this.wordCountPerLine = 20;
+ this.uniqueWordCount = 100;
+ this.wordLength = 8;
+ this.wordSeparator = ' ';
+ }
+
+ run(description) {
+ // Unblock onload event by scheduling with zero delay,
+ // in order to avoid perf bot flakiness where the bot checks
+ // for timeouts reaching onload event, see crbug.com/457194
+ window.setTimeout(() => {
+ PerfTestRunner.measureTime({
+ description: description,
+ run: this.measure.bind(this)
+ });
+ }, 0);
+ }
+
+ measure() {
+ var fragment = this.createFragment();
+ PerfTestRunner.forceLayout();
+
+ var now = PerfTestRunner.now();
+ this.container.appendChild(fragment);
+ PerfTestRunner.forceLayout();
+ var resultTime = PerfTestRunner.now() - now;
+
+ while (this.container.firstChild)
+ this.container.removeChild(this.container.lastChild);
+ return resultTime;
+ }
+
+ createFragment() {
+ return TextGenerator.createFragment(this.spanCount, this.lineCount,
+ this.wordCountPerLine, this.wordSeparator,
+ this.createWordGenerator());
+ }
+
+ createWordGenerator() {
+ return TextGenerator.createWordPoolGenerator(this.uniqueWordCount, this.wordLength);
+ }
+}
+
+class LongWordPerfTest extends LineLayoutPerfTest {
+ constructor(container, wordLength) {
+ super(container);
+ this.lineCount = 1;
+ this.wordCountPerLine = 1;
+ this.wordLength = wordLength;
+ }
+
+ createWordGenerator() {
+ return () => TextGenerator.createWord(this.wordLength);
+ }
+}
+
+class TextGenerator {
+ static createFragment(spanCount, lineCount, wordCountPerLine, wordSeparator, nextWord) {
+ if (spanCount <= 0)
+ return document.createTextNode(TextGenerator.createLines(lineCount, wordCountPerLine, wordSeparator, nextWord));
+
+ var fragment = document.createDocumentFragment();
+ for (var elementIndex = 0; elementIndex < spanCount; elementIndex++) {
+ var child = document.createElement('span');
+ child.textContent = TextGenerator.createLines(lineCount, wordCountPerLine, wordSeparator, nextWord);
+ fragment.appendChild(child);
+ }
+ return fragment;
+ }
+
+ static createLines(lineCount, wordCountPerLine, wordSeparator, nextWord) {
+ var lines = [];
+ for (var lineIndex = 0; lineIndex < lineCount; lineIndex++)
+ lines.push(this.createLine(wordCountPerLine, wordSeparator, nextWord));
+ return lines.join('\n');
+ }
+
+ static createLine(wordCountPerLine, wordSeparator, nextWord) {
+ let words = [];
+ for (var wordIndex = 0; wordIndex < wordCountPerLine; wordIndex++)
+ words.push(nextWord());
+ return words.join(wordSeparator);
+ }
+
+ static createWordPoolGenerator(wordCount, wordLength) {
+ var words = [];
+ for (var i = 0; i < wordCount; i++)
+ words.push(TextGenerator.createWord(wordLength));
+ return () => {
+ return words[Math.floor(Math.random() * words.length)];
+ };
+ }
+
+ static createWord(length) {
+ var pieces = [];
+ while (length > 0) {
+ var piece = Math.random().toString(36).slice(2);
+ pieces.push(piece.slice(0, length));
+ length -= piece.length;
+ }
+ return pieces.join('');
+ }
+}

Powered by Google App Engine
This is Rietveld 408576698