【发布时间】:2019-02-22 05:07:11
【问题描述】:
我最近对元编程很感兴趣。我们可以进行通用计算,在本例中为均值,并为其动态创建一个高效的、明确的函数。在这里,我在 mean2 中创建了一个将显式计算均值的函数(没有循环)。通常,这些显式函数运行得更快。但我正在经历一些有趣的行为。在我的时间里,对于在 4e7 循环中运行的大小为 50 的数组,显式函数如预期的那样轻松获胜:
符号:2479.273ms |字面量:60.572ms
但是将初始数组大小从 50 微调到 55,性能急剧下降。
符号:2445.357ms |字面量:3221.829ms
这可能是什么原因?
const A = new Float64Array(50).map(Math.random)
const mean1 = function (A) {
let sum = 0
for (let i = 0; i < A.length; i++)
sum += A[i]
return sum / 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)
console.time('symbolic')
for (let i = 0; i < 4e7; i++)
mean1(A)
console.timeEnd('symbolic')
console.time('literal')
for (let i = 0; i < 4e7; i++)
mean2(A)
console.timeEnd('literal')
【问题讨论】:
-
@Shidersz Mean2 是一个匿名函数的结果,它只在启动时运行以创建模板 - console.log(mean2.toString()) 看看我的意思
-
@meagar 是的,我现在可以看到它(
mean2初始化时的自调用函数),谢谢,要删除我的评论...
标签: javascript node.js performance performance-testing