C# 使用「;大于或等于;或者只是;大于;
我记得在C时代,我们被鼓励使用C# 使用「;大于或等于;或者只是;大于;,c#,.net,c,C#,.net,C,我记得在C时代,我们被鼓励使用 i > -1 而不是 i >= 0 因为表现 这在C#NET世界中仍然适用吗?在当今的编译器中使用一种编译器比使用另一种编译器对性能有什么影响?i、 编译器是否足够聪明,可以为您优化这些 (作为备用,尝试在堆栈溢出的问题字段中键入问题“use>=或>”,看看会发生什么。)不,您不需要再这样做了。是的,编译器变得更加智能,两个表达式没有性能差异。否,没有与比较运算符相关的性能问题。任何好的编译器都会优化这些琐碎的东西 我不确定您是从哪里得到使用“I>
i > -1
而不是
i >= 0
因为表现
这在C#NET世界中仍然适用吗?在当今的编译器中使用一种编译器比使用另一种编译器对性能有什么影响?i、 编译器是否足够聪明,可以为您优化这些
(作为备用,尝试在堆栈溢出的问题字段中键入问题“use>=或>”,看看会发生什么。)不,您不需要再这样做了。是的,编译器变得更加智能,两个表达式没有性能差异。否,没有与比较运算符相关的性能问题。任何好的编译器都会优化这些琐碎的东西 我不确定您是从哪里得到使用“I>-1”而不是“I>=0”的建议的。在x86体系结构上,使用哪种指令没有区别:任何一种情况都只需要两条指令。。。一个用于比较,一个用于跳转:
;; if (i > -1) {
cmp eax, -1
jle else
then:
...
else:
;; if (i >= 0) {
cmp eax, 0
jl else
then:
...
else:
在我所知道的大多数RISC架构中,“I>=0”实际上可能更快,因为通常有一个专用的零寄存器,“I>-1”可能需要加载一个常量。例如,MIPS只有一条<指令(no=0){(假设i在寄存器%t0中)
stl$t1,$0,$t0//在C:t1=(0你确定吗?我早在70年代就开始使用计算机了(是的,在我父亲的膝上…),我从来没有见过一个CPU不能处理>=和>=一样快(在IBM360谈话中,BH“Branch High”与BNL“Branch Not Low”)。有一个非常类似的问题(没有批评意味——正如你所说,寻找符号是很棘手的)这里: (是的,我碰巧能够很容易地找到答案,因为我的答案得到了很多赞成票……)
基本上,做任何可读性最好的事情。有人正确地猜测更改最可读的表单将解决性能问题(没有分析器的帮助)的那一天,就是我停止谈论性能的那一天:)除了任何一个好的编译器都能做正确的事情之外,除了在现代体系结构中,
和=
之间没有速度差异之外,更大的图景表明这是一种“微优化”在绝大多数情况下,这不会影响运行时性能
在比较的情况下,它通常不会影响可读性,无论您以何种方式编写它,但有时选择一个边界比另一个边界更清晰:例如
if (length >= str.size())
对
if (length > str.size() - 1)
我不知道你的情况,但我随时都会选择选项1.:-)在对性能没有明显影响的情况下,比如这样,可读性更好的选项应该会赢。对于一些将>=分解为2个比较的可疑脚本语言来说,这可能是正确的,但无论是谁鼓励你在C中使用该选项……嗯……你可能应该这样做努力忘记他们告诉过你的一切。这让我想起了使用++i而不是i++(增量前与增量后)的建议,因为它应该比原来快一条指令。(我忘了我最初在哪里读到的,但可能是C/C++用户杂志或Dobb博士的杂志,但我似乎找不到网络参考。) 我严重怀疑>或>=是否更快或更慢;相反,为了清晰起见,请编写代码
作为旁注,即使原因现在可能已经过时,我还是对预增量(++I)运算符有了偏好。如果大于零,它必须进行两次检查。它检查负位是否关闭,它检查零位是否关闭
对于大于或等于零的情况,它只需检查负位是否关闭,因为我们不关心零位是否打开或关闭。我仍然不相信有一个环境会产生不同。有谁能告诉我一个现存的体系结构,其中一个需要的周期比另一个少???听起来像是一个程序我同意,詹姆斯。我能想到的是MIPS,它只有不到。所以编译器通常会重新排列“a我认为这是一个常见的神话。我从同事那里听说过,甚至在过去几年里也在互联网上见过几次。即使没有编译器优化消除差异,保存一条cpu指令也是一个巨大的努力浪费。正如你所说,这可能是我被误导了的东西-谢谢。马上。“过早优化是万恶之源。”(Donald Knuth)请注意,如果str.size()返回一个无符号的数量,则上面的两条语句是不等价的。特别是,如果str.size()返回,后一条语句将永远不会计算为true是零。虽然我通常会向unsigned:if大小为'short',“if(length>(unsigned short)(str.size-1))添加一个显式类型转换,但我有时使用过这样的代码“有助于明确代码将期望包装行为。在C++中,有一个理由喜欢一个增量超过另一个。我相信这是推荐的增量。<代码>(不不不,没有差别)=!((!(!!)))=!(!差)=difference;)@M.kazemAkhgary,很难反驳。现在我有点想加上第五个“不”
if (length > str.size() - 1)