【发布时间】:2010-07-21 11:37:34
【问题描述】:
假设我们有一个包含 10000 个 const 字符串成员的类。
class Schema
{
//Average string length is 20
public const string ID1 = "some.constant.value";
public const string ID2 = "some.other.constant.value";
//...
}
并非所有字段都在其余代码中被引用。其中只有 10% 在启动时被访问——它们的引用被分配为各种字典(数千个 Dictionary 实例)的键。我知道 const 字符串是实习的 - 多次引用 const 字符串不会增加消耗的内存超过指向实习字符串表中偏移量的元数据令牌的大小。
我了解 const 字符串被编译到程序集中,因此会影响已编译程序集的大小。
这些 const 字符串在什么确切时间/事件消耗运行时内存?
将是 all 加载程序集时占用的 const 字符串所需的所有内存,还是延迟到类被 JIT 编译?
我们可以通过改变等式中的某些内容来减少启动后的内存消耗吗? (将字段设为非 const,将字符串设为静态字段?)。
让我们假设一个 Winforms 应用程序 (.NET 2.0)。
【问题讨论】:
-
粗略估计,总内存消耗量约为 300 kB,大约是现代计算机 RAM (4 GB) 的 0.0075%。这有多重要?
-
忘记数字,内存使用优化不是这里的目标。问这个问题主要是为了理解原理。
-
@Marcelo:RAM 与它有什么关系? RAM是一种性能优化;稀缺资源不是 RAM,而是虚拟地址空间。当您“内存不足”时,您已经用完了地址空间,而不是 RAM;如果您的 RAM 用完了,那么操作系统只会转到磁盘并对其进行分页。现在已经不是 1980 年了。我们有虚拟内存。 :-)
-
如果您想了解 .NET 中的内存消耗情况,我建议您在内存分析器下运行一些应用程序,并检查其输出。您可以了解很多关于您的应用程序中正在发生的事情。至于何时创建字符串常量:我根本不会担心。这是一个实现细节,所涉及的总内存通常很小。
-
@Eric:同样的论点适用于 RAM 作为性能优化。正如我们应该担心如何使用 L1/L2/L3 缓存一样,我们也应该担心我们对物理 RAM 的使用。当然,如果这些常量中的大多数从未被触及,它们只会消耗地址空间,但如果它们被持续使用,那么它们也会消耗物理 RAM 并增加分页系统的压力。简而言之,RAM 和地址空间都是重要的考虑因素,即使在 2010 年也是如此。
标签: c# string memory-management clr constants