- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在运行我的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
至 this source file 。我没有在代码中使用 Promise、async
或 await
。我的测试只是 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 年),所以我试图找到现代的等效链接。我没有找到硬性限制,但发现了几种在表查找和树(二分搜索)查找之间做出决定的启发式( ia32 , x86 )。当我插入我的数字时,我不太清楚找到它的边界情况,所以我不确定这是真正的原因,或者是否有其他优化没有在其他地方触发。
至于与 Chrome 的区别,他们决定优化开关的时间和方式可能存在一些细微的差别。
我不确定这里最好的解决方案是什么,但显然我需要避免大型 switch 语句。我要么拥有一系列较小的 switch 语句,要么用一组函数替换整个内容。
更新:我使用了一系列函数,整个程序的速度提高了 25 倍。
关于node.js - 为什么 Node 比 Chrome 慢 10 倍?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59557414/
非常简单的问题 - 是否可以通过 Chromium 创建 google chrome 扩展,并让在不同操作系统上运行 Chrome 的人使用相同的扩展? 我正在Ubuntu上开发。 最佳答案 是的,完
我了解 chrome.bookmarks API(记录在 http://goo.gl/tIb6V6 )旨在用于开发访问/操作我的 Chrome 书签的 Chrome 扩展程序(当然要在 Chrome
在比较开源浏览器 Firefox 和 Chromium 的扩展、附加组件和列表时,我试图找到一些有趣的数据。 我感兴趣的是多宿主扩展(两个浏览器列表上都可用的扩展)。 但是当浏览 Chromium 扩
使用新的 chrome.notifications API,我无法从我的扩展程序中获取通知以显示。即使是最基本的通知也无法为我显示,但我没有收到任何错误,并且回调函数已正确执行。 list .json
我正在构建一个在 Chrome 上运行的信息亭媒体,可以播放带音频的视频。我知道默认情况下,chrome 只允许自动播放带有静音 Prop 的视频。 而且我知道我可以通过 chrome://flags
我从来没有真正写过 真实 Chrome 扩展程序。不久前我做了一个只是一个链接下拉列表,但这并不重要。无论如何,与其先回到关于编写 Chrome 扩展程序的大量教程中,不如先确保我的想法是可行的。 我
主要目的是在单个容器中运行多个 chrome 浏览器(9 个浏览器)。 我有一个集线器和节点设置,其中包含多个浏览器的容器,可在单个 chrome 节点容器中运行。我使用以下 docker 命令创建了
我想写一个小的 chrome 扩展程序,它应该从网页 A(当前网页)获取信息,将选项卡更新到网页 B,然后将代码注入(inject)网页 B。不幸的是,以下代码正在将网页更新到 B 但注入(injec
是否可以打开 Chrome 开发者工具来检查 Chrome 应用? 最佳答案 所有可调试目标都列在 chrome://inspect/ 下。请参阅“应用程序”标签。 关于google-chrome -
我正在为 Google Chrome 开发一个应用程序,我想知道如何收费。 问题是我住在巴西,在这个链接上它告诉我它不支持 Chrome 网上应用店付款。如果没有 Chrome 网上商店付款,我可以通
我刚刚更新到 Chrome 32.0.1700.76 m(在 Win7 上)并且开发人员工具已更改。 特别令人痛苦的是用于检查页面元素的放大镜图标消失了。也没有提到它的快捷方式列表。 任何人都知道这已
我在 chrome-extension API (chrome.webrequest) 中遇到问题。 我的 list .json { "name": "tesst", "version": "
我已经制作了 chrome 主机来在我的扩展程序和我的进程之间传递 native 消息,我的进程在 chrome 启动时启动,但在我关闭 chrome 时不关闭,我应该向主机的 list 添加参数还是
文档对此非常不清楚。我知道如果您自己托管您的扩展程序,您可以通过增加版本号来自动更新您的扩展程序。但是,我不知道您是否可以在仍发布到 chrome 网上商店的同时进行自托管。 我不敢相信 Google
我最近一直在使用 Selenium WebDriver。我还专门与 chromedriver 合作。每当我打开一个新的 chrome 窗口 (driver.get(url)) 时,Chrome 都会以
我指的是chrome://flags 我很想知道是否可以通过自定义 chrome 扩展启用或禁用特定的 chrome 标志? 例如-我想启用 Enable Media Source API on e
当我在 chrome 开发者仪表板上向我的扩展程序上传更新时, 它无法这样做,它显示, An error occurred: Failed to process your item. Chrome W
我正在尝试编写一个需要用户身份验证的 chrome 扩展。 Google's tutorial建议我需要先上传到网上商店才能获得 key : Login to the Google APIs Cons
我已经开发了一个 Chrome 扩展程序并且我已经打包了它。 我将我的扩展程序发送给一些人试用,但 Chrome 开始阻止它在商店中找不到的扩展程序。 有没有办法安装我的扩展程序而不会被 Chrome
某些 Chrome 扩展不适用于 Chromium。例如:http://code.google.com/chrome/extensions/samples.html#5d81304a17cf7ac28
我是一名优秀的程序员,十分优秀!