【问题标题】:Optimize String += or Concat? [duplicate]优化 String += 还是 Concat? [复制]
【发布时间】: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()
  • @Aquillo 所以你不建议使用Float.toString()Integer.toString()
  • @MasterGberry 如果是原语,使用toString(),否则使用String.valueOf()

标签: java android


【解决方案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'来打印字符串。 把它放在一个循环中,用计时器迭代一个大数,看看有什么好处,这很有趣。

    【讨论】:

    • 当然也可以链接,在这种情况下可能会很有用。
    • 链式是一个很好的建议。在每个追加调用中链接而不是使用字符串连接将节省循环。
    猜你喜欢
    • 2012-02-18
    • 2019-02-12
    • 2014-12-05
    • 2014-12-22
    • 1970-01-01
    • 1970-01-01
    • 2014-04-11
    • 1970-01-01
    • 2011-11-26
    相关资源
    最近更新 更多