代码之家  ›  专栏  ›  技术社区  ›  CS.

在解析器中插入字符串有助于提高性能吗?

  •  6
  • CS.  · 技术社区  · 15 年前

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

    理论:

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

    这个问题的动机是这个问题 string-interning-memory .

    2 回复  |  直到 15 年前
        1
  •  2
  •   jrista    15 年前

    我不能确切地说这是否有助于你的表现。它将取决于您使用了多少个字符串,以及您创建这些字符串的实例的频率。截取通常是自动完成的,因此显式检查字符串是否被截取实际上会增加开销并降低性能。当涉及到内存使用时,内部字符串肯定可以使用较少的内存。

    如果你真的想使用弦乐节间,有一些更好的方法来实现它。首先,我将把您的元素名放在一个包含公共字符串常量的静态类中。在程序源代码中找到的任何字符串文本都是绝对和自动的。当您的应用程序被加载时,这样的字符串被加载到实习生池中。如果不能将字符串定义为编译时实习生准备的常量,那么我只需调用 string.intern(…) 而不是做完整的三元表达式 字符串。IsInterned(…)?……:string.intern(…) . intern方法将自动检查字符串是否被实习生,如果是,则返回实习生版本,否则将把字符串添加到实习生池中,如果不是,则返回。无需手动检查就可以了。

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

        2
  •  1
  •   KV Prajapati    15 年前

    当然,插入字符串有助于实现性能,但正如@jrista所说,“如果您使用常量,它们将自动为您……进行实习生操作”。

    这里有一些文章可以帮助你,

    Optimizing C# String Performance

    总结:共享内存,C维护一个称为“Intern表”的东西。这是当前引用的字符串列表。如果创建了一个新的字符串,则检查intern表。如果字符串已经在其中,那么两个变量将指向由intern表维护的同一内存块。

    http://blog.cumps.be/string-concatenation-vs-memory-allocation/