// StringBuildTest.java SJ import java.util.ArrayList; import java.util.Vector; import java.util.LinkedList; import java.util.List; import java.util.Collection; import java.util.TreeSet; import java.util.HashSet; import java.util.*; public class StringBuildTest { public static void main(String[] args) { int N = 500000; // max input size int M = 4; // tests for each input size int el = 0; // 0 : print time // 1 : print time/el // 2 : print ratio DsaTimer a = new DsaTimer("Total"); StringBuildTest l = new StringBuildTest(); if (args.length > 0) N = Integer.parseInt(args[0]); if (args.length > 1) M = Integer.parseInt(args[1]); if (args.length > 2) el = Integer.parseInt(args[2]); System.out.println("\n Warm up"); for (int i = 16; i < N/2; i*=2) { l.test(i, M/2, el); // replace el with -1 if you do not want to see warm up results } System.out.println("\n Main measurement"); System.out.print("n Vector.toString StringBuffer StringBuilder StringBuilder2 StringBuilder3 + "); if (el == 0) System.out.println("(microsec)"); else if (el == 1) System.out.println("(ns/elem)"); else if (el == 2) System.out.println("(ratioToPrev)"); for (int i = 16; i < N; i*=2) { l.test(i, M, el); } System.out.println(a); } // main() // TODO long[] prevtimes = new long[6]; /** * Test and print one input size * @param n input size * @param m number of tests * @param el what to print */ void test(int n, int m, int el) { // create input Vector v = new Vector<>(n); for (int i = 0; i < n; i++) v.add(i); long[] times = new long[6]; for (int i = 0; i < 6; i++) { times[i] = Long.MAX_VALUE; } DsaTimer a; String s; long ai; for (int j = 0; j < m; j++) { a = new DsaTimer("Vector.toString"); s = v.toString(); ai = a.stop(); if (ai < times[0]) times[0] = ai; if (n < 10 && el >= 0) System.out.println(s); a = new DsaTimer("vector2stringStringBuffer"); s = vector2stringStringBuffer(v); ai = a.stop(); if (ai < times[1]) times[1] = ai; if (n < 10 && el >= 0) System.out.println(s); a = new DsaTimer("vector2stringStringBuilder"); s = vector2stringStringBuilder(v); ai = a.stop(); if (ai < times[2]) times[2] = ai; if (n < 10 && el >= 0) System.out.println(s); a = new DsaTimer("vector2stringStringBuilder2"); s = vector2stringStringBuilder2(v); ai = a.stop(); if (ai < times[3]) times[3] = ai; if (n < 10 && el >= 0) System.out.println(s); a = new DsaTimer("vector2stringStringBuilder3"); s = vector2stringStringBuilder3(v); ai = a.stop(); if (ai < times[4]) times[4] = ai; if (n < 10 && el >= 0) System.out.println(s); if ((n <= 10000 || j == 0) && (n <= 100000)) { a = new DsaTimer("vector2stringPlus"); s = vector2stringPlus(v); ai = a.stop(); if (ai < times[5]) times[5] = ai; if (n < 10 && el >= 0) System.out.println(s); } } System.out.print(n + " "); for (int i = 0; i < 6; i++) { if (el == 0) System.out.print(" " + ((times[i] == Long.MAX_VALUE) ? "-" : times[i]/1000)); else if (el == 1) System.out.print(" " + ((times[i] == Long.MAX_VALUE) ? "-" : times[i]/n)); else if (el == 2) { if (prevtimes[i] > 0L && times[i] < Long.MAX_VALUE) System.out.print(" " + String.format("%.2f", 1.0*times[i]/prevtimes[i])); else System.out.print(" -"); prevtimes[i] = times[i]; } } System.out.println(); } String vector2stringPlus(Vector e) { String s = "["; for (int i = 0; i < e.size()-1; i++) s = s + e.get(i) + ", "; if (e.size() > 0) s = s + e.get(e.size()-1); s = s + "]"; return s; } String vector2stringStringBuilder(Vector e) { StringBuilder s = new StringBuilder("["); for (int i = 0; i < e.size()-1; i++) { s.append(e.get(i) + ", "); } if (e.size() > 0) s.append(e.get(e.size()-1)); s.append("]"); return s.toString(); } String vector2stringStringBuilder2(Vector e) { StringBuilder s = new StringBuilder("["); for (int i = 0; i < e.size()-1; i++) { s.append(e.get(i)); s.append(", "); } if (e.size() > 0) s.append(e.get(e.size()-1)); s.append("]"); return s.toString(); } String vector2stringStringBuilder3(Vector e) { StringBuilder s = new StringBuilder(e.size()*(10)); s.append("["); for (int i = 0; i < e.size()-1; i++) { s.append(e.get(i)); s.append(", "); } if (e.size() > 0) s.append(e.get(e.size()-1)); s.append("]"); return s.toString(); } String vector2stringStringBuffer(Vector e) { StringBuffer s = new StringBuffer("["); for (int i = 0; i < e.size()-1; i++) { s.append(e.get(i) + ", "); } if (e.size() > 0) s.append(e.get(e.size()-1)); s.append("]"); return s.toString(); } }