性能:总是分配布尔值还是先检查值?

时间:2011-01-03 17:40:31

标签: c# .net vb.net boolean

我确定它可以忽略不计,但鉴于我想将true分配给方法中的布尔字段,这个选择是否会有所不同?如果是这样,为什么?

field = true; // could already be true, but I don't care

if(!field) field = true;

4 个答案:

答案 0 :(得分:16)

我会说不。但这确实取决于我们真的在谈论字段而不是属性这一事实,可能(尽管它绝对不应该)在你所包含的两个片段中表现出不同的行为(即,如果在吸气剂中存在具有副作用的逻辑)。

更新:如果您谈论的是性能开销,几乎没有差异 - 但是我认为分配的成本要低得多(比阅读值)。这是一个示例程序来演示:

bool b = false;

Stopwatch sw = Stopwatch.StartNew();
for (int i = 0; i < int.MaxValue; ++i)
{
    b = true;
}
sw.Stop();

TimeSpan setNoCheckTime = sw.Elapsed;

sw = Stopwatch.StartNew();
for (int i = 0; i < int.MaxValue; ++i)
{
    // This part will never assign, as b will always be true.
    if (!b)
    {
        b = true;
    }
}
sw.Stop();

TimeSpan checkSetTime = sw.Elapsed;

Console.WriteLine("Assignment: {0} ms", setNoCheckTime.TotalMilliseconds);
Console.WriteLine("Read: {0} ms", checkSetTime.TotalMilliseconds);

我机器上的输出:

Assignment: 2749.6285 ms
Read: 4543.0343 ms

答案 1 :(得分:10)

对于某个字段,只需设置即可。对于属性,它可能更复杂,具体取决于getset是否过于昂贵,和/或set是否在内部检查(绕过事件等)。

作为属性的一般规则,只需设置它,直到您知道这是一个问题,因为分析。

对于田地;不要过分担心它;默认只是设置。

答案 2 :(得分:5)

早在90年代,当我在x86汇编程序中编程时,规则是(IIRC)以避免跳转。 if语句可以作为跳转实现。

因此,我的结论是(至少某些那些古老的规则仍然适用),避免if并直接分配会更有效。

答案 3 :(得分:0)

我通常做的是,如果我期待其他东西,那么任何类型的变量的默认值我都将它设置为通常不会的东西。这样,如果值没有改变,那么我知道会发生什么以及如何处理它。它不适用于你的例子,你的问题有点模糊,你的例子没有解释你试图做什么。

我当然同意Marc和Dan的陈述。