| // Copyright 2014 The Flutter Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| import 'package:flutter/widgets.dart'; |
| |
| import '../common.dart'; |
| |
| const int _kNumIterations = 1000; |
| const int _kNumWarmUp = 100; |
| |
| void main() { |
| final List<String> words = 'Lorem Ipsum is simply dummy text of the printing and' |
| " typesetting industry. Lorem Ipsum has been the industry's" |
| ' standard dummy text ever since the 1500s, when an unknown' |
| ' printer took a galley of type and scrambled it to make a' |
| ' type specimen book'.split(' '); |
| final List<InlineSpanSemanticsInformation> data = <InlineSpanSemanticsInformation>[]; |
| for (int i = 0; i < words.length; i++) { |
| if (i.isEven) { |
| data.add( |
| InlineSpanSemanticsInformation(words[i]), |
| ); |
| } else if (i.isEven) { |
| data.add( |
| InlineSpanSemanticsInformation(words[i], isPlaceholder: true), |
| ); |
| } |
| } |
| print(words); |
| |
| // Warm up lap |
| for (int i = 0; i < _kNumWarmUp; i += 1) { |
| combineSemanticsInfoSyncStar(data); |
| combineSemanticsInfoList(data); |
| } |
| |
| final Stopwatch watch = Stopwatch(); |
| watch.start(); |
| for (int i = 0; i < _kNumIterations; i += 1) { |
| consumeSpan(combineSemanticsInfoSyncStar(data)); |
| } |
| final int combineSemanticsInfoSyncStarTime = watch.elapsedMicroseconds; |
| watch |
| ..reset() |
| ..start(); |
| for (int i = 0; i < _kNumIterations; i += 1) { |
| consumeSpan(combineSemanticsInfoList(data)); |
| } |
| final int combineSemanticsInfoListTime = watch.elapsedMicroseconds; |
| watch |
| ..reset() |
| ..start(); |
| |
| final BenchmarkResultPrinter printer = BenchmarkResultPrinter(); |
| const double scale = 1000.0 / _kNumIterations; |
| printer.addResult( |
| description: 'combineSemanticsInfoSyncStar', |
| value: combineSemanticsInfoSyncStarTime * scale, |
| unit: 'ns per iteration', |
| name: 'combineSemanticsInfoSyncStar_iteration', |
| ); |
| printer.addResult( |
| description: 'combineSemanticsInfoList', |
| value: combineSemanticsInfoListTime * scale, |
| unit: 'ns per iteration', |
| name: 'combineSemanticsInfoList_iteration', |
| ); |
| printer.printToStdout(); |
| } |
| |
| String consumeSpan(Iterable<InlineSpanSemanticsInformation> items) { |
| String result = ''; |
| for (final InlineSpanSemanticsInformation span in items) { |
| result += span.text; |
| } |
| return result; |
| } |
| |
| |
| Iterable<InlineSpanSemanticsInformation> combineSemanticsInfoSyncStar(List<InlineSpanSemanticsInformation> inputs) sync* { |
| String workingText = ''; |
| String? workingLabel; |
| for (final InlineSpanSemanticsInformation info in inputs) { |
| if (info.requiresOwnNode) { |
| yield InlineSpanSemanticsInformation(workingText, semanticsLabel: workingLabel ?? workingText); |
| workingText = ''; |
| workingLabel = null; |
| yield info; |
| } else { |
| workingText += info.text; |
| workingLabel ??= ''; |
| final String? infoSemanticsLabel = info.semanticsLabel; |
| if (infoSemanticsLabel != null) { |
| workingLabel += infoSemanticsLabel; |
| } else { |
| workingLabel += info.text; |
| } |
| } |
| } |
| assert(workingLabel != null); |
| } |
| |
| Iterable<InlineSpanSemanticsInformation> combineSemanticsInfoList(List<InlineSpanSemanticsInformation> inputs) { |
| String workingText = ''; |
| String? workingLabel; |
| final List<InlineSpanSemanticsInformation> result = <InlineSpanSemanticsInformation>[]; |
| for (final InlineSpanSemanticsInformation info in inputs) { |
| if (info.requiresOwnNode) { |
| result.add(InlineSpanSemanticsInformation(workingText, semanticsLabel: workingLabel ?? workingText)); |
| workingText = ''; |
| workingLabel = null; |
| result.add(info); |
| } else { |
| workingText += info.text; |
| workingLabel ??= ''; |
| final String? infoSemanticsLabel = info.semanticsLabel; |
| if (infoSemanticsLabel != null) { |
| workingLabel += infoSemanticsLabel; |
| } else { |
| workingLabel += info.text; |
| } |
| } |
| } |
| assert(workingLabel != null); |
| return result; |
| } |