繁体   English   中英

Java优化字符串与字符数组

[英]Java Optimization String vs Char Arrays

在我正在编写的程序中,我正在进行大量的字符串操作。 我正在努力提高性能,我想知道使用char数组是否会显示出不错的性能提升。 有什么建议?

你在做什么样的操纵? 你可以发一个代码示例吗?

您可能需要查看实现CharSequence的 StringBuilder以提高性能。 我不确定你想要自己动手。 StringBuilder不是线程安全btw ...如果你想要线程安全看看StringBuffer

String已经实现为char数组。 你有什么计划以不同的方式做什么? 无论如何,在那个和短暂对象的GC非常快的事实之间,如果你能找到一种通过替换char数组来提高性能的方法,我会感到惊讶。

Michael Borgwardt关于小字符数组和使用StringBuilder和StringBuffer的建议非常好。 但对我来说,主要的是尽量不要猜测什么是缓慢的:进行测量,使用剖析器,获得一些明确的事实。 因为通常我们对性能的猜测结果是错误的。

以下是JDK 6.0 中String类完整源代码的摘录:

 public final class String implements  java.io.Serializable,
       Comparable<String>, CharSequence {
       /** The value is used for character storage. */
        private final char value[];

       /** The offset is the first index of the storage that is used. */
       private final int offset;

        /** The count is the number of characters in the String. */
       private final int count;

正如您在内部看到的那样,该值已经存储为一个字符数组。 作为数据结构的字符数组具有String类的所有限制,适用于大多数字符串操作:Java数组不会增长,即每次(确定,可能不是每一次)您的字符串都需要增长,您需要分配新数组并复制内容。

如前所述,使用StringBuilderStringBuffer进行大多数字符串操作是有意义的。

实际上以下代码:

   String a = "a";
   a=a+"b";
   a=a+"c";

编译后会自动转换为使用StringBuilder,这可以在javap的帮助下轻松检查。

根据经验,很少有人花时间尝试提高核心Java类的性能,除非你是这方面的世界级专家,因为这个代码首先是由世界级专家编写的。

你有没有想过你的申请? 你知道瓶颈在哪里吗? 如果性能低于标准,这是第一步。 好吧,那就是定义可接受的性能指标。

一旦你完成了一些任务的分析,你将花费百分比的时间做事。 如果你花了很多时间操纵字符串,也许你可以开始缓存一些操作? 当你只做一次就足够时,你是否反复做一些(然后在需要时再次使用该结果)? 你不需要时复制字符串吗? 请记住,java.lang.String是不可变的 - 因此无法直接更改。

我在优化/性能调整系统时发现了几次我不知道慢慢来自本能的地方。 我已经看到其他人(而且,可耻的是,我自己)花了几天时间来优化那些没有收获的东西 - 因为它不是最初的瓶颈,实际上花费的时间不到1%。

希望这有助于指明您正确的方向。

当你有很多短字符串时,使用char[]可以节省相当多的内存,这也意味着更少的缓存未命中速度。

但是对于大字符串,要注意的主要是避免不必要的复制,从而导致String的不变性。 如果你做了很多连接或替换,使用StringBuilder可以产生很大的不同。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM