【发布时间】:2011-12-28 12:49:01
【问题描述】:
将this benchmark 与 chrome 16 与 Opera 11.6 进行比较时,我们发现
- 在 chrome 中本机绑定几乎比绑定的模拟版本慢 5 倍
- 在 Opera 中,本机绑定几乎比模拟版本的绑定快 4 倍
在这种情况下,bind 的模拟版本在哪里
var emulatebind = function (f, context) {
return function () {
f.apply(context, arguments);
};
};
存在这样的差异是否有充分的理由,或者这只是 v8 优化不足的问题?
注意:emulatebind 只实现了一个子集,但这并不真正相关。如果您有一个功能齐全且经过优化的模拟绑定,performance difference in the benchmark 仍然存在。
【问题讨论】:
-
@RobW 内联了我要与之比较的模拟版本的绑定。
-
我想,这是由于代码的不同优化造成的。也许,带有本机绑定的包装器不允许某些优化。 FF10 演示了类似的行为。
-
您的问题必须是 “为什么我的模拟 .bind() 在 Chrome、FireFox 中比本机更快,而在 Opera 和 IE 中则慢?”。为什么你认为那一定是另外一种情况?不同的代码优化。例如,您的模拟绑定不允许添加参数,而只能添加上下文。
-
@AndrewD。基本上是的。我想知道解释这种特殊差异的引擎特定优化。
-
这是一个使用 es5-shim 版本的测试用例的补充:jsperf.com/bind-vs-emulate/6
标签: javascript google-chrome v8