В общем, использование циклов с make не очень "приукрашивает". Makefile - это целый язык, основанный на итерации и рекурсии, поэтому попытка сделать «дополнительную» итерацию внутри рецепта часто избыточна.
Если вам нужно что-то перебрать, большинство , особенно , когда это что-то - файлы, вы должны попытаться работать с make, используя преимущества его целевой / обязательной организации. Выше приведен алгоритм:
$(foreach run:
main.o
diff -q
, который идеально подходит для поведения по умолчанию. Чтобы перевести это в make-файл, вы пишете правило, которое вызывает одну итерацию цикла, а затем используете предварительные условия для его запуска для нужных вам файлов. Примерно так:
TEST_INPUTS := $(wildcard test-*.txt)
.PHONY: autotest $(TEST_INPUTS)
autotest: $(TEST_INPUTS)
$(TEST_INPUTS): test-%.txt: program
[111]lt; $@ test-out.txt
diff -q test-out.txt out-$*.txt
Мало того, что это гораздо более похоже на дизайн, но у него есть и другие преимущества: например, вы можете запустить make test-provided.txt
, и он будет запускать только этот один тест вместо всех тестов.
Вы должны использовать статических шаблонных правил здесь не нормальные шаблонные правила, потому что .PHONY
цели не могут работать с шаблонными правилами.
Изменение строки:
sbuffer.push(‘Data comes here... bla... ’);
кому:
sbuffer[sbuffer.length] = ‘Data comes here... bla... ’;
даст Вам 5-50%-й выигрыш в быстродействии (в зависимости от браузера, в IE - усиление будет самым высоким),
С уважением.
Конкатенация строк JavaScript вопроса имеет принятый ответ, который связывается с очень хорошим сравнением выполнения конкатенации строк JavaScript.
Править: Я думал бы, что Вы могли eek немного больше производительности при помощи устройства Вареного пудинга, как статья предполагает.
Насколько я знаю, Ваш алгоритм хорош и известен как производительное решение проблемы конкатенации строк.
Остерегайтесь IE плохого сборщика "мусора"! Что Вы предполагаете, чтобы сделать с Вашим массивом после использования? Вероятно, это получит GC'd?
Можно получить perfornace при конкатенации с соединениями и затем проиграть на post-GC'ing. С другой стороны, если Вы оставляете массив в объеме все время и НЕ снова используете его, который может быть хорошим решением.
Лично я хотел бы simpliest решение: только использовать + = оператор.
Я думаю, что Вы вполне близко к оптимуму. YMMV, большая скорость получена или потеряна в механизме JavaScript хост-процесса (например, браузер).
Я думаю, что продвижение строк на массив и затем присоединение к массиву являются самой быстрой техникой для конкатенации строк в JavaScript. Существует некоторое доказательство поддержки в этой дискуссии о W3C DOM по сравнению с innerHTML. Отметьте различие между результатами innerHTML 2 и innerHTML 1.
Вы могли бы получить немного больше скорости путем буферизации.