-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

1

元の質問: 「32 ビット整数を使用して 32 ビット マシンで動作する高性能コードを Dart で記述できますか?」

簡単な回答: いいえ。31 ビット整数の高性能コードを作成することはできますが、32 ビット整数は作成できません。

なんで?

Dart には 32 ビット整数の概念がありません。

Dart仕様によると、整数は任意の長さです。ただし、パフォーマンス上の理由から、より小さい範囲には異なる内部表現があります。問題は、small int範囲が 32 ビットではなく 31 ビット (32 ビット システム上) であることです。[-(2^30+1), -(2^31)]したがって、またはの間のすべて[2^30, 2^31-1]は、small intもはや ではなく、medium intであり、64 ビットです。

完全を期すために、全範囲は次のとおりです。

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 に答える