From 12f867ca9856749c164f12df4bbbdc6330921fac Mon Sep 17 00:00:00 2001 From: Seigo Nonaka Date: Thu, 8 Mar 2018 09:15:46 -0800 Subject: [PATCH] Add selectable text view perf test for random text The performance characteristics are quite different if selection is enabled. Good to add selectable random text case for reference. This CL also fixes makeMeasureSpec miss usage. android.widget.TextViewPrecomputedTextPerfTest: newLayout_PrecomputedText : 758,899 newLayout_PrecomputedText_Selectable: 17,923,065 newLayout_RandomText : 17,059,504 newLayout_RandomText_Selectable : 18,523,234 onDraw_PrecomputedText : 4,097,640 onDraw_PrecomputedText_Selectable : 17,733,448 onDraw_RandomText : 17,941,208 onDraw_RandomText_Selectable : 18,948,912 onMeasure_PrecomputedText : 781,546 onMeasure_PrecomputedText_Selectable: 18,423,652 onMeasure_RandomText : 18,067,749 onMeasure_RandomText_Selectable : 19,364,439 setText_PrecomputedText : 91,383 setText_PrecomputedText_Selectable : 161,088 setText_RandomText : 11,142 setText_RandomText_Selectable : 54,596 Bug: 72998298 Test: N/A Change-Id: I8c04fd972897eb804be42adff883df13d87bf11e --- .../TextViewPrecomputedTextPerfTest.java | 115 +++++++++++++++--- 1 file changed, 100 insertions(+), 15 deletions(-) diff --git a/apct-tests/perftests/core/src/android/widget/TextViewPrecomputedTextPerfTest.java b/apct-tests/perftests/core/src/android/widget/TextViewPrecomputedTextPerfTest.java index 55b97e7675fd2..dc34b7fe057cb 100644 --- a/apct-tests/perftests/core/src/android/widget/TextViewPrecomputedTextPerfTest.java +++ b/apct-tests/perftests/core/src/android/widget/TextViewPrecomputedTextPerfTest.java @@ -116,6 +116,26 @@ public class TextViewPrecomputedTextPerfTest { } } + @Test + public void testNewLayout_RandomText_Selectable() { + final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + BoringLayout.Metrics metrics = new BoringLayout.Metrics(); + while (state.keepRunning()) { + state.pauseTiming(); + final CharSequence text = mTextUtil.nextRandomParagraph(WORD_LENGTH, NO_STYLE_TEXT); + final TextView textView = new TextView(getContext()); + textView.setTextIsSelectable(true); + textView.setBreakStrategy(Layout.BREAK_STRATEGY_BALANCED); + textView.setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NORMAL); + textView.setText(text); + Canvas.freeTextLayoutCaches(); + state.resumeTiming(); + + textView.makeNewLayout(TEXT_WIDTH, TEXT_WIDTH, UNKNOWN_BORING, UNKNOWN_BORING, + TEXT_WIDTH, false); + } + } + @Test public void testNewLayout_PrecomputedText() { final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); @@ -178,6 +198,24 @@ public class TextViewPrecomputedTextPerfTest { } } + @Test + public void testSetText_RandomText_Selectable() { + final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + BoringLayout.Metrics metrics = new BoringLayout.Metrics(); + while (state.keepRunning()) { + state.pauseTiming(); + final CharSequence text = mTextUtil.nextRandomParagraph(WORD_LENGTH, NO_STYLE_TEXT); + final TextView textView = new TextView(getContext()); + textView.setTextIsSelectable(true); + textView.setBreakStrategy(Layout.BREAK_STRATEGY_BALANCED); + textView.setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NORMAL); + Canvas.freeTextLayoutCaches(); + state.resumeTiming(); + + textView.setText(text); + } + } + @Test public void testSetText_PrecomputedText() { final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); @@ -222,8 +260,8 @@ public class TextViewPrecomputedTextPerfTest { @Test public void testOnMeasure_RandomText() { final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); - int width = MeasureSpec.makeMeasureSpec(MeasureSpec.AT_MOST, TEXT_WIDTH); - int height = MeasureSpec.makeMeasureSpec(MeasureSpec.UNSPECIFIED, 0); + int width = MeasureSpec.makeMeasureSpec(TEXT_WIDTH, MeasureSpec.AT_MOST); + int height = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED); while (state.keepRunning()) { state.pauseTiming(); final CharSequence text = mTextUtil.nextRandomParagraph(WORD_LENGTH, NO_STYLE_TEXT); @@ -239,11 +277,32 @@ public class TextViewPrecomputedTextPerfTest { } } + @Test + public void testOnMeasure_RandomText_Selectable() { + final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + int width = MeasureSpec.makeMeasureSpec(TEXT_WIDTH, MeasureSpec.AT_MOST); + int height = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED); + while (state.keepRunning()) { + state.pauseTiming(); + final CharSequence text = mTextUtil.nextRandomParagraph(WORD_LENGTH, NO_STYLE_TEXT); + final TestableTextView textView = new TestableTextView(getContext()); + textView.setTextIsSelectable(true); + textView.setBreakStrategy(Layout.BREAK_STRATEGY_BALANCED); + textView.setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NORMAL); + textView.setText(text); + textView.nullLayouts(); + Canvas.freeTextLayoutCaches(); + state.resumeTiming(); + + textView.onMeasure(width, height); + } + } + @Test public void testOnMeasure_PrecomputedText() { final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); - int width = MeasureSpec.makeMeasureSpec(MeasureSpec.AT_MOST, TEXT_WIDTH); - int height = MeasureSpec.makeMeasureSpec(MeasureSpec.UNSPECIFIED, 0); + int width = MeasureSpec.makeMeasureSpec(TEXT_WIDTH, MeasureSpec.AT_MOST); + int height = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED); while (state.keepRunning()) { state.pauseTiming(); final PrecomputedText.Params params = new PrecomputedText.Params.Builder(PAINT) @@ -265,8 +324,8 @@ public class TextViewPrecomputedTextPerfTest { @Test public void testOnMeasure_PrecomputedText_Selectable() { final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); - int width = MeasureSpec.makeMeasureSpec(MeasureSpec.AT_MOST, TEXT_WIDTH); - int height = MeasureSpec.makeMeasureSpec(MeasureSpec.UNSPECIFIED, 0); + int width = MeasureSpec.makeMeasureSpec(TEXT_WIDTH, MeasureSpec.AT_MOST); + int height = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED); while (state.keepRunning()) { state.pauseTiming(); final PrecomputedText.Params params = new PrecomputedText.Params.Builder(PAINT) @@ -289,8 +348,8 @@ public class TextViewPrecomputedTextPerfTest { @Test public void testOnDraw_RandomText() { final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); - int width = MeasureSpec.makeMeasureSpec(MeasureSpec.AT_MOST, TEXT_WIDTH); - int height = MeasureSpec.makeMeasureSpec(MeasureSpec.UNSPECIFIED, 0); + int width = MeasureSpec.makeMeasureSpec(TEXT_WIDTH, MeasureSpec.AT_MOST); + int height = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED); final RenderNode node = RenderNode.create("benchmark", null); while (state.keepRunning()) { state.pauseTiming(); @@ -299,8 +358,34 @@ public class TextViewPrecomputedTextPerfTest { textView.setBreakStrategy(Layout.BREAK_STRATEGY_BALANCED); textView.setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NORMAL); textView.setText(text); + textView.measure(width, height); + textView.layout(0, 0, textView.getMeasuredWidth(), textView.getMeasuredHeight()); + final DisplayListCanvas c = node.start( + textView.getMeasuredWidth(), textView.getMeasuredHeight()); textView.nullLayouts(); - textView.onMeasure(width, height); + Canvas.freeTextLayoutCaches(); + state.resumeTiming(); + + textView.onDraw(c); + } + } + + @Test + public void testOnDraw_RandomText_Selectable() { + final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + int width = MeasureSpec.makeMeasureSpec(TEXT_WIDTH, MeasureSpec.AT_MOST); + int height = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED); + final RenderNode node = RenderNode.create("benchmark", null); + while (state.keepRunning()) { + state.pauseTiming(); + final CharSequence text = mTextUtil.nextRandomParagraph(WORD_LENGTH, NO_STYLE_TEXT); + final TestableTextView textView = new TestableTextView(getContext()); + textView.setTextIsSelectable(true); + textView.setBreakStrategy(Layout.BREAK_STRATEGY_BALANCED); + textView.setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NORMAL); + textView.setText(text); + textView.measure(width, height); + textView.layout(0, 0, textView.getMeasuredWidth(), textView.getMeasuredHeight()); final DisplayListCanvas c = node.start( textView.getMeasuredWidth(), textView.getMeasuredHeight()); textView.nullLayouts(); @@ -314,8 +399,8 @@ public class TextViewPrecomputedTextPerfTest { @Test public void testOnDraw_PrecomputedText() { final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); - int width = MeasureSpec.makeMeasureSpec(MeasureSpec.AT_MOST, TEXT_WIDTH); - int height = MeasureSpec.makeMeasureSpec(MeasureSpec.UNSPECIFIED, 0); + int width = MeasureSpec.makeMeasureSpec(TEXT_WIDTH, MeasureSpec.AT_MOST); + int height = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED); final RenderNode node = RenderNode.create("benchmark", null); while (state.keepRunning()) { state.pauseTiming(); @@ -327,8 +412,8 @@ public class TextViewPrecomputedTextPerfTest { final TestableTextView textView = new TestableTextView(getContext()); textView.setTextMetricsParams(params); textView.setText(text); - textView.nullLayouts(); - textView.onMeasure(width, height); + textView.measure(width, height); + textView.layout(0, 0, textView.getMeasuredWidth(), textView.getMeasuredHeight()); final DisplayListCanvas c = node.start( textView.getMeasuredWidth(), textView.getMeasuredHeight()); textView.nullLayouts(); @@ -356,8 +441,8 @@ public class TextViewPrecomputedTextPerfTest { textView.setTextIsSelectable(true); textView.setTextMetricsParams(params); textView.setText(text); - textView.nullLayouts(); - textView.onMeasure(width, height); + textView.measure(width, height); + textView.layout(0, 0, textView.getMeasuredWidth(), textView.getMeasuredHeight()); final DisplayListCanvas c = node.start( textView.getMeasuredWidth(), textView.getMeasuredHeight()); textView.nullLayouts();