-3

当在 Dart 语言中使用 32 位整数在 32 位机器上工作时,我对性能如此巨大的差异感到有点沮丧。

这是否意味着 Dart VM 仍未针对整数运算进行优化?

这是我非常简单的测试。

void main() {
  var tests = new List();
  tests.add({"name" : "16-bit", "result" : 0});
  tests.add({"name" : "32-bit", "result" : 0});
  tests[0]["result"] = test1(0x8000);
  tests[1]["result"] = test1(0x80000000);
  int best;
  for(var test in tests) {
    var result = test["result"];
    if(best == null) {
      best = result;
    } else if(best > result) {
      best = result;
    }
  }

  for(var test in tests) {
    var result = test["result"];
    var percent = (result / best * 100).round();
    print("${test["name"]}: $percent%");
  }
}

int test1(int value) {
  int result = 0;
  var count = 10000000;
  var sw = new Stopwatch();
  sw.start();
  for(var i = 0; i < count; i++) {
    var result = value + i;
  }

  sw.stop();
  return sw.elapsedMicroseconds;
}

输出:

16-bit: 100%
32-bit: 13285%

这意味着在某些real情况下性能可以慢130倍?

4

2 回答 2

4

你的测试有缺陷。test2不能使用 32 位整数,因为数字变大了。

如果您按如下方式修改测试,它们将花费完全相同的时间:

library lexer_perf;

import '_perf.dart';
import 'package:angular/core/parser/lexer.dart';

void main() {
  var tests = new List();
  tests.add({"name" : "16-bit", "result" : 0});
  tests.add({"name" : "32-bit", "result" : 0});
  tests[1]["result"] = test1(0x3fffffff); // 2^30 is the maximum small (32bit) integer value
  tests[0]["result"] = test1(0xffff);
  int best;
  for(var test in tests) {
    var result = test["result"];
    if(best == null) {
      best = result;
    } else if(best > result) {
      best = result;
    }
  }

  for(var test in tests) {
    var result = test["result"];
    var percent = (result / best * 100).round();
    print("${test["name"]}: $percent%");
  }
}

int test1(int value) {
  int result = 0;
  var count = 10000000;
  var sw = new Stopwatch();
  sw.start();
  for(var i = 0; i < count; i++) {
    var result = value - i; // Subtract instead of add so that we do not exceed maximum small integer value.
  }

  sw.stop();
  return sw.elapsedMicroseconds;
}

输出:

16-bit: 122% // Well within margin of error.
32-bit: 100%
于 2014-02-01T09:41:34.910 回答
1

原始问题:“是否可以在 Dart 中编写适用于具有 32 位整数的 32 位机器的高性能代码?”

简短回答:不可以。可以为 31 位整数编写高性能代码,但不能为 32 位整数编写。

为什么?

Dart 没有 32 位整数的概念。

根据 Dart 规范,整数是任意长度的。但是出于性能原因,对于较小的范围有不同的内部表示。问题是small int范围不是 32 位,而是 31 位(在 32 位系统上)。因此,介于[-(2^30+1), -(2^31)]or之间的一切都不再[2^30, 2^31-1]是 a small int,而是medium int64 位的 a。

为了完整起见,完整的范围是:

System          smi      mint     bigint
[32bit system]: 31bit    64bit    limited by RAM
[64bit system]: 63bit    64bit    limited by RAM

来源:https ://www.dartlang.org/articles/numeric-computation/#integers

于 2014-02-02T11:49:24.660 回答