JavaScript:相同的代码需要不同的时间来执行
JavaScript: Same code take different time to execute
首先我运行这个(在铬中):
var start;
var end;
start = (new Date()).getTime();
for(var i=0;i<10e5;i++);
end = (new Date()).getTime();
console.log('delay:' + (end-start));
输出: delay:2028
然后我运行这个:
function foo() {
var start;
var end;
start = (new Date()).getTime();
for(var i=0;i<10e5;i++);
end = (new Date()).getTime();
console.log('delay:' + (end-start));
}
foo();
输出: delay:8
为什么在函数中包装时花费相同的代码更短的时间?
在节点中,它花费了相同的时间(6 和 6),但节点通过铬使用 V8 引擎,不是吗?
因为在函数中,所有变量都在闭包中。如果没有函数JavaScript解释器,请先尝试在全局范围内找到变量。
我认为
这种行为只出现在控制台中这一事实非常能说明问题。我怀疑这与 V8 引擎如何将脚本简化为本机代码有关。
要点#1:我怀疑范围不是减速的原因:
function foo() {
start = (new Date()).getTime();
for(i=0;i<10e5;i++);
end = (new Date()).getTime();
console.log('delay:' + (end-start));
}
此代码在全局范围内使用 start
、 end
和 i
。如果搜索全局范围确实是瓶颈,那么此代码也应该运行缓慢,因为它在函数中没有局部变量。
要点#2:如果你把你的代码放在一个实际的网页中,无论哪种方式,它都会运行得非常快。 这向我表明,在控制台中运行代码是速度变慢的根源。
通常,在网页上,V8引擎将JavaScript组装成本机二进制代码,因此运行速度非常快。 但是,我怀疑从控制台运行的代码没有编译(或者在运行时可能逐行编译,这本身会产生时间成本)。 但是,当输入函数定义时,该函数在首次运行之前会完整编译。当程序流到达foo()
调用时,函数foo
已编译为本机代码。因此,函数运行速度很快,因为它已经过预编译,但控制台中的原始代码尚未预编译,因此运行缓慢。
这在很大程度上是猜测,但对这个问题的每个答案也是如此。 这是我唯一可以设计的解释,可以解释上述#1和#2点。
相关文章:
- 正在停止.在jquery中的特定时间间隔内,每次迭代的每次执行
- 有没有一种方法可以检查javascript以毫秒为单位执行一个函数需要多长时间
- 如何优化这个jquery循环的执行时间
- 如何在长时间执行JavaScript期间显示微调器
- 不确定react.js的异步执行时间
- AJAX 调用在获得响应并成功执行时会冻结浏览器一段时间
- 如何使用 javascript 停止对 asp.net 进行正在进行的回发(长时间运行的执行)
- 为什么这个正则表达式需要这么长时间才能执行
- 如何在boomrang页面加载时间中添加ajax执行时间
- 作为自动化测试的一部分,监控特定的js事件以及执行它们所需的时间
- javascript执行具有时间间隔的函数
- 执行时间,AMPScript/JavaScript
- 如何在浏览器中使用F12控制台在javascript中每隔一段时间执行一次
- 在给定时间执行不同的nodejs脚本
- 如何使用setTimeout或setInterval设置多个(可能多于两个)函数在不同时间执行
- YUI Compressor Maven插件在错误的时间执行,tomcat插件没有使用YUI - Compressor输
- 在长时间执行过程之前和之后使用Jquery更改元素css
- 在按下鼠标按钮的整个时间执行按钮事件处理程序
- 每次都以相同的持续时间执行代码
- JW播放器根据经过的时间执行操作