如果您正在解析,我们只需说一下HTML,一旦您阅读了元素名称,它对实习生有益吗?这里的逻辑是这个解析器会一遍又一遍地解析相同的字符串(元素名称)?并且将解析几个文档。
理论值:
// elemName is checked for null.
MarkupNode node = new MarkupNode()
{
Name = String.IsInterned(elemName) ? elemName : String.Intern(elemName),
...
};
这个问题的动机是问题string-interning-memory。
答案 0 :(得分:2)
我无法确切地说这是否会对你的表现有所帮助。这取决于您使用的字符串数量,以及创建这些字符串实例的频率。实习通常是自动完成的,因此显式检查字符串是否实际可能会增加您的开销并降低性能。在内存使用方面,内部字符串绝对可以使用更少的内存。
如果您确实希望使用字符串实习,那么有一些更好的方法可以实现它。首先,我会将您的元素名称粘贴在一个充满公共字符串常量的静态类中。在程序源代码中找到的任何字符串文字都是绝对自动实现的。加载应用程序时,此类字符串将加载到实习池中。如果您的字符串不能被定义为编译时实习生准备的常量,那么我只需调用 String.Intern(...)而不是完整的三元表达式 String.IsInterned( ......)? ...:String.Intern(...)。 Intern方法将自动检查字符串是否被实现,如果是,则返回实习版本,否则将字符串添加到实习池中,如果不是则返回。无需亲自手动检查IsInterned。
同样,我不能说手动实习字符串是否会提高性能。如果您使用常量,它们将以最佳方式自动为您实现,这是提高常规重用字符串的性能和内存使用率的最佳方法。老实说,我建议你远离手动实习,让编译器和运行时为你处理优化。
答案 1 :(得分:1)
当然,实习字符串有助于提高性能,但正如@jrista所说:“如果你使用常量,它们将自动为你实习,......”。
以下是一些文章可能对您有帮助,
Optimizing C# String Performance
摘要:共享内存,C#维护一个称为“实习表”的东西。这是当前引用的字符串列表。如果创建了新字符串,则会检查实习表。如果你的字符串已经在那里,那么两个变量都将指向由实习生表维护的同一块内存。
http://blog.cumps.be/string-concatenation-vs-memory-allocation/