Performance 浏览器与虚拟机中dart代码的性能

Performance 浏览器与虚拟机中dart代码的性能,performance,browser,dart,Performance,Browser,Dart,我对我的Dart代码在浏览器和Dart虚拟机中的性能感到惊讶。下面是一个简单的例子,再现了这个问题 test('speed test', () { var n = 10000; var rand = Random(0); var x = List.generate(n, (i) => rand.nextDouble()); var res = <num>[]; var sw = Stopwatch()..start(); for

我对我的Dart代码在浏览器和Dart虚拟机中的性能感到惊讶。下面是一个简单的例子,再现了这个问题

test('speed test', () {
    var n = 10000;
    var rand = Random(0);
    var x = List.generate(n, (i) => rand.nextDouble());

    var res = <num>[];
    var sw = Stopwatch()..start();
    for (int i=0; i<1000; i++) {
      for (int j=0; j<n; j++) {
        x[j] += i;
      }
      res.add(x.reduce((a, b) => a + b));
    }
    sw.stop();
    print('Milliseconds: ${sw.elapsedMilliseconds}');
  });
测试('速度测试',(){
var n=10000;
var rand=随机(0);
var x=List.generate(n,(i)=>rand.nextDouble());
var-res=[];
var sw=秒表()…启动();

对于(inti=0;i来说,这有多慢很有趣

相应的JavaScript代码:

(函数(){
“严格使用”;
var n=10000;
var x=[];
var-res=[];
对于(var i=0;ia+b));
}
var t1=Date.now();
log(“毫秒:”+(t1-t0));
}());
只需约20毫秒即可运行

因此,Dart似乎以某种方式触发了其生成的Javascript的“慢模式”

如果查看生成的代码,它包含:

for(i=0;i<1000;++i){
对于(j=0;j<10000;++j){
如果(j>=x.length)
返回H.ioore(x,j);
t1=x[j];
if(类型t1!=“编号”)
返回t1.$add();
C.JSArray_方法$indexSet(x,j,t1+i);
}
C.JSArray_方法。添加$1(res,C.JSArray_方法。减少$1(x,新的A.main_closure0());
}
您可以尝试调整这段代码,但是巨大的成本来自
C.JSArray_方法。$indexSet(x,j,t1+i);
。如果您将其更改为
x[j]=t1+i;
,时间将下降到几百毫秒。因此,这就是当前代码的问题所在

(通过使用
x
a
List
而不是
List
,可以稍微提高性能,约20%。我不知道为什么会有不同,生成的代码几乎相同,
add
闭包使用
checkDouble
来检查类型,而不是
checkNum
,但它们的bo完全相同dy)

您不必避免在浏览器中进行任何计算。您可能需要针对这种缓慢的情况进行一些优化(或者将它们报告给编译器开发人员,因为这可能可以被识别和优化,但目前还没有实现)。例如,您可以将双打列表
x
dart:typed\u data
更改为
Float64List

var x=Float64List.fromList([for(var i=0;i

然后速度增加了很多。

这方面的省道跟踪问题是


这类代码的性能最近有了很大提高,与Dart VM更接近。

浏览器不再允许使用高分辨率计时器来阻止旁道定时攻击。这可能是您看到的原因。