如何在循环中重用StringBuilder?

问题描述 投票:0回答:1

这里尝试做的是通过在循环外使用 StringBuilder 来提高速度性能,并在每个循环中清除 StringBuilder 以供重用,但似乎这种方法并不总是有效,因为我没有看到速度性能的改进.*

public class Loader implements Runnable {

    private int i;

    public Loader(int i) {
        this.i = i;
    }

    @Override
    public void run() {
        long start = System.currentTimeMillis();

        try {
            PrintWriter writer = new PrintWriter("res/NUMBERS " + i + ".txt");

            char letters[] = {'У', 'К', 'Е', 'Н', 'Х', 'В', 'А', 'Р', 'О', 'С', 'М', 'Т'};
            StringBuilder stringBuilder = new StringBuilder();

            for (int regionCode = 1; regionCode <= 199; regionCode++) {

                  stringBuilder.setLength(0);

                for (int number = 1; number < 1000; number++) {


                    for (char firstLetter : letters) {
                        for (char secondLetter : letters) {
                            for (char thirdLetter : letters) {
                                stringBuilder.append(firstLetter)
                                        .append(padNumber(number, 3))
                                        .append(secondLetter)
                                        .append(thirdLetter)
                                        .append(padNumber(regionCode, 2))
                                        .append("\n");
                            }
                        }
                    }
                }

                writer.write(stringBuilder.toString());
            }

            writer.flush();
            writer.close();
            System.out.println(System.currentTimeMillis() - start);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private static String padNumber(int number, int numberLength) {

        String numberStr = Integer.toString(number);

        int padSize = numberLength - numberStr.length();

        for(int i=0;i<padSize;i++) {
            numberStr = '0' + numberStr;
        }

        return numberStr;
    }


    public static void main(String[] args) {
        for (int i = 0; i < 1; i++) {
            new Thread(new Loader(i)).start();
        }
    }
}

当我在循环内使用 StringBuilder 时,该过程需要 30 秒才能完成,但使用上面所示的方法需要 50 秒才能完成该过程,这不是我所期望的。提前致谢。

java stringbuilder
1个回答
0
投票

setLength
比 StringBuilder 的构造函数更耗时。当然,在开始纳秒级测量之前您不会看到差异,但是通过重用 StringBuilder 的同一实例来节省时间的想法是错误的。

如果您的重点只是加快流程,那么这样的东西将是并发的一个很好的选择。

© www.soinside.com 2019 - 2024. All rights reserved.