Я хотел бы добавить некоторые дальнейшие примечания в своем ответе. Все другие операционные системы не-Microsoft, которые мы протестировали, не страдают от этой проблемы. Linux, FreeBSD и Mac OS X (этот заключительный на различных аппаратных средствах) все ухудшаются намного более корректно с точки зрения совокупной пропускной способности при перемещении от одного потока до два. Linux, например, ухудшенный от ~45 мебибайт/секунда до ~42 мебибайт/секунда. Эти другие операционные системы должны читать, большие блоки файла между каждым ищут, и для этого не проводящий почти все их время, ожидая на диске для поиска.
Наше решение для Windows состоит в том, чтобы передать эти FILE_FLAG_NO_BUFFERING
флаг к CreateFile
и использовать большой (~16MiB) чтения в каждом вызове к ReadFile
. Это является субоптимальным по нескольким причинам:
(Как заключительный комментарий. Это объясняет, почему свопинг в соответствии с Windows таким образом адский? Т.е., Windows неспособен к выполнению IO в несколько файлов одновременно с любой эффективностью, поэтому в то время как свопинг всех других операций IO вынужден быть непропорционально медленным.)
Редактирование для добавления некоторой более подробной информации для Will Dean:
, Конечно, через эти различные аппаратные конфигурации необработанные числа действительно изменялись (иногда существенно). Проблемой однако является последовательная неисправность в производительности, которую только Windows переносит при перемещении от одного потока до два. Вот сводка протестированных машин:
использование ЦП во всех этих системах было очень низким во время тестов, и антивирус был отключен.
я забыл упоминать прежде, но мы также попробовали нормальный Win32 CreateFile
API FILE_FLAG_SEQUENTIAL_SCAN
набор флага. Этот флаг не решил проблему.
Функция стиля прототипа - хороший вариант, хотя вы также можете рассмотреть что-то вроде:
overlayRegistry = function() {
var overlays = [];
var index = 0;
return {
addOverlay : function(overlay) {
overlays.push(overlay);
count : function() {
return overlays.length;
},
reset : function() {
index = 0;
},
next : function() {
if (index < overlays.length) {
return overlays[index++];
} else {
return null;
}
},
each : function (callback) {
for (var index = 0, length = overlays.length; index < length; ++index) {
callback(overlays[index]);
}
}
}
}();
В этом случае вы можете пошагово перебирать ее, ожидая других событий (как было случай, стоящий за этой структурой)
По сути, предоставление такого метода, как each
, может отлично работать, если все, что вам нужно, это простая итерация, но если вам нужен больший контроль, то что-то вроде приведенного выше будет работать (конечно , вы можете сделать и то, и другое)
Редактировать
Добавлен каждый метод
Вместо этого вы должны использовать для в
.
>>> var customObject = {x: 1, y:2} >>> for (a in customObject) console.log(a, customObject[a]) x 1 y 2
Но помните о унаследованных свойствах.
>>>Object.prototype.yarrr = function yarrr(){ console.warn('YARRR!') } >>> for (a in customObject) console.log(a, customObject[a]) x 1 y 2 yarrr() >>> for (a in customObject) if (customObject.hasOwnProperty(a)) console.log(customObject[a]) x 1 y 2