Результат кэшируется во 2-м примере, он имеет мало общего с методом «метапрограммирования» (или, точнее, с отсутствием цикла).
Это не так простопрямо доказать с помощью JavaScript;в скомпилированном языке вы обычно просто смотрите на сборку и видите, что компилятор пытался быть каким-то хитрым и оптимизировать ваш цикл внутри таймера.Среда выполнения JS, очевидно, более непрозрачна и сложна, выходные данные не так легко доступны.Вместо этого вы можете проверить его по доверенности, наблюдая за поведением различных, но эквивалентных форм, чтобы увидеть, что вызывает предварительную оптимизацию.
Следующие небольшие изменения вашей функции "mean2" избегают оптимизации кэширования в nodejs (v8) во время тестирования:
Назначить переменной области действия перед возвратом:
const mean2 = (function (A) {
return new Function('A', `
let sum = (${new Array(A.length).fill(null).map(function (_, i) {
return `A[${i}]`
}).join('+')}) / ${A.length};
return sum;
`)
})(A)
Использовать A.length
ссылку вместо литерала:
const mean2 = (function (A) {
return new Function('A', `
return (${new Array(A.length).fill(null).map(function (_, i) {
return `A[${i}]`
}).join('+')}) / A.length
`)
})(A)
Вам нужноне беспокойтесь об этих субтитрах ... вместо этого измените методологию тестирования, убедитесь, что образцы не могут быть выброшены для получения того же результата, иначе вы рискуете проверить способность компилятора пропустить бесполезные инструкции вместо реальной производительности.
В этом случае повторно инициализируйте массив случайными значениями перед каждой выборкой, и, чтобы быть абсолютно уверенным, сделайте некоторую постоянную переменную зависимой от результата каждой выборки.Также не включайте эти дополнительные шаги в таймер, иначе это сместит ваше время выборки.