Рассмотрим следующий код, который аппроксимирует число пи:
// filename: pi.js
function approx_pi(from, to) {
var pi = 0;
var dx = 0.0000000005;
for(var x = from; x < to; x += dx) {
pi += 4 / (1 + x * x);
}
return pi * dx;
}
var min = Infinity;
var max = -1;
var avg = 0;
for(var itr = 0; itr < 10; ++itr) {
var start = process.hrtime();
var pi = approx_pi(0, 1);
var diff = process.hrtime(start);
var duration = diff[0] + diff[1] * 1e-9;
min = (duration <= min) ? duration : min;
max = (duration >= max) ? duration : max;
avg += duration;
}
avg /= 10;
min = min.toFixed(3);
max = max.toFixed(3);
avg = avg.toFixed(3);
console.log("Time: min = %ss, max = %ss , avg = %ss", min, max, avg);
Также рассмотрите этот код, который запускает файл выше в n дочерних процессах, в то время как n задается через аргументы командной строки:
//filename: children.js
var cp = require('child_process');
var n = parseInt(process.argv[2]);
for(var k = 0; k < n; ++k) {
cp.fork('pi.js');
}
При запуске node pi.js
вывод:
Time: min = 19.113s, max = 22.220s , avg = 21.152s
Аналогичный результат получается при запуске node children.js 1
(что ожидается)
Time: min = 17.323s, max = 21.465s , avg = 19.979s
Вещи начинают становиться странными (по крайней мере, по моим собственным ожиданиям), когда разветвляется более одного ребенка. Вот результат после запуска node children.js 2
:
Time: min = 29.824s, max = 41.050s , avg = 35.136s
Time: min = 30.036s, max = 40.791s , avg = 35.246s
каждому ребенку потребовалось как минимум на 14 секунд больше, чем в одиночных версиях. Еще хуже было при запуске 4 дочерних элементов с node children.js 4
, каждому из них требовалось примерно 37 секунд, чтобы закончить:
Time: min = 55.878s, max = 68.047s , avg = 58.845s
Time: min = 52.760s, max = 69.168s , avg = 58.880s
Time: min = 57.151s, max = 69.113s , avg = 58.956s
Time: min = 50.790s, max = 70.344s , avg = 59.546s
Эти тесты проводились на машине с процессором Core i5 2410M с тактовой частотой 2,30 ГГц (4 ядра, видимые для ОС) и 4 ГБ ОЗУ, с обоими: Windows 7, работающей на узле v4.2.3, и Ubuntu14.04, работающей на узле v5.4.1. Каждая ОС показала, что каждый из дочерних процессов работал на своем собственном ядре и у каждого был одинаковый объем выделенной памяти (около 9 МБ).
Согласно документации узла здесь: "Каждый процесс имеет свою собственную память с их собственные экземпляры V8". Таким образом, можно было бы ожидать, что каждый ребенок должен работать так же хорошо, как отдельный процесс.
Являются ли мои ожидания ошибочными, и это ожидаемое поведение или что происходит?
process.hrtime
вместоDate.now
. Хотя данные не сильно отличались. - person m0stafa   schedule 25.04.2016