【发布时间】:2019-03-12 02:02:53
【问题描述】:
我找不到任何可以明确回答我的问题的东西,所以我想我会问:这是最佳做法还是只是喜欢做类似的事情:
public static class FixedStrings
{
public static readonly string foo = "bar";
}
class Example1
{
void UseString()
{
Console.WriteLine(FixedStrings.foo);
}
}
代替:
class Example2
{
void UseString()
{
Console.WriteLine("bar");
}
}
这是我目前的理解(我可能错了):
- 这是内存与 GC 分配的权衡;因此,如果需要字符串的方法经常被调用,或者它处于长时间运行的过程中,那么第一个示例是更好的选择。
- 如果内存不是问题,缓存可重复使用的字符串(或任何对象)将减少 GC 花费的时间并提高程序的响应能力。
- .NET GC 做得非常好,但是这些字符串中的一些会定期通过代,尤其是在负载下并且在很长一段时间后可能会导致完全 GC 清理。
-
Example1在性能方面几乎总是击败Example2。
我注意到来自不同地方的示例代码,人们同时使用这两种方法。我不确定这是否只是因为example2 打字更快,还是因为阅读偏好。我也很好奇,编译器是否足够聪明,可以自动将其中一些字符串转成缓存变量?
请记住,我所说的所有这些都是我从互联网上学到的,我没有受过正规教育。假设example1 更好,我可能是非常错误的
这就是我担心这样一个小优化的原因:
在我的实际项目中并没有那么小;在某些情况下,我可能每秒使用这些字符串数千次。
【问题讨论】:
-
从技术上讲,如果采用 “是最佳实践还是只是偏好做类似的事情” 的形式,您的问题是不合适的,因为“主要基于意见”。但是,从侧面问题中询问字符串是否被缓存,作为副本关闭似乎也是合理的。有关解决您的整体问题的详细信息,请参阅标记的重复项。
-
如果您怀疑实际项目中的影响并不小,那么您应该能够衡量这种影响。双向编写代码,双向运行,看看哪个(如果有的话)具有不可接受的性能。如果您无法检测到不可接受的性能,那么......那么我认为它是可以接受的,不是吗?
标签: c# .net string garbage-collection