并且部分地收到了这个答案,这似乎表明bind应该比闭包更快:
范围遍历意味着,当您要获取存在于另一个范围中的值(变量,对象)时,因此会增加额外的开销(代码执行起来会变慢)。
使用bind,您正在使用现有范围调用函数,这样就不会发生范围遍历。
两个jsperfs表示bind实际上比闭包慢得多。
这是对以上内容的评论
而且,我决定编写自己的jsperf
那么,为什么结合速度这么慢(铬含量超过70%)?
由于速度不快并且闭包可以达到相同的目的,是否应避免绑定?
Chrome59更新:正如我在下面的回答中所预测的那样,使用新的优化编译器后,绑定不再变慢。
:
除非您要创建应用程序,否则.bind
瓶颈就不会困扰我。在大多数情况下,可读性比纯粹的性能更为重要。我认为使用本机.bind
通常会提供更具可读性和可维护性的代码-这是一大优势。
.bind
是- 速度较慢是的,.bind
它比闭包要慢得多-至少在Chrome中,至少是在中当前实现的方式中v8
。我个人有时不得不切换Node.JS来解决性能问题(通常,在性能密集型情况下,闭包有点慢)。
为什么?因为该.bind
算法比使用另一个函数包装一个函数并使用.call
或复杂得多.apply
。(有趣的是,它还会返回一个toString设置为[nativefunction]的函数)。
从规范的角度和从实现的角度来看,有两种方法可以查看。让我们观察两者。
…
(21.用参数“参数”调用F的[[DefineOwnProperty]]内部方法,PropertyDescriptor
{[[Get]]:thrower,[[Set]]:thrower,[[Enumerable]]:false,[[Configurable]
]:false}和false。
(22.返回F。
看起来很复杂,不只是包装。
其次,让我们看看如何在Chrome中实现它。
让我们检查FunctionBind
一下v8(chromeJavaScript引擎)源代码:
function FunctionBind(this_arg) { // Length is 1.
if (!IS_SPEC_FUNCTION(this)) {
throw new $TypeError('Bind must be called on a function');
}
var boundFunction = function () {
// Poison .arguments and .caller, but is otherwise not detectable.
"use strict";
// This function must not use any object literals (Object, Array, RegExp),
// since the literals-array is being used to store the bound data.
if (%_IsConstructCall()) {
return %NewObjectFromBound(boundFunction);
}
var bindings = %BoundFunctionGetBindings(boundFunction);
var argc = %_ArgumentsLength();
if (argc == 0) {
return %Apply(bindings[0], bindings[1], bindings, 2, bindings.length - 2);
}
if (bindings.length === 2) {
return %Apply(bindings[0], bindings[1], arguments, 0, argc);
}
var bound_argc = bindings.length - 2;
var argv = new InternalArray(bound_argc + argc);
for (var i = 0; i < bound_argc; i++) {
argv[i] = bindings[i + 2];
}
for (var j = 0; j < argc; j++) {
argv[i++] = %_Arguments(j);
}
return %Apply(bindings[0], bindings[1], argv, 0, bound_argc + argc);
};
%FunctionRemovePrototype(boundFunction);
var new_length = 0;
if (%_ClassOf(this) == "Function") {
// Function or FunctionProxy.
var old_length = this.length;
// FunctionProxies might provide a non-UInt32 value. If so, ignore it.
if ((typeof old_length === "number") &&
((old_length >>> 0) === old_length)) {
var argc = %_ArgumentsLength();
if (argc > 0) argc--; // Don't count the thisArg as parameter.
new_length = old_length - argc;
if (new_length < 0) new_length = 0;
}
}
// This runtime function finds any remaining arguments on the stack,
// so we don't pass the arguments object.
var result = %FunctionBindArguments(boundFunction, this,
this_arg, new_length);
// We already have caller and arguments properties on functions,
// which are non-configurable. It therefore makes no sence to
// try to redefine these as defined by the spec. The spec says
// that bind should make these throw a TypeError if get or set
// is called and make them non-enumerable and non-configurable.
// To be consistent with our normal functions we leave this as it is.
// TODO(lrn): Do set these to be thrower.
return result;
在执行过程中,我们可以看到很多昂贵的东西。即%_IsConstructCall()
。当然,这是要遵守规范所必需的-但在许多情况下,它也比简单包装慢。
另一个注意,调用.bind
也略有不同,规范说明“使用Function.prototype.bind创建的函数对象没有原型属性,或者内部没有[[Code]],[[FormalParameters]]和[[Scope]]内部属性”
这里的Better可能意味着更快或更容易阅读/更短的语法,也可能意味着该命令甚至不能在中执行。 我不经常使用,我想知道是否有我应该使用的情况。因为我不经常使用它,所以我能想到的唯一示例是,据我所知,它没有模拟,而且我看到的所有其他示例都在和中完成smth,后者更快、更容易阅读/更紧凑。
问题内容: 按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 8年前关闭。 我正在设计一个小的网络应用程序/游戏。哪个更好:MySQL表或json文件?它们都存储信息。它们都可以由PHP解析。优点/缺点是什么? 这就是我的意思: 与 编
我是个新手,我已经开始学习了。但我有些问题。为什么我们需要使用Mockito?据我所知,它用于模拟(创建虚拟对象),并在实际运行代码之前编写测试用例。但是,如果我想测试我已经实现的代码,以检查它们是否正常工作,该怎么办。我怎么用mockito来测试它呢? 例如,我有CRUD方法,我想通过实际使用我的Create方法在数据库中插入数据来测试Create是否正常工作,其他人也是如此。我们能用莫基托来实
我在练习leetcode第5题。真正让我困惑的是这里C++(20ms)和Python(1000ms)之间巨大的运行时差异。 我知道Python是一种解释性语言,所以一般来说它比C++慢。但是在这里,C++比Python快50倍是我无法理解的。两个程序都使用相同的算法,所以并非如此。是因为C++和Python中字符串的实现方式吗? C++ Python
问题内容: 我没有完全了解Node.js的全部含义。也许是因为我主要是基于Web的业务应用程序开发人员。它是什么,有什么用? 到目前为止,我的理解是: 编程模型是事件驱动的,尤其是它处理I / O的方式。 它使用JavaScript,解析器为V8。 它可以轻松用于创建并发服务器应用程序。 我的理解正确吗?如果是,那么事件I / O的好处是什么,并发性东西还有更多好处吗?另外,Node.js的发展方
问题内容: 按照目前的情况,这个问题不适合我们的问答形式。我们希望答案能得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 9年前关闭。 在这个问题中,有什么方法可以只接受JTextField中的数值吗?答案之一表明JFormattedTextField存在问题。 我还没有使用过它,但是有人可以