gpt4 book ai didi

node.js - 为什么 Node 比 Chrome 慢 10 倍?

转载 作者:太空宇宙 更新时间:2023-11-03 23:50:50 24 4
gpt4 key购买 nike

我正在运行我的Z80 emulator在 Chrome 和 Node 中。我在 Chrome 中获得的性能大约是 Node 中的 10 倍。 (100k Z80 指令在 Chrome 中需要 6 毫秒,在 Node 中需要 60 毫秒。)我已经运行了分析器:

% node --prof index.js
% node --prof-process isolate-0x108000000-25550-v8.log

它说 95% 的时间花在 C++ 上:

[Summary]:
ticks total nonlib name
103 3.8% 3.8% JavaScript
2604 95.2% 95.8% C++
6 0.2% 0.2% GC
17 0.6% Shared libraries
12 0.4% Unaccounted

C++ 分割为:

[C++ entry points]:
ticks cpp total name
2127 98.3% 77.7% T __ZN2v88internal40Builtin_CallSitePrototypeGetPromiseIndexEiPmPNS0_7IsolateE
32 1.5% 1.2% T __ZN2v88internal21Builtin_HandleApiCallEiPmPNS0_7IsolateE

我已追踪到 CallSitePrototypeGetPromiseIndexthis source file 。我没有在代码中使用 Promise、asyncawait。我的测试只是 100k 模拟 Z80 指令的紧密循环,没有 I/O 或任何东西。

我在网上发现其他人使用 --prof 标志,但没有人在他们的结果中找到这一点。这是分析的副作用吗?我是否在循环内以某种方式触发了 promise ? Node 为何比 Chrome 慢这么多?

详细信息: Node v12.13.1、Chrome 79.0.3945.88。

最佳答案

好的 this surprisingly similar question Esailija 给出了一个很好的答案,他指出我 this line在V8源代码中。它将 switch 语句的优化限制在特定大小以下。我的模拟器做的第一件事是为操作码分配 256 个条目的开关。在我的测试中,我只通过了 0 (NOP),因此可以安全地注释掉大量案例。事实证明,如果我注释掉其中 13 个案例,性能就会提升 25 倍!如果我只注释掉其中 12 个案例,那么性能就会很慢。

上面的 V8 源代码链接相当古老(2013 年),所以我试图找到现代的等效链接。我没有找到硬性限制,但发现了几种在表查找和树(二分搜索)查找之间做出决定的启发式( ia32x86 )。当我插入我的数字时,我不太清楚找到它的边界情况,所以我不确定这是真正的原因,或者是否有其他优化没有在其他地方触发。

至于与 Chrome 的区别,他们决定优化开关的时间和方式可能存在一些细微的差别。

我不确定这里最好的解决方案是什么,但显然我需要避免大型 switch 语句。我要么拥有一系列较小的 switch 语句,要么用一组函数替换整个内容。

更新:我使用了一系列函数,整个程序的速度提高了 25 倍。

关于node.js - 为什么 Node 比 Chrome 慢 10 倍?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59557414/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com