Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance != 假与假=真_Performance_Programming Languages_Evaluation - Fatal编程技术网

Performance != 假与假=真

Performance != 假与假=真,performance,programming-languages,evaluation,Performance,Programming Languages,Evaluation,我想我在什么地方读到过否定(!=false)的计算速度比==true快 这对吗?这不对。所有现代编译器和解释器都将优化这一点 (至少对我来说)重要的是,==true对我来说解释起来要快得多 记住,过早优化是万恶之源 编辑:是,我使用if(true)。但这不是问题。别担心 任何半体面的语言都会将您的高级代码翻译成任何最快的低级构造 只需使用生成可读性最强的代码的构造即可。在大多数语言中,您甚至不需要使用显式比较:如果可能,请使用if(foo)而不是if(foo==true)或if(foo!=fal

我想我在什么地方读到过否定(!=false)的计算速度比==true快


这对吗?

这不对。所有现代编译器和解释器都将优化这一点

(至少对我来说)重要的是,
==true
对我来说解释起来要快得多

记住,过早优化是万恶之源

编辑:是,我使用
if(true)
。但这不是问题。

别担心

任何半体面的语言都会将您的高级代码翻译成任何最快的低级构造

只需使用生成可读性最强的代码的构造即可。在大多数语言中,您甚至不需要使用显式比较:如果可能,请使用
if(foo)
而不是
if(foo==true)
if(foo!=false)
不,这是不正确的

除了在.Net中处理
bool?
之外,您不应该写任何东西。

相反,您应该编写
if(someBool)
if(!someBool)

永远不要测试
==true
,至少在
C
C++
目标C
或相关语言中,其中任何非零值都等于(但不一定等于)true

可接受的:

if (x)
if (!x)
if (x == false)
if (x != false)
错误和危险:

if (x == true)
if (x != true)

性能方面是完全不相关的。

当然,这在总体方案中并不重要,可读性更重要。但它是哪一个?我们怎么知道?我们测试它。为了公平起见,我们将使用==True和!测试相等数量的真值和假值=Python中为False:

>>> from timeit import Timer
>>> import time
>>> f=Timer('x=True;x!=False;x=False;x!=False',timer=time.clock)
>>> t=Timer('x=True;x==True;x=False;x==True',timer=time.clock)
>>> f.timeit(number=10000000)
3.2700000000000005
>>> t.timeit(number=10000000)
3.629999999999999


现在,这在运行的几段时间内是相当一致的。哇!测试=False比testing==True快。如果你必须这样做10000000次,你会赢得半秒。享受那段时光

不知道,但从来没有人写过=false或==true不管怎样,一个人写if(~x)或if(x)--翻译成你选择的语言。我想这是完全特定于语言(和实现的)。@High Performance Mark:我认为最近的趋势正好相反,因为可读性很重要,而且没有性能hit@Cameron:更糟糕的是,它是特定于芯片和编译器的。在一些芯片中,与零的比较比与任何非零值的比较都要快,并且编译器的“简单”实现使得执行“else”分支的速度加快了一个时钟。因此,您可以看到这是如何在一些具有这些属性和基本编译器的芯片上开始的(您可以节省两个完整的周期!)。然后,像cargo cult一样,它永远不会消亡……可读性正是你不应该写
的原因=false
==true
<代码>如果(x)
/
如果(!x)
是标准形式,那么其他任何东西都会读得慢一些,因为它与众不同。这是为什么?它真的更快吗?只有当你的条件有一个好名字时,它才会更干净。@Eiko:变量是否有一个好名字是另一个问题。使用
if(missileReadyToLaunch)
确实比
if(blah)
更具可读性,但这并不意味着
if(blah)
本身并不比
if(blah==true)
更干净。@LukeH:在很多情况下,这可能是正确的,但我看到的糟糕代码太多了,当你不知道你正在检查的是一个布尔值时(在许多语言中,你几乎可以用if检查任何东西),那么将它与true进行比较将给出一个很好的提示,说明你期望得到什么,以及如何读取该代码。但当然,
==true
是完全多余的,因为在大多数语言中,
如果x==true
根本不应该被使用,因为
如果x
做同样的事情。对读者来说,这只是噪音(编译器会优化)。- 1:永远不要写<代码> =真/ <代码>——它在C、C++和相关语言中是危险的。@克里斯:这不是问题…是的真或=假+1来平衡这一点。@Eiko:再读一遍这个问题-你的回答是错误的。我怀疑这可能是OP误解的根源。也许他们用
!=false
==true
更好,并将“更好”误解为“更快”。@LukeH:是的,我想你说得一针见血!我不同意你的清单,我发现
x!=false
有点混乱,它与
x
相同,我认为使用双负片没有任何意义。另一方面,
x!=“真”
翻译成“命题不是真的”,我一点也不介意。@H.B:我想你可能没有抓住为什么
x!=真的
是危险的。哦,谢谢你,我不知怎么地陷入了对那里编码风格的思考中,这种考虑对我来说通常并不重要,因为我没有用任何语言进行编程。造成这种差异的原因是什么?这里的问题是真的和假的速度太慢,只需更改
f=Timer('x=1;x!=0;x=0;x!=0',计时器=time.clock)
t=timer('x=1;x=1;x=0;x=1',计时器=time.clock)
区别在于1个部分,找出为什么更快意味着通过调试和分析来编译python,然后仔细查看配置文件输出。不过,我提出的任何随机假设似乎都走错了方向(例如“False”比“True”长,所以解析速度应该较慢……不…)。。