使用变量与幻数的性能影响

Nat*_*han 3 c# magic-numbers

我经常对此感到困惑.我一直被教导用经常使用变量或常量命名的数字,但如果它降低了程序的效率,我还应该这样做吗?下面是一个例子:

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;
    }
Run Code Online (Sandbox Code Playgroud)

上面的代码使用的是命名变量,但运行速度比这段代码慢:

private int CenterText(Font font, PrintPageEventArgs e, string text)
    {
        return 125 - Convert.ToInt32(e.Graphics.MeasureString(text, font) / 2);
    }
Run Code Online (Sandbox Code Playgroud)

在这个例子中,执行时间的差异是最小的,但是在更大的代码块中呢?

Pau*_*sik 9

使用变量和硬编码值之间的差异在最坏情况下可以忽略不计.编译器很好地处理这样的事情.如果您发现性能有所不同,我希望了解您收集这些指标的方法.(您的测试本身可能是可疑的,并且很可能不可重复.)

无论如何,您首先应该担心程序的正确性和可维护性.这意味着:

  • 仔细命名您的类,方法和变量
  • 分开关注
  • 避免使用魔法数字和字符串(这是125什么,它是什么意思?)
  • 避免哄骗
  • 等等

此外,receiptCenter听起来不应该是一个常数.它可能不经常更改,但我建议您将它存储在您的应用程序之外的配置文件或数据库表等.如果该值需要更改,您必须重新编译并推动整个事情.另外,如果在receiptCenter的价值不同的其他地方发布您的软件呢?您只想更改配置设置,而不是仅为该实例构建不同版本的应用程序.

优化是您最不担心的事情,除非您首先要担心这是建筑师/专家级别的考虑因素.


das*_*ght 9

当他们说"使用常数"时,他们的字面意思是"使用常量"; 它们并不意味着"使用永不改变的变量".

这相当于您的代码:

const int recieptCenter = 125;
int stringLength = Convert.ToInt32(e.Graphics.MeasureString(text, font));
return recieptCenter - stringLength / 2;
Run Code Online (Sandbox Code Playgroud)

使用const关键字,编译器知道它125永远不会改变,并且能够应用它将应用于表示为文字的常量的优化.

命名您的"神奇数字"有一个巨大的优势:在您离开公司后维护代码的人会知道它的含义是什么125.当您几年后重新访问此代码时,它也会对您有所帮助.

  • "当你几年后回来重新审视这段代码时,它也会对你有帮助."甚至几周. (2认同)