其中一个更快:if(!foo< bar)if(foo> bar)?

时间:2011-12-09 09:11:53

标签: javascript performance

出于好奇。我检查一些字符串是否长于指定的最大长度:

var name = "This Is a Name";
if (!name.length >= 10)
{
    //valid length
}
else
{
    alert("Too long");
}

这是更好/更快(?):

if (name.length <= 10)

我记得在某些语言中最好先写一下否定,所以它甚至更好(yip,我就是这样写的)就像这样(?):

if (10 >= name.length)

我知道10在代码中重叠 - 不介意。我只想知道是否有任何表现/最佳实践。

4 个答案:

答案 0 :(得分:3)

我几乎总是使用<<=代替>>=。我发现左边的值越小(测试成功时)就越快进行心理解析。它还进行了范围测试:

if (0 <= a && a < 10) …

阅读更像数学等价物0≤ a &lt; 10。

表现方面,如果有任何可衡量的差异,我会感到惊讶。

答案 1 :(得分:2)

这不在你的手中,翻译人员会做出任何它认为正确的事情。 Javascript解释器现在可能会如此先进,他们会对此进行优化,但更有可能的是,这些解释器本身是使用编译器编译的,该编译器将优化翻译本身,因此它甚至不在编写解释器的人手中。

所以,如果你想要一种你想要控制这种行为的语言,你需要asm。甚至没有(优化)C你真的控制了它。

唯一可以确定的是,n.length > 9可能会稍微快一些,因为它包含更少的字符,因此可以更快地解析它。我们说的是纳秒,甚至可能是皮秒。

答案 2 :(得分:1)

如果它实际上不是你的应用程序的瓶颈,我建议使用最强可读,而不是性能最高的代码 - 即使性能略有不同,我怀疑它确实存在在你的情况下。

就你而言,就我而言,最容易理解的代码就是:

if (name.length <= 10)

如果您真的想要从代码中获得最佳性能,那么您必须编写一些测试;因为在大多数情况下通常不能说这个,例如几乎每个JavaScript实现都会表现得略有不同。

另外,请务必查看“过早优化”,例如在wikipedia (see section "When to optimize")

答案 3 :(得分:1)

让我简单评论一下你的最后一个例子:我很确定你的if(10 >= name.length)约定是在错误的C编译器警告时代开始的,以避免if(pointer = NULL) { error(); } else { i = *pointer; }类型的错误,因为反转版本会使拼写错误导致编译错误。这在jslint-less JavaScript中仍然令人惊讶地相关,但我认为它不会影响非相等比较。

对于其余部分,我也坚定地处于“无差异”阵营,即使我没有进行过实验,我也无法想到订单会产生性能差异的合理原因。