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

Javascript 其中一个更快吗:if(!foo<;bar)if(foo>;bar)?,javascript,performance,Javascript,Performance,出于好奇。我检查某些字符串是否超过指定的最大长度: var name = "This Is a Name"; if (!name.length >= 10) { //valid length } else { alert("Too long"); } 这是否更好/更快(?): 我知道10在代码中是重叠的-别介意。我只是想知道在这方面是否有任何性能/最佳实践。我几乎总是使用=。我发现总是将较小的值放在左边(当测试成功时)可以更快地解析。它还进行范围测试: if (0 <

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

var name = "This Is a Name";
if (!name.length >= 10)
{
    //valid length
}
else
{
    alert("Too long");
}
这是否更好/更快(?):


我知道10在代码中是重叠的-别介意。我只是想知道在这方面是否有任何性能/最佳实践。

我几乎总是使用
=
。我发现总是将较小的值放在左边(当测试成功时)可以更快地解析。它还进行范围测试:

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

if(0如果它实际上不是应用程序的瓶颈,我建议使用可读性最强的代码,而不是性能最好的代码-即使性能略有差异,我怀疑您的情况是否真的存在这种差异

在您的情况下,就我而言,最容易理解的代码是:

if (name.length <= 10)

if(name.length这不在你的掌握之中,解释器会做任何它认为正确的事情。Javascript解释器现在可能非常先进,他们会对此进行优化,但更可能的是,这些解释器本身是用一个编译器编译的,该编译器会对翻译本身进行优化,因此它甚至不在人的掌握之中翻译写道

所以说真的,如果你想要一种控制这种行为的语言,你需要asm。即使在(优化的)C语言中,你也不能真正控制它


唯一可以肯定的是,
n.length>9
可能会稍微快一点,因为它包含的字符更少,所以解析速度会更快。我们谈论的是纳秒,甚至可能是皮秒。

让我来评论一下你的最后一个例子:我相当肯定你的
if(10>=name.length)
约定是在错误的C编译器警告时代开始的,目的是避免
if(pointer=NULL){error();}else{i=*pointer;}的错误
type,因为反向版本会导致输入错误导致编译器错误。这在jslint-less JavaScript中仍然非常相关,但我认为这不会影响非相等比较


在剩下的时间里,我也坚定地认为“没有区别”camp,尽管我没有做过实验,但我想不出可能的原因,顺序会对性能产生影响。

1.你真的经常做这种检查,以至于性能很重要吗?2.即使性能很重要,我猜这些检查几乎是一样的,我建议使用!name.length syntax(运算符优先级)。3.如果性能真的那么重要,我建议设置一个基准测试;)不,一点也不-我不关心性能。我只是好奇什么是“最佳”
!name.length>=10
!(name.length>=10)不一样
操作符绑定得比
=
更紧,使
(!name.length)>=10
。如果性能不是问题,那么“什么是最好的”是其他人最容易阅读和理解的。我完全同意。还要注意的是,在最低级别上,<和>之间没有区别。机器代码指令是相同的,只是“参数”(寄存器)的顺序相同已更改。@noah1989:谢谢您的评论。我应该注意,JGE和JLE在机器级别上存在差异。但是,编译器选择哪一个可能与测试之前哪些值最终在哪个寄存器中有关,而不是与代码中是否使用了
=
有关。当然,您是对的。我参考了不过,在跳转之前,CMP指令将被删除。而单个
字符的网络传输可能需要比解析它或在CPU上实际执行NOT操作更长的时间。我没有想到Firefox的后期TraceMonkey等浏览器内置的高级JS编译器。当然,这些都有不同的行为IE的JS渲染器可能会以不同的方式解释一切。
if (0 <= a && a < 10) …
if (name.length <= 10)