请教一V8上的js问题
发布于 8 年前 作者 fsiaonma 4100 次浏览 最后一次编辑是 5 年前
function add(x, y) { 
   return x + y; 
} 

console.time("time1");

for (var i = 0; i < 90000000; ++i) {
    add(1, 2); 
    add('a','b');
}

console.timeEnd("time1");

function addText(x, y) { 
   return x + y; 
} 

function addNumber(x, y) { 
   return x + y; 
}

console.time("time2");

for (var i = 0; i < 90000000; ++i) {
    addNumber(1, 2); 
    addText('a','b');
}

console.timeEnd("time2");

这段代码在 V8 上的运行结果为: time1: 1481ms, time2: 102ms。

请教一下具体原因。

15 回复

弱弱的说一句,可能是在addText addNumber裡面省下了很多型別轉換的時間(?)

应该不是没执行循环,两个循环换个顺序 或者单独执行的话,结果任然如此。 应该是类型转换的问题,一个方法的类型判断应该有缓存,如果有种类型传入的话可能会破坏这种缓存,导致多次判断。

是的, 是 V8 内联缓存的问题!

XY 说的?

刚找到了原因,是因为 V8 引擎内联缓存的问题

没错,就是这个原因!

以下是内存和时间的测试结果:

6788KB time运行前使用的内存

time1: 3336ms

9728KB time1 结束后使用的内存

time2: 221ms

9728KB time2 结束后使用的内存

签名: 交流群244728015 《Node.js 服务器框架开发实战》 http://url.cn/Pn07N3

@brighthas 这个内存是通过什么工具来获得的

准确来说 是V8内联缓存问题

guoliangchen@guoliangchen-N73SV:~/桌面/node/example$ node add time1: 1521ms time2: 98ms guoliangchen@guoliangchen-N73SV:~/桌面/node/example$ 这是我电脑上运行的时间!

这个好像在朴灵大大的博客里面有提到!!

能否准确解释一下内联缓存造成这个问题的原因呢?

@perterpon 我有时间写了一篇 bolg,你兴趣的可以参考一下 http://blog.sina.com.cn/s/blog_6801fe420101qaz2.html

有链接吗

回到顶部