Лучший способ кодировать итератор в JavaScript

Я хотел бы добавить некоторые дальнейшие примечания в своем ответе. Все другие операционные системы не-Microsoft, которые мы протестировали, не страдают от этой проблемы. Linux, FreeBSD и Mac OS X (этот заключительный на различных аппаратных средствах) все ухудшаются намного более корректно с точки зрения совокупной пропускной способности при перемещении от одного потока до два. Linux, например, ухудшенный от ~45 мебибайт/секунда до ~42 мебибайт/секунда. Эти другие операционные системы должны читать, большие блоки файла между каждым ищут, и для этого не проводящий почти все их время, ожидая на диске для поиска.

Наше решение для Windows состоит в том, чтобы передать эти FILE_FLAG_NO_BUFFERING флаг к CreateFile и использовать большой (~16MiB) чтения в каждом вызове к ReadFile. Это является субоптимальным по нескольким причинам:

  • Файлы не становятся кэшируемыми, когда считано как это, таким образом, нет ни одного из преимуществ, которые обычно дает кэширование.
  • ограничения при работе с этим флагом намного более сложны, чем нормальное чтение (выравнивание буферов чтения для подкачки страниц границ, и т.д.).

(Как заключительный комментарий. Это объясняет, почему свопинг в соответствии с Windows таким образом адский? Т.е., Windows неспособен к выполнению IO в несколько файлов одновременно с любой эффективностью, поэтому в то время как свопинг всех других операций IO вынужден быть непропорционально медленным.)

Редактирование для добавления некоторой более подробной информации для Will Dean:

, Конечно, через эти различные аппаратные конфигурации необработанные числа действительно изменялись (иногда существенно). Проблемой однако является последовательная неисправность в производительности, которую только Windows переносит при перемещении от одного потока до два. Вот сводка протестированных машин:

  • Несколько рабочих станций Dell (Intel Xeon) различных возрастов, выполняющих Windows 2000, Windows XP (32-разрядный), и Windows XP (64-разрядный) с единственным диском.
  • А сервер Dell 1U (Intel Xeon) рабочий Windows Server 2003 (64-разрядный) с RAID 1+0.
  • рабочая станция HP (AMD Opteron) с (64-разрядным) Windows XP, и Windows Server 2003 и аппаратные средства RAID 5.
  • Мой домашний ПК без клейма (AMD Athlon64), выполняющий (32-разрядный) Windows XP, (64-разрядный) FreeBSD, и Linux (64-разрядный) с единственным диском.
  • Мой домашний MacBook (Intel Core1) под управлением Mac OS X, единственный диск SATA.
  • Мое домашнее Koolu пк, запускающий Linux. Весьма недостаточно мощный по сравнению с другими системами, но я продемонстрировал, что даже эта машина может превзойти Windows Server по характеристикам с RAID5 при выполнении многопоточного чтения с диска.

использование ЦП во всех этих системах было очень низким во время тестов, и антивирус был отключен.

я забыл упоминать прежде, но мы также попробовали нормальный Win32 CreateFile API FILE_FLAG_SEQUENTIAL_SCAN набор флага. Этот флаг не решил проблему.

5
задан jfs 16 October 2009 в 23:24
поделиться

2 ответа

Функция стиля прототипа - хороший вариант, хотя вы также можете рассмотреть что-то вроде:

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 , может отлично работать, если все, что вам нужно, это простая итерация, но если вам нужен больший контроль, то что-то вроде приведенного выше будет работать (конечно , вы можете сделать и то, и другое)

Редактировать
Добавлен каждый метод

6
ответ дан 14 December 2019 в 08:55
поделиться

Вместо этого вы должны использовать для в .

>>> 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
1
ответ дан 14 December 2019 в 08:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: