在>0和>=1之间的C#中,哪个更快更好?
发布于 2010-09-08 02:34:25
两者都不是;如果其中一个更快或更好,它们应该编译成相同的东西。
更重要的是,大多数程序员可能会发现> 0
更具可读性,而且可读性比像这样的亚微观优化更重要。
发布于 2010-09-08 02:36:14
更好的是最清楚地表达了你的意图。
如果你要测试一个整数是否在1,6的范围内,那么你应该写成:
if (x >= 1 && x <= 6) { ... }
写这段代码是可行的,但并不能很明显地满足规范:
if (x > 0 && x < 7) { ... }
我还假设您在这里讨论的是整数类型。如果您正在处理浮点数或十进制数,那么它们是不等价的。
除非你已经分析了你的代码并发现这是瓶颈,否则你不应该担心微优化。尽管如此,检查C#编译器在每种情况下生成的代码,看看它们是否编译成相同的IL,这可能是很有趣的。这可以通过使用.NET Reflector来完成。
if (x >= 1)
{
Console.WriteLine("True!");
}
结果如下:
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)
鉴于:
if (x > 0)
{
Console.WriteLine("True!");
}
产生以下IL:
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,查看哪个版本最快的最佳方法是在循环中实际运行代码,并查看每个版本需要多长时间才能执行。我尝试过这样做,但我没有看到这两种编写代码的方式之间有任何可测量的性能差异。
发布于 2010-09-08 02:33:30
未定义。您显式地要求使用C# --但这依赖于处理器架构,即CLR运行时编译器。
https://stackoverflow.com/questions/3661545
复制相似问题