优化 String += 还是 Concat? [复制]

Posted

技术标签:

【中文标题】优化 String += 还是 Concat? [复制]【英文标题】:Optimize String += or Concat? [duplicate] 【发布时间】:2013-04-05 12:00:09 【问题描述】:

我正在编写一个可能包含 1000 个数据点的文件。我有所有这些课程,目前正在最后写入所有数据(数据点以 1s 的间隔获取)。我目前正在做的事情写在下面,而且很慢。更改将字符串/字节写入文件的方式会更好吗?还是在应用程序运行时将此信息写入某个文件指针会更好?

顺便说一句,getAccuracy() 之类的所有东西都是浮点数/整数(因此它也必须转换它们)。

fileStr = "";
        fileStr += "timestamp,Accuracy,Altitude,Latitude,Longitude,GPSSatelliteEntries\r\n";
        for (Iterator<Entry> i = entries.iterator(); i.hasNext(); ) 
            Entry item = i.next();
            long ts = item.getTs();
            DataEntry d = item.getD();
            List<GPSSatelliteEntry> satellites = item.getG();

            // write stuff
            fileStr += ts + ",";
            fileStr += d.getAccuracy() + "," + d.getAltitude() + "," + d.getLatittude() + "," + d.getLongitude() + ",";
            fileStr += "[";
            boolean entered = false;
            for (Iterator<GPSSatelliteEntry> j = satellites.iterator(); j.hasNext(); ) 
                GPSSatelliteEntry item2 = j.next();
                entered = true;
                fileStr += "(" + item2.getAzimuth() + "," + item2.getElevation() + "," + item2.getPrn() + "," + item2.getSnr() + "),";
            
            // chop off extra ,
            if (entered)
                fileStr = fileStr.substring(0, fileStr.length() - 1);
            fileStr += "]";
            fileStr += "\r\n";
        

【问题讨论】:

StringBuilder/Buffer woot woot! 对于整数和浮点数(或整数和浮点数),我建议使用 String.valueOf() 见***.com/questions/47605/… @Aquillo 所以你不建议使用Float.toString()Integer.toString() @MasterGberry 如果是原语,使用toString(),否则使用String.valueOf() 【参考方案1】:

每当您使用字符串时,请使用StringBuilderStringBuffer 以获得更好的性能。

别忘了String就是immutable,每次修改String都会创建一个新的实例,这会降低性能。

【讨论】:

究竟什么是“努力工作”?如果 String 是不可变的,那么如何修改它呢?以及如何创建一个新的“字符串”“成本性能”? 任何工作都很辛苦,我建议尽可能少做。创建一个新字符串会“降低性能”,因为在创建字符串时会发生与内存分配、指针和其他事情相关的操作。使用类似 StringBuilder 的东西可以让您节省这种开销,因为您使用的是单个对象。当应用于大型数据集时,您会发现性能存在显着差异。【参考方案2】:

很可能是string buffer

线程安全、可变的字符序列。字符串缓冲区类似于字符串,但可以修改。

或前往string builder

【讨论】:

【参考方案3】:
StringBuilder stuff = new StringBuilder();
stuff.append("PUT YOUR STRINGS HERE");
stuff.append("PUT YOUR STRINGS HERE");

然后你可以使用'stuff'来打印字符串。 把它放在一个循环中,用计时器迭代一个大数,看看有什么好处,这很有趣。

【讨论】:

当然也可以链接,在这种情况下可能会很有用。 链式是一个很好的建议。在每个追加调用中链接而不是使用字符串连接将节省循环。

以上是关于优化 String += 还是 Concat? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

java中String,StringBuilder,StringBuffer实现原理,优化

对String类型的认识以及编译器优化

题解 string

Javascript中String

HDU 5890 Eighty seven(DP+bitset优化)

Lua中string.format占位符的使用