Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 插入字符串是否有助于提高解析器的性能?_C#_Performance_Parsing_String Interning - Fatal编程技术网

C# 插入字符串是否有助于提高解析器的性能?

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), ... }; 这个问题是由这个问题引起的

如果你正在解析,就说HTML吧,一旦你读了元素名,实习它会有好处吗?这里的逻辑是,这个解析器将一次又一次地解析相同的字符串(元素名)?将解析多个文档

理论:

// 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的内容。)