首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在>0和>=1之间的C#中,哪个更快更好?

在>0和>=1之间的C#中,哪个更快更好?
EN

Stack Overflow用户
提问于 2010-09-08 02:32:35
回答 10查看 5.9K关注 0票数 19

在>0和>=1之间的C#中,哪个更快更好?

EN

回答 10

Stack Overflow用户

发布于 2010-09-08 02:34:25

两者都不是;如果其中一个更快或更好,它们应该编译成相同的东西。

更重要的是,大多数程序员可能会发现> 0更具可读性,而且可读性比像这样的亚微观优化更重要。

票数 50
EN

Stack Overflow用户

发布于 2010-09-08 02:36:14

更好的是最清楚地表达了你的意图。

如果你要测试一个整数是否在1,6的范围内,那么你应该写成:

代码语言:javascript
复制
 if (x >= 1 && x <= 6) { ... }

写这段代码是可行的,但并不能很明显地满足规范:

代码语言:javascript
复制
 if (x > 0 && x < 7) { ... }

我还假设您在这里讨论的是整数类型。如果您正在处理浮点数或十进制数,那么它们是不等价的。

除非你已经分析了你的代码并发现这是瓶颈,否则你不应该担心微优化。尽管如此,检查C#编译器在每种情况下生成的代码,看看它们是否编译成相同的IL,这可能是很有趣的。这可以通过使用.NET Reflector来完成。

代码语言:javascript
复制
if (x >= 1)
{
    Console.WriteLine("True!");
}

结果如下:

代码语言:javascript
复制
L_000b: ldloc.0          // Load the value of x
L_000c: ldc.i4.1         // Load the constant 1 
L_000d: blt.s L_0019     // Branch if less than
L_000f: ldstr "True!"
L_0014: call void [mscorlib]System.Console::WriteLine(string)

鉴于:

代码语言:javascript
复制
if (x > 0)
{
    Console.WriteLine("True!");
}

产生以下IL:

代码语言:javascript
复制
L_000b: ldloc.0          // Load the value of x
L_000c: ldc.i4.0         // Load the constant 0
L_000d: ble.s L_0019     // Branch if less than or equal
L_000f: ldstr "True!"
L_0014: call void [mscorlib]System.Console::WriteLine(string)

在这两种情况下,编译器都反转了比较。“大于或等于”测试被编译成“小于”指令,而“大于”测试被编译成“小于或等于”。通常,编译器可以自由地进行这样的修改,并且运行不同版本的编译器可能会产生不同的(但等价的)字节码。

考虑到它们不会编译成相同的IL,查看哪个版本最快的最佳方法是在循环中实际运行代码,并查看每个版本需要多长时间才能执行。我尝试过这样做,但我没有看到这两种编写代码的方式之间有任何可测量的性能差异。

票数 28
EN

Stack Overflow用户

发布于 2010-09-08 02:33:30

未定义。您显式地要求使用C# --但这依赖于处理器架构,即CLR运行时编译器。

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3661545

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档