为什么 Node 比 Chrome 慢 10 倍?

2024-01-11

我正在运行我的Z80模拟器 https://github.com/lkesteloot/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

我已经追踪到CallSitePrototypeGetPromiseIndex to 这个源文件 https://github.com/nodejs/node/blob/master/deps/v8/src/builtins/builtins-callsite.cc。我没有使用承诺,async, or await在我的代码中。我的测试只是 100k 模拟 Z80 指令的紧密循环,没有 I/O 或任何东西。

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

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


Okay 这个惊人相似的问题 https://stackoverflow.com/questions/18830626/should-i-use-big-switch-statements-in-javascript-without-performance-problemsEsailija 给了我一个很好的答案这条线 https://github.com/v8/v8/blob/596d0ce7b7a3900c529025aaa77e5fc39162c8c5/src/hydrogen.cc#L3350在V8源代码中。它将 switch 语句的优化限制在特定大小以下。我的模拟器做的第一件事是为操作码分配 256 个条目的开关。在我的测试中,我只通过了 0 (NOP),因此可以安全地注释掉大量案例。事实证明,如果我注释掉其中 13 个案例,性能就会提升 25 倍!如果我只注释掉其中 12 个案例,那么性能就会很慢。

上面的 V8 源代码链接相当古老(2013 年),所以我试图找到现代的等效链接。我没有找到硬性限制,但发现了几种在表查找和树(二分搜索)查找之间做出决定的启发式(ia32 https://github.com/v8/v8/blob/master/src/compiler/backend/ia32/instruction-selector-ia32.cc#L1575, x86 https://github.com/v8/v8/blob/master/src/compiler/backend/x64/instruction-selector-x64.cc#L2211)。当我插入我的数字时,我不太清楚找到它的边界情况,所以我不确定这是实际原因,或者是否有其他优化没有在其他地方触发。

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 Node 比 Chrome 慢 10 倍? 的相关文章

  • AWS Lambda 环境变量未设置,process.env 在节点中未定义

    尽管 Lambda 函数的仪表板向我展示了NODE ENV列为环境变量 process env NODE ENV当我运行节点 AWS Lambda 函数时 未定义 这段代码 console log node process env NODE
  • AWS应用程序负载均衡器和socket.io

    我有一个正在运行的 socket io 聊天室 当我们在一台机器上运行时 其流量越来越大 我们已经使用 ws 套接字库运行了基准测试 它们的性能确实要好得多 这将更好地利用我们的硬件 但这会以必须重写我们的应用程序为代价 我们的 socke
  • 如何停止rabbitmq服务器

    我正在尝试启动一个节点应用程序 但我认为rabbitmq 妨碍了我 与此线程类似 名为 rabbit 的节点已经在运行 但也 无法连接到节点 rabbit https stackoverflow com questions 8737754
  • JSON 对象 - 访问 React Native 中的值

    在我的 React Native 应用程序中 我使用 RNDBModels 包 它是 AsyncStorage 的包装器 目前 我正在通过 RNDBModels 保存一个 JSON 对象 并且该对象可以正常工作 但是访问数据具有挑战性 当代
  • net.Socket.writable、net.Socket.readable 属性不是官方 Node.js API 的一部分

    我想知道为什么 net Socket writable 和 net Socket read 属性不是官方 Node js API 的一部分 这是否意味着最好不要使用这些属性 因为它是将来可能会改变的内部内容 它们是 但不是你正在寻找的地方
  • API 的集成与单元测试

    我们可以考虑向端点 单元或集成测试 发送请求吗 import lib from testing lib const testClient expect lib const response testClient request app ge
  • Nestjs如何控制缓存?

    最近读了nestjs的文档 从中学到了一些东西 但我发现了一些让我困惑的事情 In 技术 缓存 https docs nestjs com techniques caching 文档告诉我使用像这样的装饰器 UseInterceptors
  • console.log 从控制台提取方法

    考虑到console未被覆盖并引用本机对象 console log方法 可能还有其他方法 是从console对象与 var log obj log console log instead of console log bind consol
  • node.js http.request 事件流 - 我的 END 事件去了哪里?

    我正在制定一个狡猾的计划 其中涉及使用 node js 作为另一个服务前面的代理服务器 简而言之 将传入请求分派到静态文件 如果存在 否则 将请求分派给另一个服务 我已经掌握了基础知识 但现在尝试使用 Sencha 来完成整个工作Conne
  • 使用 Bot Framework 记录 Node.js-Azure 应用程序

    我有一个托管在 Azure 上的节点应用程序 Bot Framework 机器人 记录调试信息的最佳方法是什么 例如 据我所知 使用console log 没有帮助 因为 Azure 中没有可供查看的控制台 我也不想打电话session s
  • 导入JavaScript模块时什么时候需要添加文件扩展名?

    导入模块时 我注意到有时导入的文件有扩展名 例如 import myFunc from foo js 而其他库 导入不会 import myFunc from foo 这与 ES 模块与 CommonJS 模块有关吗 这取决于你的运行时和编
  • 通过forever为nodejs自动重新启动服务[重复]

    这个问题在这里已经有答案了 我发现forever可以永远运行nodejs服务器 永远支持这个功能吗 If the nodejs script is modified changed the server shld restarted aut
  • Nodejs 进程挂起,我该如何调试它或收集转储?

    我的nodejs进程在Linux上运行 现在挂起并且CPU为100 无论如何我可以调试它并找到原因吗 我需要收集转储吗 如何收集 谢谢 有一个 npm 模块叫做节点为何运行 https www npmjs com package why i
  • 如何在Vue中提交表单,重定向到新路由并传递参数?

    我正在使用 Nuxt 和 Vue 我正在尝试提交表单 将用户重定向到包含提交的参数的新路由 发送 API 请求以获取一些数据 然后渲染该数据 我通过简单地将表单操作设置为新路径并手动将所有 URL 参数添加到 API 请求来实现此目的 首先
  • 如何使用 Node JS Puppeteer 在无头 chrome 请求中设置代理服务器

    我正在 chrome 上运行无头搜索请求 并且需要访问代理服务器 const puppeteer require puppeteer var url https www google com search q var keyword hot
  • 错误:无法检测网络(事件=“noNetwork”,代码=NETWORK_ERROR,版本=providers/5.6.8)

    我想连接到ganache我得到一个error我不知道如何解决它 这是我的deploy js代码 它是脚本node js const ethers require ethers const solc require solc const fs
  • 在 sinon.js 中存根和/或模拟类?

    我已经为我的应用程序创建了一个数据库包装器 如下所示 为了测试它 我显然想替换实际的数据库 我可以创建一个新类来模拟query方法并捕获那里的所有输入 但是使用sinon js看起来更合适 但是我该如何使用它呢 Is the mock or
  • 如何解决 fs.existsSync 不是函数

    在 NodeJS 中我有 const fs require fs if fs existsSync some path 但我收到错误 类型错误 fs existsSync 不是函数 经过一番搜索后 我读到了Webpack自带require哪
  • mime.lookup 的 webrtc 错误

    我在我的电脑上尝试了 webrtc 演示 但在演示步骤 04 中 当我使用 npm install 和 node index js 时 它显示 类型错误 mime lookup 不是一个函数 即使我通过输入 npm install mime
  • node-cron 每 3 小时运行一次作业

    我试图每 3 小时运行一次 node cron 作业 但我不确定我做得是否正确 现在我正在使用 8 它是否正确 您应该将秒和分钟值清零 并使用 3 的步长 其 cron 表达式是 0 0 3 其计算结果为 每 3 小时 0 秒 0 分钟 你

随机推荐

  • SQL Server 的自定义处理器 + DBCPConnectionPool:未加载驱动程序 jar

    I have created a controller service to connect to a test db 我有一个自定义处理器 可以从 SQL Server 读取数据 模拟测试 构建和部署到 NiFi 都成功 处理器遇到错误
  • PHP 5.5.X 及更高版本中是否需要再使用 & 符号?

    我到处都收到混合信号 我是否使用 符号通过引用传递变量 以下链接似乎告诉我它已被弃用并且不再需要 http gtk php net manual en html tutorials tutorials changes references
  • 我可以将 LayoutPrams 与 ViewGroup.addView 一起重复使用吗?

    Does ViewGroup addView clones LayoutParams数据放到里面还是链接到呢 我可以重用同一个实例吗LayoutParams多次调用addView 有不同的看法吗 apidoc 中没有任何相关内容 WOW 答
  • 压缩后的位图质量=比原始文件大小大 100 倍

    我正在尝试将图像发送到服务器 在发送之前 我会减小其大小和质量 然后解决任何旋转问题 我的问题是 旋转图像后 当我保存它时 文件比以前大 旋转前大小为 10092 旋转后大小为 54226 Scale image to reduce it
  • 表值函数和实体框架

    我正在尝试使用实体框架执行 TVF 但由于某种原因它不起作用 也许那里的任何人都可以帮助我解决这个问题 以下是代码示例 这就是函数 CREATE FUNCTION dbo udf profileSearch keywords NVARCHA
  • Kotlin:创建自定义 CoroutineContext

    我在 API 后端使用 Kotlin 我不想在中运行数据库查询common pool 基本上 我想创建一个CoroutineContext有许多与数据库匹配的线程maximumPoolSize 完成此任务的最佳方法是什么 一般情况下以及针对
  • 为什么有些项目的 use 子句接受 Jpeg,而其他项目则需要 vcl.imaging.jpeg?

    我正在将一些项目更新到 XE2 但我不明白为什么在某些项目上 uses jpeg 被接受 在其他方面我需要写 uses vcl imaging jpeg 你能给我解释一下吗 差异在于各个项目的项目选项中的单元范围名称设置 如果你有Vcl I
  • 如何用单斜杠替换特殊字符

    我有一个关于 Java 中字符串的问题 比方说 我有一个像这样的字符串 String str The startup trace state is info 由于字符串包含特殊字符 例如 我需要将字符串替换为 根据我的要求 如何替换特殊字符
  • R {targets} 包:如何使用字符串引用现有目标?

    我正在使用 targets 包 尝试根据现有目标创建新目标 虽然通过以 NSE 样式键入名称来引用现有目标很简单 但通过使用字符串作为 别名 却无法做到这一点 只是为了清楚我在说什么 我会表明我的意思outside the targets
  • 在 DatePickerDialog 中以数字格式而不是字母顺序显示月份字段

    下图显示了我在 Android 应用程序中的当前日期选择器 但是我想将所有月份显示为 01 02 03 12 而不是一月 二月 三月 十二月 任何帮助将不胜感激 你可以自己设计Dialog with NumberPicker 但如果你仍然想
  • Symfony 一次性实例化一项服务并与多个用户一起使用

    我正在尝试做一项仅实例化一次的服务 然后当新用户访问我的主页时 我可以在需要时重新使用它 我想做的是一个实例化后设置日期时间的服务 当任何用户连接到我的主页时 我会向我的服务发送一个日期时间 然后比较两个日期时间 实例化服务时的日期时间和用
  • 将 AWS API Gateway API 端点的 IP 列入公司防火墙中的白名单

    我已经构建了一个 AWS API Gateway API 端点 该端点将被我公司网络中的一台机器命中 以每隔一定时间间隔发布数据 但是 当我通过 Postman 从办公室网络尝试它时 办公室防火墙会阻止它 但是当我使用移动热点 其他 wif
  • 分配变量并显示结果

    我收到 T ECHO 意外错误 完成上述任务的正确方法是什么 我稍微扩展一下这个问题 这是一段 wordpress 代码 get option 函数不回显该值 所以我尝试了
  • java - HashMap 中的内容适当的数据

    想象一下您有一本学生评价日记 每个学生在日记中都有每个科目的分数 我想将其存储在HashMap lt gt 但我不明白为什么标记会合并 在期刊课上 public class Journal private static HashMap
  • 两个十六进制数的相似度

    我试图使用汉明和编辑距离找到类似的哈希值 十六进制哈希值 假设两个哈希值相似 如果它们的汉明距离小于 10 不同位数 Hash 1 ffffff base 16 Hash 2 fffff0 base 16 两个哈希之间的汉明距离是4 它们是
  • Android 成功分享意图

    如何判断用户是否成功完成了共享意图 例如 如果用户想通过 Facebook 或 Twitter 分享应用程序 Edit 我不是在研究如何创建Intent共享的 我想知道用户是否确实分享了任何内容 或者用户是否按下了取消按钮 我认为没有一种可
  • 在 Recyclerview 或 Listview 中添加多个标题。随机地

    如何在 RecyclerView 或 listview 中添加多个标题或分隔符 随机如下图突出显示 RecyclerView 中基于日期的多个标题 演示图像 您可以使用库来实现它分段回收器视图适配器 https github com lui
  • Project Euler - #1 Python 错误解决方案

    总体而言 我对编码还比较陌生 因此启动了欧拉项目 以使我的编码更进一步 花了一些时间思考如何自己解决第一个问题并尝试使用递归函数 不幸的是总是遇到同样的错误 266333 我错过了什么 有什么重大错误值得学习吗 原问题是 如果我们列出所有
  • 如果我使用 iPad 尺寸创建应用程序,如何找到 iPhone 尺寸的“安全区域”?

    我正在创建一个游戏 想要使用 iPad 尺寸设置 横向 1024x768 据我所知 使用 iPad 设置只会在 iPhone 上裁剪掉部分高度 假设我有一张 iPad 的 2048x1536 背景图像 1024x768 和 iPhone 6
  • 为什么 Node 比 Chrome 慢 10 倍?

    我正在运行我的Z80模拟器 https github com lkesteloot z80 emulator在 Chrome 和 Node 中 我在 Chrome 中获得的性能大约是 Node 中的 10 倍 100k Z80 指令在 Ch