account.java

来自「java 进阶专用。」· Java 代码 · 共 78 行

JAVA
78
字号
// Compares the performance of repeated String concatenation and 
// repeated String buffer append. - Page 155

import java.util.*;

public class Account {
    private final static String LINE = "********************************************************************************";
    private final static int LINE_WIDTH = LINE.length();

    private final int numItems;

    Account(int numItems) {
        this.numItems = numItems;
    }

    public static void main(String args[]) {
        int numRuns = 3;
        int numReps = 1000;
        int numItems = 100;
        Account account = new Account(numItems);

        System.out.println("String");
        for (int i=0; i<numRuns; i++) {
            long start = System.currentTimeMillis();
            for (int k=0; k<numReps; k++)
                account.statement();
            long end = System.currentTimeMillis();
            System.out.println(end - start + " ms");
        }

        System.out.println("StringBuffer");
        for (int i=0; i<numRuns; i++) {
            long start = System.currentTimeMillis();
            for (int k=0; k<10*numReps; k++)
                account.statement2();
            long end = System.currentTimeMillis();
            System.out.println(((end - start)/10) + " ms");
        }

        System.out.println("StringBuffer without preallocation");
        for (int i=0; i<numRuns; i++) {
            long start = System.currentTimeMillis();
            for (int k=0; k<10*numReps; k++)
                account.statement3();
            long end = System.currentTimeMillis();
            System.out.println(((end - start)/10) + " ms");
        }
    }

    // Inappropriate use of string concatenation - Performs horribly!
    public String statement() {
        String s = "";
        for (int i = 0; i < numItems(); i++)
            s += lineForItem(i);  // String concatenation
        return s;
    }

    // Tuned StringBuffer version
    public String statement2() {
        StringBuffer s = new StringBuffer(numItems() * LINE_WIDTH);
        for (int i = 0; i < numItems(); i++)
            s.append(lineForItem(i));
        return s.toString();
    }

    // Detuned StringBuffer version
    public String statement3() {
        StringBuffer s = new StringBuffer();
        for (int i = 0; i < numItems(); i++)
            s.append(lineForItem(i));
        return s.toString();
    }

    private int numItems()            { return numItems; }

    private String lineForItem(int i) { return LINE; }
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?