【问题标题】:Performance testing in dart using test 0.12.15+3 lib使用 test 0.12.15+3 lib 在 dart 中进行性能测试
【发布时间】:2016-08-12 12:55:33
【问题描述】:

我们在 Dart 中开发了一个计算密集型网络应用程序。
为了确保我们的计算在所有平台和浏览器上都表现良好,我们使用“test 0.12.15+3”包运行基准测试。但是,我们发现在某些情况下,执行相同代码的差异会相差几个数量级。下面是演示问题的代码(使用自定义比较器对数组进行排序)。

我想知道在 chrome 中执行的代码与选择 chrome 作为平台的测试之间的时间差异是否有解释(pub run test -p chrome test/perf_test.dart)? 通过测试包进行基准测试是一个可行的选择,还是我们应该寻找其他地方?

import 'package:quiver/iterables.dart' as it;
void main(){
 Stopwatch sw = new Stopwatch();
 int len = 1000000;//0000
 num v = 0;
 List ln0 = new List();
 for(int i = 0; i < len; i++)
  ln0.add(v++);
 //T1
 sw..reset()..start();
 ln0.sort((x,y) => x - y);
 sw..stop();
 print('Num Comparator take, mcs: ${sw.elapsedMicroseconds}');
 //T2
 List ln1= it.range(len).toList();
 sw..reset()..start();
 ln1.sort((x,y) => x - y);
 print('Suddenly, Num Comparator take, mcs: ${sw.elapsedMicroseconds}');

 //T3
 List li2 = it.range(len).map((numm)=>numm.toInt()).toList();
 sw..reset()..start();
 li2.sort((x,y)=>x - y);
 sw..stop();
 print('Int Comparator take, mcs: ${sw.elapsedMicroseconds}');

 List<String> items = new List(len);
 for(int i =0, len = items.length; i<len; i++){
  List tl = ['a','b','c','d','e','f','g','h','i','j','']..shuffle();
  items[i] = tl.join('');
 }

 Function _comparer = (String s1, String s2) {
  if (s1 == null && s2 == null) return 0;
  if (s1 == null) return 1;
  if (s2 == null) return -1;
  if (s1 == '' && s2 == '') return 0;
  if (s1 == '') return 1;
  if (s2 == '') return -1;
  return s1.compareTo(s2);
 };
 //T4
 List ls1 = new List.from(items);
 sw..reset()..start();
 ls1.sort((s1, s2) => s1.compareTo(s2));
 sw..stop();
 print('Standart String comparator take, mcs: ${sw.elapsedMicroseconds}');

 //T5
 List ls2 = new List.from(items);
 sw..reset()..start();
 ls2.sort(_comparer);
 sw..stop();
 print('String comparator(miss null,empty) take, mcs:    ${sw.elapsedMicroseconds}');
 }

【问题讨论】:

  • 这里以 dartium 为基础的结果比率:*header |在 dartium 中作为测试运行|在 chrome 中作为测试运行|在 chrome 浏览器中运行 |在 dartium 浏览器中运行 *num 1,0 | 229,5 | 0,9 |1 *int 1,0 | 9,4 | 1,0 |1 *字符串 1,3 | 3,4 | 0,8 |1

标签: dart performance-testing


【解决方案1】:

test 不应该用于基准测试。使用 insted https://pub.dartlang.org/packages/benchmark_harness。它有助于满足与基准相关的要求,例如预热阶段和运行次数,以获得更真实的结果。

【讨论】:

  • 谢谢,你是对的 benchmark_harness 将提供更精确的结果。但是harness 没有在不同平台上启动的选项,因此我们不能避免为此使用测试包。使用带有选项的测试包从命令行启动 benchmark_harness:-p chrome 产生几乎相同的结果((。看起来测试包有问题。
  • 您尝试过-j0concurrency=0 吗? github.com/dart-lang/test/blob/…
  • 使用选项 j0,测试根本不运行,也许你的意思是 j1。刚刚使用此选项 j1 进行了测试,它对结果没有影响。差异仍然太大,特别是对于测试 T2 中的 num (慢 200 倍)。也玩 j5 ...j10 并且只运行一个测试(对于 nums)给出几乎相同的结果。再次感谢您的建议。我预计正确配置 test 或 pub run 命令可以解决什么问题,但我不知道如何解决。
  • 正确j1:D。也许在dart-lang/test Github 存储库中创建一个带有此问题链接的问题可能会引起合适的人的注意。
  • 有关 Dart 基准测试和 benchmark_harness 工具的真正有价值的信息,我建议阅读 Dart 开发人员 mraleph 的文章 Micro​benchmarking Dart。这篇文章解释了为什么当前状态下的工具会给出不可靠的结果,并展示了它正在开发的 benchmark_harness 软件包的新版本,我相信它将在未来取代当前版本。此信息通常适用于微基准测试
猜你喜欢
  • 2014-11-27
  • 2014-10-02
  • 2015-06-30
  • 2015-10-10
  • 2013-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多