为什么内联 Javascript 比 Chrome 57 中的控制台慢 10 多倍?
Why is inline Javascript over 10 times slower than in the Console, in Chrome 57?
使用 Debian 8,标准存储库中可用的最新版本 Chrome (Chromium) 是 57。我一直在做一些非常简单的速度测试并获得奇怪的结果。
当我在控制台中 运行 下面一行时,它在大约 1 秒内完成:
var a = 0;for (var i = 0; i < 10000000; i++) {a = Math.sqrt(33 * Math.random());}console.log(a);
但是,如果我使用包含相同代码的 onclick
处理程序创建按钮,执行时间将超过 15 秒:
<button onclick="var a = 0;for (var i = 0; i < 10000000; i++) {a = Math.sqrt(33 * Math.random());}console.log(a);">Test</button>
谁能解释一下这是为什么?
编辑:
如果我将代码分离到脚本标记中的一个函数中,并在按钮 onclick
处理程序中引用该函数,它的运行速度与在控制台中一样快,实际上要快一点。
尤其是 V8 将其性能改进集中在 "every day code" 上,因此他们采取了一些流行的网页并试图使它们尽可能快地加载。这意味着:如果你的行为像人群一样,你的代码会 运行 快,如果你做一些特殊的事情(比如内联 js),它会 运行 慢,因为没有人努力优化,因为它不是值得
更多信息可以在 V8 GitHub wiki (albeit out of date), while their benchmarks README 上找到,特别提到了 50 个经过测试的热门页面。
使用 Debian 8,标准存储库中可用的最新版本 Chrome (Chromium) 是 57。我一直在做一些非常简单的速度测试并获得奇怪的结果。
当我在控制台中 运行 下面一行时,它在大约 1 秒内完成:
var a = 0;for (var i = 0; i < 10000000; i++) {a = Math.sqrt(33 * Math.random());}console.log(a);
但是,如果我使用包含相同代码的 onclick
处理程序创建按钮,执行时间将超过 15 秒:
<button onclick="var a = 0;for (var i = 0; i < 10000000; i++) {a = Math.sqrt(33 * Math.random());}console.log(a);">Test</button>
谁能解释一下这是为什么?
编辑:
如果我将代码分离到脚本标记中的一个函数中,并在按钮 onclick
处理程序中引用该函数,它的运行速度与在控制台中一样快,实际上要快一点。
尤其是 V8 将其性能改进集中在 "every day code" 上,因此他们采取了一些流行的网页并试图使它们尽可能快地加载。这意味着:如果你的行为像人群一样,你的代码会 运行 快,如果你做一些特殊的事情(比如内联 js),它会 运行 慢,因为没有人努力优化,因为它不是值得
更多信息可以在 V8 GitHub wiki (albeit out of date), while their benchmarks README 上找到,特别提到了 50 个经过测试的热门页面。