6

如果你在解析,就说HTML,一旦你读到元素名称,实习会有好处吗?这里的逻辑是这个解析器会一遍又一遍地解析相同的字符串(元素名称)?并且将解析几个文档。

理论:

// elemName is checked for null.
MarkupNode node = new MarkupNode() 
{
   Name = String.IsInterned(elemName) ? elemName : String.Intern(elemName),
   ...
};

这个问题的动机是问题string-interning-memory

4

2 回答 2

2

我真的不能确切地说这是否会对你的表现有所帮助。这取决于您使用了多少字符串,以及您创建这些字符串的实例的频率。实习通常是自动完成的,因此明确检查字符串是否被实习实际上可能会增加您的开销并降低您的性能。在内存使用方面,实习字符串绝对可以使用更少的内存。

如果您确实希望使用字符串实习,有一些更好的方法可以实现它。首先,我会将您的元素名称粘贴在一个充满公共字符串常量的静态类中。在您的程序源代码中找到的任何字符串文字都肯定会自动被实习。当你的应用程序被加载时,这些字符串被加载到实习池中。如果您的字符串不能定义为编译时实习生准备的常量,那么我会简单地调用String.Intern(...)而不是执行完整的三元表达式String.IsInterned(...) ?... : String.Intern(...). Intern 方法将自动检查字符串是否被实习,如果是则返回实习版本,否则会将字符串添加到实习池,如果不是则返回。无需自己手动检查 IsInterned。

同样,我不能说手动实习字符串是否会提高性能。如果您使用常量,它们会以最佳方式自动为您实习,这是提高经常重用字符串的性能和内存使用率的最佳方法。老实说,我建议您远离手动实习,让编译器和运行时为您处理优化。

于 2009-08-31T08:21:08.160 回答
1

当然,实习字符串有助于提高性能,但正如@jrista 所说“如果您使用常量,它们将自动为您实习,......”。

这里有一些文章可能会对你有所帮助,

优化 C# 字符串性能

总结:共享内存,C# 维护着一个叫做“实习表”的东西。这是当前引用的字符串列表。如果创建了新字符串,则检查实习表。如果您的字符串已经在其中,那么这两个变量将指向实习表维护的同一块内存。

http://blog.cumps.be/string-concatenation-vs-memory-allocation/

于 2009-08-31T08:28:10.423 回答