【发布时间】:2013-10-18 18:58:10
【问题描述】:
我经常对此感到困惑。我一直被教导使用变量或常量来命名我经常使用的数字,但是如果它降低了程序的效率,我还应该这样做吗?举个例子:
private int CenterText(Font font, PrintPageEventArgs e, string text)
{
int recieptCenter = 125;
int stringLength = Convert.ToInt32(e.Graphics.MeasureString(text, font));
return recieptCenter - stringLength / 2;
}
以上代码使用了命名变量,但运行速度比这段代码慢:
private int CenterText(Font font, PrintPageEventArgs e, string text)
{
return 125 - Convert.ToInt32(e.Graphics.MeasureString(text, font) / 2);
}
在这个例子中,执行时间的差异很小,但是在更大的代码块中呢?
【问题讨论】:
-
在“可读性”和“简洁性”之间存在主观灰色地带............意见会有所不同。
-
我更喜欢第一个,因为从现在起 6 个月后,有人可能会弄清楚我做了什么。但我会为 125 和 2...... 定义“常量”值,所以这些值意味着什么......不仅仅是一些随机的 int 挂在那里。
-
这样的性能差异是您最不必担心的。此外,我确信这是在调试器中测量的,这意味着您的基准测试不准确。此外,我确信
const的执行效果与硬编码值相同。 -
1) 即使存在差异,我发现它非常、非常、非常不可能在您的应用程序中成为一个真正的问题,从而导致一个太慢的差异和一个足够快的。 2)你是如何衡量差异的?奇怪的是,您遇到了许多常见的基准测试陷阱之一。对微优化进行基准测试非常很难。
-
您知道这两种方法略有不同吗?第一个将测量值转换为整数,然后分成两半。第二种方法将测量值分成两半然后转换为整数。我想知道这是否会导致您的可测量差异(尽管我怀疑这是一个错字)。老实说,我很惊讶。对我来说,我希望运行时 jitted 代码(假设它在没有附加调试器的情况下以发布模式运行)几乎相同。在第一个示例中,我没有看到编译器无法优化以生成第二个示例。
标签: c# magic-numbers