C# 插入字符串是否有助于提高解析器的性能?
如果你正在解析,就说HTML吧,一旦你读了元素名,实习它会有好处吗?这里的逻辑是,这个解析器将一次又一次地解析相同的字符串(元素名)?将解析多个文档 理论:C# 插入字符串是否有助于提高解析器的性能?,c#,performance,parsing,string-interning,C#,Performance,Parsing,String Interning,如果你正在解析,就说HTML吧,一旦你读了元素名,实习它会有好处吗?这里的逻辑是,这个解析器将一次又一次地解析相同的字符串(元素名)?将解析多个文档 理论: // elemName is checked for null. MarkupNode node = new MarkupNode() { Name = String.IsInterned(elemName) ? elemName : String.Intern(elemName), ... }; 这个问题是由这个问题引起的
// elemName is checked for null.
MarkupNode node = new MarkupNode()
{
Name = String.IsInterned(elemName) ? elemName : String.Intern(elemName),
...
};
这个问题是由这个问题引起的。我不能确切地说这是否有助于你的表现。这取决于您使用的字符串数量以及创建这些字符串实例的频率。实习通常是自动完成的,因此显式检查字符串是否实习实际上可能会增加开销并降低性能。在内存使用方面,插入的字符串肯定会占用更少的内存 如果您确实希望使用字符串实习,有一些更好的方法来实现它。首先也是最重要的一点是,我将把元素名放在一个充满公共字符串常量的静态类中。在您的程序源代码中找到的任何字符串文字都是绝对自动的。加载应用程序时,这些字符串将加载到实习生池中。如果您的字符串不能定义为编译时实习生准备的常量,那么我只需调用String.intern(…),而不是执行完整的三元表达式String.IsInterned(…)?…:String.Intern(…)。Intern方法将自动检查字符串是否已被暂存,如果已被暂存,则返回暂存版本,否则会将字符串添加到暂存池中,如果未被暂存,则返回暂存版本。无需手动检查您自己是否已登录
同样,我不能说手动插入字符串是否会提高性能。如果使用常量,它们将以最理想的方式自动为您保留,这是提高定期重用字符串的性能和内存使用率的最佳方法。我真诚地建议您远离手工实习,让编译器和运行时为您处理优化。当然,实习字符串有助于提高性能,但正如@jrista所说,“如果您使用常量,它们将自动为您实习,…” 以下是一些可能对您有所帮助的文章 摘要:共享内存,C#维护一个称为“intern表”的东西。这是当前引用的字符串列表。如果创建了新字符串,则会选中intern表。如果字符串已经在其中,那么这两个变量将指向intern表维护的同一内存块
我对这一点的一般建议是——自己试试看,看看是否有什么不同。。。(虽然我知道这不是你真正想要的…@Rashack我打算测试它,但我也认为这是一个有效的问题,我没有看到与文本解析直接相关的问题,例如HTML或基于XML的内容。)