如果重复多次,JavaScript是否缓存/优化代码?
我目前正在编写一个小框架来测试JavaScript函数的速度。当我用相同的参数重复调用相同的方法时,它会给我奇怪的结果:如果重复多次,JavaScript是否缓存/优化代码?,javascript,performance,Javascript,Performance,我目前正在编写一个小框架来测试JavaScript函数的速度。当我用相同的参数重复调用相同的方法时,它会给我奇怪的结果: Function Execution Time isEvenBitwise 38.00000000046566 isEvenModulo 38.00000000046566 isEvenPointless 38.00000000046566 Function Execution Time isEvenB
Function Execution Time
isEvenBitwise 38.00000000046566
isEvenModulo 38.00000000046566
isEvenPointless 38.00000000046566
Function Execution Time
isEvenBitwise 9.652258097220447
isEvenModulo 37.546061799704376
isEvenPointless 8.512472488871936
以下是我的职能:
var myFunctions =
{
isEvenBitwise: function(number)
{
return !(number & 1);
},
isEvenModulo: function(number)
{
return (number % 2 == 0);
},
isEvenPointless: function(number)
{
return 1;
}
}
PerformanceTest.prototype.measureTime = function()
{
for (var indexTests = 0; indexTests < this.testCount; indexTests++)
{
var results = [];
for (var currentFunction in this.functions) {
var contextFunction = this.functions[currentFunction];
var startTime = performance.now();
for (var i = 0; i < this.iterationsPerTest; i++)
{
var heh = contextFunction.apply(this, arguments)
}
var executionTime = performance.now() - startTime;
var result = {};
result.testName = currentFunction;
result.executionTime = executionTime;
results.push(result);
}
this.testResults.push(results);
}
}
运行函数的代码:
var myFunctions =
{
isEvenBitwise: function(number)
{
return !(number & 1);
},
isEvenModulo: function(number)
{
return (number % 2 == 0);
},
isEvenPointless: function(number)
{
return 1;
}
}
PerformanceTest.prototype.measureTime = function()
{
for (var indexTests = 0; indexTests < this.testCount; indexTests++)
{
var results = [];
for (var currentFunction in this.functions) {
var contextFunction = this.functions[currentFunction];
var startTime = performance.now();
for (var i = 0; i < this.iterationsPerTest; i++)
{
var heh = contextFunction.apply(this, arguments)
}
var executionTime = performance.now() - startTime;
var result = {};
result.testName = currentFunction;
result.executionTime = executionTime;
results.push(result);
}
this.testResults.push(results);
}
}
在看了你的代码之后,我想猜测一下Chrome对你所做的事情是否明智。它看到了这一点:
var startTime = performance.now();
for (var i = 0; i < this.iterationsPerTest; i++)
{
var heh = contextFunction.apply(this, arguments)
}
var executionTime = performance.now() - startTime;
var startTime=performance.now();
for(var i=0;i
正确评估contextFunction没有副作用,认识到
heh
变量仅存在于循环范围内,从未使用过,然后优化整个循环,因为它不起任何作用 你能展示一下计算执行时间的代码吗?这是最可能的问题。即使使用缓存,您也无法获得精确到该精度的完全相同的执行时间。您在每个浏览器上都获得相同的结果吗?@glenatron否,请检查我的编辑。@Juhana当然,请检查我的编辑。这可能是因为:我喜欢这个猜测,但即使执行var a=performance.now();var end=performance.now()-a代码>不会给出如此一致的结果,日志记录中一定有一些有趣的事情……删除循环后,您有两个相邻的性能调用。now()。我敢打赌Chrome也在优化这些功能。据我所知,它是经过最严格优化的Javascript引擎,因此它几乎使用了你能想到的所有技巧来达到这个速度。你认为这种优化是如何在不产生零结果的情况下进行的?@DavidMcMullin很好,它一定在做些什么。也许只是优化循环的内容,但每次都要迭代循环。即便如此,这些结果似乎过于一致。