代码之家  ›  专栏  ›  技术社区  ›  polygenelubricants

NET与Java的子串操作性能比较

  •  9
  • polygenelubricants  · 技术社区  · 15 年前

    获取字符串的子字符串是一种非常常见的字符串操作操作,但是我听说Java和.NET平台在性能/实现上可能有很大的差异。特别是在爪哇, java.lang.String 提供 常数 substring ,但在.NET中, System.String 提供 性能 Substring .

    4 回复  |  直到 15 年前
        1
  •  11
  •   Jon Skeet    15 年前

    在.NET中, Substring 1 -因此,获取子字符串需要复制新子字符串中的所有数据。在爪哇, substring

    每种方法各有利弊:

    • NET的方法具有更好的缓存一致性,创建的对象更少 char[] 被垃圾收集。我相信在某些情况下,在内部,它也可以使互操作变得非常容易。
    • Java的方法使得获取子字符串非常有效,可能还有其他一些操作

    在我的报告中有更多的细节 strings article .

    建筑学 是有效的,并以最可读的方式实现它。衡量性能,并优化发现瓶颈的地方。


    1 string

    对于小字符串,这是一个大的胜利。这已经够糟糕的了,所有的开销 对象,但如果还涉及到一个额外的数组,则在Java中,单个字符串可能需要大约36个字节(那是一个“手指在空中”的数字-我记不清确切的物体开销。它还将取决于您使用的虚拟机。)

        2
  •  2
  •   Carlos Muñoz Boom    15 年前

    使用反射器这是从子串(Int32,Int32)得到的

    [SecuritySafeCritical, TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")]
    public string Substring(int startIndex, int length)
    {
        return this.InternalSubStringWithChecks(startIndex, length, false);
    }
    

    如果你继续往里面走,最后一个电话就是

    internal static unsafe void wstrcpy(char* dmem, char* smem, int charCount)
    

    它使用指针复制字符。

        3
  •  1
  •   tchrikch    15 年前

    根据这一点,不是真的: C# Substring

        4
  •  0
  •   Chris Schmich    15 年前

    String after = before.Substring(0, 1).ToUpper() + before.Substring(1);
    

    假设编译器没有做一些疯狂的优化,这将创建至少四个新字符串(2) Substring 电话,a ToUpper 调用和连接)。子字符串的实现与您期望的完全一样(字符串复制),但是上面分配的三个字符串将很快变成垃圾。这样做会产生不必要的内存压力。我说“不必要”是因为你可能只需要多花一点时间就能想出一个更经济的解决方案。