Измерение и тестирование производительности процессора javascript в браузере - PullRequest
3 голосов
/ 20 августа 2011

Какой точный способ измерить производительность движка javascript, такого как v8 или spidermonkey?По крайней мере, он должен иметь не очень большие отклонения от одной оценки и другой, возможно, позволять ранжировать различные движки javascript в разных операционных системах и на разных аппаратных конфигурациях.

Моя первая попытка была на веб-странице, где ничего не былоэто, я загрузил эту страницу в веб-браузерах.Затем я попытался выполнить этот код в консоли JavaScript Google Chrome, и он получился совсем другим, как вы увидите в результатах:

mean = function (distr) {
    var sum = 0;
    for (obs in distr) {
        sum += distr[obs];
    };
    return sum / distr.length;
};

stdev = function (distr,mean) {
    var diffsquares = 0;
    for (obs in distr) {
        diffsquares += Math.pow(distr[obs] - mean , 2);
    };
    return Math.sqrt((diffsquares / distr.length));
};


var OPs = 1000000;

var results = [];
for (var t = 0; t < 60; t++) {
    var start = (new Date()).getTime();
    for(var i = 0.5; i < OPs; i++){
        i++;
    }
    var end = (new Date()).getTime();
    var took = end - start;
    var FLOPS = OPs/took;
    results.push(FLOPS);
};

average = mean(results);
deviation = stdev(results,average);

console.log('Average: '+average+' FLOPS. Standart deviation: '+deviation+' FLOPS');

И он ответил:

NodeJS 0.5.0

  1. Среднее: 74607,30446024566 ФЛОП.Стандартное отклонение: 4129,4008527666265 FLOPS
  2. Среднее: 73974,89765136827 FLOPS.Стандартное отклонение: 4574,367360870471 FLOPS
  3. Среднее: 73923,55086434036 FLOPS.Стандартное отклонение: 5768,396926072297 FLOPS

Chrome 13.0.782.112 (из консоли (Ctrl + Shift + J))

  1. Среднее: 1183.409340319158 FLOPS.Стандартное отклонение: 24,463468674550658 FLOPS
  2. Среднее: 1026,8727431432026 FLOPS.Стандартное отклонение: 18.32394087291766 ФЛОП
  3. Среднее: 1063.7000331534252 ФЛОП.Стандартное отклонение: 22,928786803808094 FLOPS

Chrome 13.0.782.112 (как веб-страница)

  1. Среднее: 47547.03408688914 FLOPS.Стандартное отклонение: 4064,7464541422833 FLOPS
  2. Среднее: 49273,65762892078 FLOPS.Стандартное отклонение: 1553,1720207400576 FLOPS
  3. Среднее: 47849,72703247966 FLOPS.Стандартное отклонение: 3445,930694070375 FLOPS

Firefox 6,0

  1. Среднее: 62626,63398692811 FLOPS.Стандартное отклонение: 3543,4801728588277 FLOPS
  2. Среднее: 85572,76057276056 FLOPS.Стандартное отклонение: 4336,354514715926 FLOPS
  3. Среднее: 63780.19323671495 FLOPS.Стандартное отклонение: 3323,648677036589 FLOPS

Opera 11.50

  1. Среднее: 38462.49044165712 FLOPS.Стандартное отклонение: 2438,527900104241 FLOPS
  2. Среднее: 37968,736460671964 FLOPS.Стандартное отклонение: 2186,9271687271607 ФЛОП
  3. Среднее: 38638,1851173518 ФЛОП.Стандартное отклонение: 1677,6876987114347 ШАГИ

Произошло что-то странное.Тестирование в Chrome на консоли заняло намного больше времени, чем в других браузерах и NodeJS.Я имею в виду что-то вроде 30 секунд на Chrome против 2 на других.Стандартные отклонения в Chrome на консоли также очень малы по сравнению с другими.Почему такая огромная разница между выполнением кода на консоли и выполнением кода на веб-странице?

Если это слишком глупо, напомню, что я «выучил» javascript (и вообще кодировать) сам ине так давно, поэтому я много сосу.

Что хорошего в этом?Я хотел бы сосредоточиться на скорости математических операций, а не на других вещах, таких как скорость регулярных выражений.Что вы рекомендуете?Я также попытался сгенерировать матрицы 10x10 чисел с плавающей точкой и умножить их много раз, результат приходит каждый раз, когда 7, 8 или 9 М FLOPS, но в основном это 7 в Chrome, если это совсем не глупо, и кто-то хочет код, который яЯ счастлив вставить его.

Ответы [ 2 ]

7 голосов
/ 20 августа 2011

Оптимизация производительности JS вообще огромная область, и довольно амбициозно начинать с нуля.

На вашем месте я бы взглянул на некоторые существующие проекты в этой области:

  • Benchmark.js обрабатывает биты синхронизации и анализа статистики (усреднение, вычислительная дисперсия).
  • JSPerf позволяет любому создавать и запускать тесты, а затемпосмотрите на результаты для любого браузера.Там есть большое хранилище тестов, которое вы можете просмотреть.
  • BrowserScope - это хранилище результатов для тестов JSPerf и отслеживает результаты для каждого UA.
0 голосов
/ 20 августа 2011

Консоль Chrome имеет «странную» среду исполнения, которая не совсем сама веб-страница и, по-моему, влечет за собой некоторые затраты производительности. Это, безусловно, верно для консоли в Firefox.

Чтобы ответить на ваш первоначальный вопрос ... это действительно зависит от того, что вы хотите измерить. Различные движки JS хороши в разных вещах, поэтому в зависимости от тестовой программы Chrome может быть в 5 раз быстрее, чем, скажем, Firefox или наоборот.

Кроме того, JIT браузера для оптимизации могут очень сильно зависеть от общего потока кода, поэтому время, необходимое для выполнения операции A, сопровождаемой операцией B, в общем случае не совпадает с суммой времени, необходимого для выполнения A и B отдельно (может быть намного больше или меньше). В результате сравнительный анализ всего, кроме кода, который вы на самом деле хотите запустить, имеет очень ограниченную полезность. Выполнение любого фрагмента кода практически бесполезно для «ранжирования веб-браузеров по производительности».

...