c# - 实习字符串是否有助于解析器的性能?

标签 c# performance parsing string-interning

如果你是解析的话,就说HTML吧,一旦你读懂了元素名,是否有利于实习呢?这里的逻辑是这个解析器会一遍又一遍地解析相同的字符串(元素名称)?并且将解析多个文档。

理论:

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

这个问题是由问题 string-interning-memory 激发的.

最佳答案

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

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

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

关于c# - 实习字符串是否有助于解析器的性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1356341/

相关文章:

c# - 如何使用 webclient 异步下载多个文件,但一次下载一个文件?

c# - 数据库迁移代码生成器

c# - Twitter OAuth 无法正确重定向回我的网站

java - 这个程序已经是解析器了吗?

Python:数学表达式解析

c# - 正则表达式以防止文本框接受电子邮件地址

performance - 恒定空间中的一元折叠

c++ - 在 2D std::vector 中移动行/列的最有效方法

java - 迭代字符串替换后可能的最短结果长度

java - 使用 Java 库从 ODT 文档中提取字段