“if(condition)int ++”和int + =“Convert.Toint32(condition)”之间的区别

时间:2017-01-10 21:35:22

标签: c# if-statement conditional-statements

这两种方法将值递增一个

if (Condition) int++;

int+= Convert.Toint32(Condition);

以这种或那种方式写作是否有益,或者它们基本相同?

4 个答案:

答案 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。关键词是可能