import java.util.Arrays; public class TestConcatSpeed { private static final int TEST_SIZE = 500; private static int avgStringLength = 0; private static String thirdString = ""; private static void setAvgStringLength(int avgStringLength) { TestConcatSpeed.avgStringLength = avgStringLength; char[] cs = new char[avgStringLength]; Arrays.fill(cs, 'c'); thirdString = new String(cs); } public static void main(String[] args) { String[] as = new String[TEST_SIZE]; String[] bs = new String[TEST_SIZE]; System.out.println("java version, repetitions, avg length, concat 2, buffer 2, builder 2, buffer 2 (LK), builder 2 (LK), concat 3, buffer 3, builder 3, buffer 3 (LK), builder 3 (LK)"); for (int i = 0; i <= 100; i += 10) { setAvgStringLength(i); performTest(as, bs); } } private static void performTest(String[] as, String[] bs) { for (int i = 0; i < as.length; i++) { char[] cs = new char[i * avgStringLength * 2 / TEST_SIZE]; Arrays.fill(cs, 'a'); as[i] = new String(cs); } for (int i = 0; i < bs.length; i++) { char[] cs = new char[i]; Arrays.fill(cs, 'a'); bs[i] = new String(cs); } //Timing timing; long start, finish; final long baseline; // 0 start = System.currentTimeMillis(); testNoop(as, bs); baseline = System.currentTimeMillis() - start; System.out.print(System.getProperty("java.version") + ", "); System.out.print(as.length * bs.length +", "); System.out.print(avgStringLength +", "); // 2 start = System.currentTimeMillis(); testConcat2(as, bs); finish = System.currentTimeMillis(); System.out.print(finish-start-baseline + ", "); start = System.currentTimeMillis(); testBuffer2(as, bs); finish = System.currentTimeMillis(); System.out.print(finish-start-baseline + ", "); start = System.currentTimeMillis(); testBuilder2(as, bs); finish = System.currentTimeMillis(); System.out.print(finish-start-baseline + ", "); start = System.currentTimeMillis(); testBufferLK2(as, bs); finish = System.currentTimeMillis(); System.out.print(finish-start-baseline + ", "); start = System.currentTimeMillis(); testBuilderLK2(as, bs); finish = System.currentTimeMillis(); System.out.print(finish-start-baseline + ", "); // 3 start = System.currentTimeMillis(); testConcat3(as, bs); finish = System.currentTimeMillis(); System.out.print(finish-start-baseline + ", "); start = System.currentTimeMillis(); testBuffer3(as, bs); finish = System.currentTimeMillis(); System.out.print(finish-start-baseline + ", "); start = System.currentTimeMillis(); testBuilder3(as, bs); finish = System.currentTimeMillis(); System.out.print(finish-start-baseline + ", "); start = System.currentTimeMillis(); testBufferLK3(as, bs); finish = System.currentTimeMillis(); System.out.print(finish-start-baseline + ", "); start = System.currentTimeMillis(); testBuilderLK3(as, bs); finish = System.currentTimeMillis(); System.out.println(finish-start-baseline); } private static void testNoop(String[] as, String[] bs) { for (int i = 0; i < as.length; i++) { for (int j = 0; j < bs.length; j++) { String a = as[i]; String b = bs[j]; } } } private static void testConcat2(String[] as, String[] bs) { for (int i = 0; i < as.length; i++) { for (int j = 0; j < bs.length; j++) { as[i].concat(bs[j]); } } } private static void testBuffer2(String[] as, String[] bs) { for (int i = 0; i < as.length; i++) { for (int j = 0; j < bs.length; j++) { StringBuffer sb = new StringBuffer(); sb.append(as[i]); sb.append(bs[j]); sb.toString(); } } } private static void testBuilder2(String[] as, String[] bs) { for (int i = 0; i < as.length; i++) { for (int j = 0; j < bs.length; j++) { StringBuilder sb = new StringBuilder(); sb.append(as[i]); sb.append(bs[j]); sb.toString(); } } } private static void testBufferLK2(String[] as, String[] bs) { for (int i = 0; i < as.length; i++) { for (int j = 0; j < bs.length; j++) { String a = as[i]; String b = bs[j]; StringBuffer sb = new StringBuffer(a.length() + b.length()); sb.append(as[i]); sb.append(bs[j]); sb.toString(); } } } private static void testBuilderLK2(String[] as, String[] bs) { for (int i = 0; i < as.length; i++) { for (int j = 0; j < bs.length; j++) { String a = as[i]; String b = bs[j]; StringBuilder sb = new StringBuilder(a.length() + b.length()); sb.append(a); sb.append(b); sb.toString(); } } } private static void testConcat3(String[] as, String[] bs) { for (int i = 0; i < as.length; i++) { for (int j = 0; j < bs.length; j++) { as[i].concat(bs[j]).concat(thirdString); } } } private static void testBuffer3(String[] as, String[] bs) { for (int i = 0; i < as.length; i++) { for (int j = 0; j < bs.length; j++) { StringBuffer sb = new StringBuffer(); sb.append(as[i]); sb.append(bs[j]); sb.append(thirdString); sb.toString(); } } } private static void testBuilder3(String[] as, String[] bs) { for (int i = 0; i < as.length; i++) { for (int j = 0; j < bs.length; j++) { StringBuilder sb = new StringBuilder(); sb.append(as[i]); sb.append(bs[j]); sb.append(thirdString); sb.toString(); } } } private static void testBufferLK3(String[] as, String[] bs) { for (int i = 0; i < as.length; i++) { for (int j = 0; j < bs.length; j++) { String a = as[i]; String b = bs[j]; StringBuffer sb = new StringBuffer(a.length() + b.length() + thirdString.length()); sb.append(as[i]); sb.append(bs[j]); sb.append(thirdString); sb.toString(); } } } private static void testBuilderLK3(String[] as, String[] bs) { for (int i = 0; i < as.length; i++) { for (int j = 0; j < bs.length; j++) { String a = as[i]; String b = bs[j]; StringBuilder sb = new StringBuilder(a.length() + b.length() + thirdString.length()); sb.append(a); sb.append(b); sb.append(thirdString); sb.toString(); } } } }