这两种方法将值递增一个
if (Condition) int++;
和
int+= Convert.Toint32(Condition);
以这种或那种方式写作是否有益,或者它们基本相同?
答案 0 :(得分:8)
向整数添加布尔值没有任何意义。
是的,它有效,因为转换。但它仍然没有任何意义。这是不合逻辑的。
程序应该是明显和清晰的,而不是要解决的难题。
答案 1 :(得分:3)
我从下面的基准测试中获得了7527ms和5888ms的机器。第一种方法(布尔转换),除了从代码可读性的角度来看只是糟糕之外,速度也较慢。这是有道理的,该方法具有以下开销:1)执行从bool到int的转换,以及2)执行加法运算。是的,可能有添加“0”的快捷方式,但这仍然是另一个必须要考虑的测试。
int sum = 0;
var sw = Stopwatch.StartNew();
for (int i = 0; i < Int32.MaxValue; i++) {
bool condition = i < Int32.MaxValue / 2;
sum += Convert.ToInt32(condition);
}
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds);
sum = 0;
sw = Stopwatch.StartNew();
for (int i = 0; i < Int32.MaxValue; i++) {
bool condition = i < Int32.MaxValue / 2;
if (condition) {
sum++;
}
}
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds);
答案 2 :(得分:2)
编写执行相同操作的代码的方法有很多种。但这一切都取决于可读性和可维护性。
您可以选择以二进制形式编写它,您将能够以最有效的方式对其进行优化。但是你找不到太多可以维护你编写的代码的人。我敢打赌,当有错误时,你甚至不想用二进制文件读取你自己的代码。
那么你想以哪种方式去做?考虑到第二种方法没有那么多的性能提升,我会说为了那些可能稍后会阅读你的代码的人来说肯定是第一种。
答案 3 :(得分:0)
我认为代码的清晰度取决于上下文。
对于几乎所有普通情况,
if (condition) i++;
...会更容易阅读。
但是可能会出现类似这样的情况,其中替代方案更容易遵循。想象一下,如果这个清单很长:
var errorCount = 0
errorCount += Convert.ToInt32(o.HasAProblem);
errorCount += Convert.ToInt32(o.HasSomeOtherProblem);
errorCount += Convert.ToInt32(p.DoesntWork);
另一方面,对于上述情况,我可能会找到一种完全构造代码的不同方式,例如。
var errorFlags = new [] {o.HasProblem,
o.HasSomeOtherProblem,
p.DoesntWork};
var errorCount = errorFlags.Count(a => a);
此外,构造
i += Convert.ToInt32(condition);
...可能会导致更清晰pipeline,因为不涉及branch prediction。关键词是可能。