我们在Dart开发了一个计算密集型的网络应用程序 为了确保我们的计算在所有平台和浏览器中都能很好地运行,我们使用"测试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}');
}
答案 0 :(得分:1)
test
不应该用于基准测试。使用insted https://pub.dartlang.org/packages/benchmark_harness。它有助于应对基准相关的要求,如预热阶段和运行次数,以获得更真实的结果。