44import java .util .Random ;
55
66public class Benchmark {
7-
7+ //
88 private static final int WARMUP_INT_ARRAY_LENGTH = 100_000 ;
99 private static final int WARMUP_INT_UPPER_BOUND = 1_000 ;
1010 private static final int RANDOM_DATA_LENGTH = 1_000_000 ;
11- private static final int SPARSE_DATA_LENGTH = 10_000_000 ;
11+ private static final int SPARSE_DATA_LENGTH = 100_000_000 ;
1212 private static final int SPARSE_DATA_UPPER_BOUND = 100 ;
1313 private static final int DEGENERATE_DATA_LENGTH = 2 << 14 ;
1414
@@ -23,7 +23,8 @@ public static void main(String[] args) {
2323 warmup (random );
2424 long endTime = System .currentTimeMillis ();
2525
26- System .out .printf ("Warmed up in %d milliseconds." , endTime - startTime );
26+ System .out .printf ("Warmed up in %d milliseconds.\n " ,
27+ endTime - startTime );
2728
2829 System .out .println ("Benchmarking on random data:" );
2930
@@ -46,6 +47,7 @@ private static void warmup(final Random random) {
4647
4748 IntTreeSortV1 .sort (array1 );
4849 IntTreeSortV2 .sort (array2 );
50+ IntTreeSortV3 .sort (array3 );
4951 Arrays .sort (array4 );
5052
5153 System .out .println ();
@@ -75,6 +77,7 @@ private static int[] getRandomIntArray(final Random random) {
7577 private static void benchmarkOnRandomIntData (final Random random ) {
7678 final int [] array1 = getRandomIntArray (random );
7779 final int [] array2 = array1 .clone ();
80+ final int [] array3 = array1 .clone ();
7881 final int [] array4 = array1 .clone ();
7982
8083 long startTime = System .currentTimeMillis ();
@@ -83,7 +86,7 @@ private static void benchmarkOnRandomIntData(final Random random) {
8386
8487 long endTime = System .currentTimeMillis ();
8588
86- System .out .printf ("V1: %d milliseconds.\n " ,
89+ System .out .printf ("V1: %d milliseconds.\n " ,
8790 endTime - startTime );
8891
8992 startTime = System .currentTimeMillis ();
@@ -92,7 +95,16 @@ private static void benchmarkOnRandomIntData(final Random random) {
9295
9396 endTime = System .currentTimeMillis ();
9497
95- System .out .printf ("V2: %d milliseconds.\n " ,
98+ System .out .printf ("V2: %d milliseconds.\n " ,
99+ endTime - startTime );
100+
101+ startTime = System .currentTimeMillis ();
102+
103+ IntTreeSortV3 .sort (array3 );
104+
105+ endTime = System .currentTimeMillis ();
106+
107+ System .out .printf ("V3: %d milliseconds.\n " ,
96108 endTime - startTime );
97109
98110 startTime = System .currentTimeMillis ();
@@ -101,16 +113,18 @@ private static void benchmarkOnRandomIntData(final Random random) {
101113
102114 endTime = System .currentTimeMillis ();
103115
104- System .out .printf ("Arrays.sort : %d milliseconds.\n " ,
116+ System .out .printf ("JDK : %d milliseconds.\n " ,
105117 endTime - startTime );
106118
107119 System .out .printf ("Algorithms agree: %b.\n " ,
108120 Arrays .equals (array1 , array2 ) &&
121+ Arrays .equals (array1 , array3 ) &&
109122 Arrays .equals (array1 , array4 ));
110123
111- System .out .printf ("V1 sorted: %b.\n " , isSorted (array1 ));
112- System .out .printf ("V2 sorted: %b.\n " , isSorted (array2 ));
113- System .out .printf ("Arrays.sort sorted: %b.\n " , isSorted (array4 ));
124+ System .out .printf ("V1 sorted: %b.\n " , isSorted (array1 ));
125+ System .out .printf ("V2 sorted: %b.\n " , isSorted (array2 ));
126+ System .out .printf ("V3 sorted: %b.\n " , isSorted (array3 ));
127+ System .out .printf ("JDK sorted: %b.\n " , isSorted (array4 ));
114128
115129 System .out .println ();
116130 }
@@ -128,15 +142,16 @@ private static boolean isSorted(final int[] array) {
128142 private static void benchmarkOnDegenerateData (final Random random ) {
129143 final int [] array1 = getDegenerateData (random );
130144 final int [] array2 = array1 .clone ();
131-
145+ final int [] array3 = array1 .clone ();
146+ final int [] array4 = array1 .clone ();
132147
133148 long startTime = System .currentTimeMillis ();
134149
135150 IntTreeSortV1 .sort (array1 );
136151
137152 long endTime = System .currentTimeMillis ();
138153
139- System .out .printf ("V1: %d milliseconds.\n " ,
154+ System .out .printf ("V1: %d milliseconds.\n " ,
140155 endTime - startTime );
141156
142157 startTime = System .currentTimeMillis ();
@@ -145,21 +160,44 @@ private static void benchmarkOnDegenerateData(final Random random) {
145160
146161 endTime = System .currentTimeMillis ();
147162
148- System .out .printf ("V2: %d milliseconds.\n " ,
163+ System .out .printf ("V2: %d milliseconds.\n " ,
164+ endTime - startTime );
165+
166+ startTime = System .currentTimeMillis ();
167+
168+ IntTreeSortV3 .sort (array3 );
169+
170+ endTime = System .currentTimeMillis ();
171+
172+ System .out .printf ("V3: %d milliseconds.\n " ,
173+ endTime - startTime );
174+
175+ startTime = System .currentTimeMillis ();
176+
177+ Arrays .sort (array4 );
178+
179+ endTime = System .currentTimeMillis ();
180+
181+ System .out .printf ("JDK: %d milliseconds.\n " ,
149182 endTime - startTime );
150183
151184 System .out .printf ("Algorithms agree: %b.\n " ,
152- Arrays .equals (array1 , array2 ));
185+ Arrays .equals (array1 , array2 ) &&
186+ Arrays .equals (array1 , array3 ) &&
187+ Arrays .equals (array1 , array4 ));
153188
154- System .out .printf ("V1 sorted: %b.\n " , isSorted (array1 ));
155- System .out .printf ("V2 sorted: %b.\n " , isSorted (array2 ));
189+ System .out .printf ("V1 sorted: %b.\n " , isSorted (array1 ));
190+ System .out .printf ("V2 sorted: %b.\n " , isSorted (array2 ));
191+ System .out .printf ("V3 sorted: %b.\n " , isSorted (array3 ));
192+ System .out .printf ("JDK sorted: %b.\n " , isSorted (array4 ));
156193
157194 System .out .println ();
158195 }
159196
160197 private static void benchmarkOnSparseData (final Random random ) {
161198 final int [] array1 = getSparseData (random );
162199 final int [] array2 = array1 .clone ();
200+ final int [] array3 = array1 .clone ();
163201 final int [] array4 = array1 .clone ();
164202
165203 long startTime = System .currentTimeMillis ();
@@ -168,7 +206,7 @@ private static void benchmarkOnSparseData(final Random random) {
168206
169207 long endTime = System .currentTimeMillis ();
170208
171- System .out .printf ("V1: %d milliseconds.\n " ,
209+ System .out .printf ("V1: %d milliseconds.\n " ,
172210 endTime - startTime );
173211
174212 startTime = System .currentTimeMillis ();
@@ -177,7 +215,16 @@ private static void benchmarkOnSparseData(final Random random) {
177215
178216 endTime = System .currentTimeMillis ();
179217
180- System .out .printf ("V2: %d milliseconds.\n " ,
218+ System .out .printf ("V2: %d milliseconds.\n " ,
219+ endTime - startTime );
220+
221+ startTime = System .currentTimeMillis ();
222+
223+ IntTreeSortV3 .sort (array3 );
224+
225+ endTime = System .currentTimeMillis ();
226+
227+ System .out .printf ("V3: %d milliseconds.\n " ,
181228 endTime - startTime );
182229
183230 startTime = System .currentTimeMillis ();
@@ -186,16 +233,18 @@ private static void benchmarkOnSparseData(final Random random) {
186233
187234 endTime = System .currentTimeMillis ();
188235
189- System .out .printf ("Arrays.sort : %d milliseconds.\n " ,
236+ System .out .printf ("JDK : %d milliseconds.\n " ,
190237 endTime - startTime );
191238
192239 System .out .printf ("Algorithms agree: %b.\n " ,
193240 Arrays .equals (array1 , array2 ) &&
241+ Arrays .equals (array1 , array3 ) &&
194242 Arrays .equals (array1 , array4 ));
195243
196- System .out .printf ("V1 sorted: %b.\n " , isSorted (array1 ));
197- System .out .printf ("V2 sorted: %b.\n " , isSorted (array2 ));
198- System .out .printf ("Arrays.sort sorted: %b.\n " , isSorted (array4 ));
244+ System .out .printf ("V1 sorted: %b.\n " , isSorted (array1 ));
245+ System .out .printf ("V2 sorted: %b.\n " , isSorted (array2 ));
246+ System .out .printf ("V2 sorted: %b.\n " , isSorted (array3 ));
247+ System .out .printf ("JDK sorted: %b.\n " , isSorted (array4 ));
199248
200249 System .out .println ();
201250 }
0 commit comments