2014-02-01 4 views
-3

Я был немного обескуражен такой огромной разницей в производительности при работе на 32-битных машинах с 32-разрядными целыми числами на языке Dart.Можно ли написать в 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 раз?

+0

Ваш тест, если недостатки. 'test2' не может использовать 32-битные целые числа, так как число становится большим. – ronag

+1

Я думаю, что программисты, которые не понимают, когда и что происходит, когда числа превышают лимит, являются «неправильными для программистов». – ronag

+0

Я бы сказал тем программистам, что Дарт не может быть подходящим инструментом для работы, если у них такие ОЧЕНЬ особые требования. Я не уверен, в какой момент вы пытаетесь сделать свое разглашение ... – ronag

ответ

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% 
1

Оригинальный вопрос: «Можно ли писать в Дарта высокий код производительности который работает на 32-битных машинах с 32-разрядными целыми числами? "

Краткий ответ: Нет. Можно написать высокопроизводительный код для 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