c# - 常量和操作可变化对 C# 性能的影响

标签 c# c++ performance optimization

在 C/C++ 编程中经常使用常量来生成更清晰的代码。有时也可能有优化的好处。但是,我想知道在 C# 中将值声明为只读或常量除了可读性更高的代码之外还有什么好处。

假设我有以下 C# 代码:

public Double HalfPiSomething(Int32 input)
{
    return input + (Math.PI / 2);
}

这是一个相当简单的示例,但每次调用该方法时,我们都会将 Math.PI 除以 2,将其添加到输入中,然后将其返回给调用语句。

让我们使用该代码并使 Math.PI/2 在包含类的某处成为它自己的变量:

private Double _halfPi = Math.PI / 2;

public Double HalfPiSomething(Int32 input)
{
    return input + _halfPi;
}

显然,采用Math.PI/2 的操作并将其放在自己的变量中是一个好主意,就像基本的编码实践一样,特别是如果所述值在类中的多个点中使用...它不在这里,但让我们假装吧。

最后,因为 _halfPi 永远不会改变,所以我们让它成为 const:

private const Double _halfPi = Math.PI / 2;

public Double HalfPiSomething(Int32 input)
{
    return input + _halfPi;
}

我想知道的是,除了对 C# 进行良好的编码实践并使代码更易于理解和更难出错之外,执行我上面所做的是否有好处 - 特别是在性能方面?该值在本地内存中的停留时间是否更长?

最佳答案

each time the method is called, we divide Math.PI by 2, add it to input, and return it to the calling statement.

不,这不是正在发生的事情:C# 编译器在编译时评估常量表达式。此外,当混合了常量和非常量的表达式具有可在编译时计算的子表达式时,编译器会预先计算该值,就好像它是单个常量一样。

编译器识别Math.PI / 2子表达式作为常量,执行计算,并生成将输入添加到除法的预计算结果的代码。

What I want to know is, other than being good coding practice for C# and making code easier to understand and harder to make errors with, are there benefits - especially regarding performance - to doing what I did above?

不,没有理由做编译器的工作,除非它会导致更清晰。

Does the value stay in local memory longer?

常量值被“嵌入”到编译器生成的代码中。它们不是本地数据内存的一部分(尽管它们肯定在内存中,只要代码在内存中)。

关于c# - 常量和操作可变化对 C# 性能的影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24764267/

相关文章:

c# - 如何使用 C# 接口(interface)将 C++ 智能指针返回到 PowerPoint 接口(interface)

c# - 是否可以在 UpdatePanel 中重新执行 javascript?

c++ - 为什么我的调试器有时会崩溃并做出与我的代码不一致的事情?

performance - Angular2 OnPush 变化检测和 ngFor

javascript - JavaScript 数组如何在内部调整大小?

python - 移动 Numpy 数组的最快方法

c# - 如何在 C# 中将复杂的 geo-json 转换为 wkt?

c# - 使 c# winforms 应用程序可用作非托管 mfc 应用程序的 dll

c++ - Boost:位置参数无法识别的选项

c++ - 具有多重继承的协变返回类型。这段代码是如何工作的?