Interning字符串是否有助于解析器的性能?

CS.*_*CS. 6 c# performance parsing string-interning

如果你正在解析,让我们说一下HTML,一旦你读到元素名称,实习生是否有益呢?这里的逻辑是这个解析器会一遍又一遍地解析相同的字符串(元素名称)?并且将解析几个文档.

理论:

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

这个问题的动机是字符串 - 实习记忆.

jri*_*sta 2

我真的无法确切地说这是否会对你的表现有所帮助。这取决于您使用的字符串数量以及创建这些字符串实例的频率。驻留通常是自动完成的,因此显式检查字符串是否被驻留实际上可能会增加开销并降低性能。当谈到内存使用时,内部字符串肯定可以使用更少的内存。

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

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