【发布时间】:2012-06-01 15:01:44
【问题描述】:
这就是我想做的:
if(ABoolean || (BBoolean && CBoolean))
{
SomeButton.Enabled = true;
AnotherButton.Enabled = true;
}
else
{
SomeButton.Enabled = false;
AnotherButton.Enabled = false;
}
我可以切换到:
SomeButton.Enabled = (ABoolean || (BBoolean && CBoolean));
AnotherButton.Enabled = (ABoolean || (BBoolean && CBoolean));
为了更简洁的代码。我的问题是,编译器是否会优化分配,使其看到布尔表达式相同并为第二个按钮分配其值,还是每次都计算该值。
注意:我知道这是一个微不足道的例子,加速/减速将微不足道到无关紧要的地步,但它有助于让我更好地理解编译器优化。
编辑:这就是我认为可能会优化第二个选项的原因:
class Program
{
static bool ABoolean = true, BBoolean = true, CBoolean = false;
static bool AEnable, BEnable;
static void Main(string[] args)
{
Stopwatch sw = new Stopwatch();
sw.Start();
for (int i = 0; i < 1000000000; i++)
{
Operation1();
}
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds);
Stopwatch sw1 = new Stopwatch();
sw1.Start();
for (int i = 0; i < 1000000000; i++)
{
Operation2();
}
sw1.Stop();
Console.WriteLine(sw1.ElapsedMilliseconds);
Console.Read();
}
static void Operation1()
{
if (ABoolean || (BBoolean && CBoolean))
{
AEnable = true;
BEnable = true;
}
else
{
AEnable = false;
BEnable = false;
}
}
static void Operation2()
{
AEnable = (ABoolean || (BBoolean && CBoolean));
BEnable = (ABoolean || (BBoolean && CBoolean));
}
}
这在 10 亿次操作中产生了大约 8-9 秒的差异(第二个选项运行得更快)。随着我添加更多“启用”布尔值,第二个操作变得更慢。
【问题讨论】:
-
顺便说一句:第三种方法是通过变量赋值:
var enabled = (ABoolean || (BBoolean && CBoolean)),然后使用该变量设置.Enabled属性。