• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2010 Google Inc.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package benchmarks.regression;
18 
19 import com.google.caliper.Param;
20 import java.io.File;
21 import java.io.IOException;
22 import java.io.RandomAccessFile;
23 import java.nio.ByteBuffer;
24 import java.nio.ByteOrder;
25 import java.nio.CharBuffer;
26 import java.nio.DoubleBuffer;
27 import java.nio.FloatBuffer;
28 import java.nio.IntBuffer;
29 import java.nio.LongBuffer;
30 import java.nio.ShortBuffer;
31 import java.nio.channels.FileChannel;
32 
33 public class ByteBufferBenchmark {
34     public enum MyByteOrder {
35         BIG(ByteOrder.BIG_ENDIAN), LITTLE(ByteOrder.LITTLE_ENDIAN);
36         final ByteOrder byteOrder;
MyByteOrder(ByteOrder byteOrder)37         MyByteOrder(ByteOrder byteOrder) {
38             this.byteOrder = byteOrder;
39         }
40     }
41 
42     @Param private MyByteOrder byteOrder;
43 
44     @Param({"true", "false"}) private boolean aligned;
45 
46     enum MyBufferType {
47         DIRECT, HEAP, MAPPED;
48     }
49     @Param private MyBufferType bufferType;
50 
newBuffer(MyByteOrder byteOrder, boolean aligned, MyBufferType bufferType)51     public static ByteBuffer newBuffer(MyByteOrder byteOrder, boolean aligned, MyBufferType bufferType) throws IOException {
52         int size = aligned ? 8192 : 8192 + 8 + 1;
53         ByteBuffer result = null;
54         switch (bufferType) {
55         case DIRECT:
56             result = ByteBuffer.allocateDirect(size);
57             break;
58         case HEAP:
59             result = ByteBuffer.allocate(size);
60             break;
61         case MAPPED:
62             File tmpFile = new File("/sdcard/bm.tmp");
63             if (new File("/tmp").isDirectory()) {
64                 // We're running on the desktop.
65                 tmpFile = File.createTempFile("MappedByteBufferTest", ".tmp");
66             }
67             tmpFile.createNewFile();
68             tmpFile.deleteOnExit();
69             RandomAccessFile raf = new RandomAccessFile(tmpFile, "rw");
70             raf.setLength(8192*8);
71             FileChannel fc = raf.getChannel();
72             result = fc.map(FileChannel.MapMode.READ_WRITE, 0, fc.size());
73             break;
74         }
75         result.order(byteOrder.byteOrder);
76         result.position(aligned ? 0 : 1);
77         return result;
78     }
79 
80     //
81     // peeking
82     //
83 
timeByteBuffer_getByte(int reps)84     public void timeByteBuffer_getByte(int reps) throws Exception {
85         ByteBuffer src = ByteBufferBenchmark.newBuffer(byteOrder, aligned, bufferType);
86         for (int rep = 0; rep < reps; ++rep) {
87             src.position(aligned ? 0 : 1);
88             for (int i = 0; i < 1024; ++i) {
89                 src.get();
90             }
91         }
92     }
93 
timeByteBuffer_getByteArray(int reps)94     public void timeByteBuffer_getByteArray(int reps) throws Exception {
95         ByteBuffer src = ByteBufferBenchmark.newBuffer(byteOrder, aligned, bufferType);
96         byte[] dst = new byte[1024];
97         for (int rep = 0; rep < reps; ++rep) {
98             for (int i = 0; i < 1024; ++i) {
99                 src.position(aligned ? 0 : 1);
100                 src.get(dst);
101             }
102         }
103     }
104 
timeByteBuffer_getByte_indexed(int reps)105     public void timeByteBuffer_getByte_indexed(int reps) throws Exception {
106         ByteBuffer src = ByteBufferBenchmark.newBuffer(byteOrder, aligned, bufferType);
107         for (int rep = 0; rep < reps; ++rep) {
108             src.position(aligned ? 0 : 1);
109             for (int i = 0; i < 1024; ++i) {
110                 src.get(i);
111             }
112         }
113     }
114 
timeByteBuffer_getChar(int reps)115     public void timeByteBuffer_getChar(int reps) throws Exception {
116         ByteBuffer src = ByteBufferBenchmark.newBuffer(byteOrder, aligned, bufferType);
117         for (int rep = 0; rep < reps; ++rep) {
118             src.position(aligned ? 0 : 1);
119             for (int i = 0; i < 1024; ++i) {
120                 src.getChar();
121             }
122         }
123     }
124 
timeCharBuffer_getCharArray(int reps)125     public void timeCharBuffer_getCharArray(int reps) throws Exception {
126         CharBuffer src = ByteBufferBenchmark.newBuffer(byteOrder, aligned, bufferType).asCharBuffer();
127         char[] dst = new char[1024];
128         for (int rep = 0; rep < reps; ++rep) {
129             for (int i = 0; i < 1024; ++i) {
130                 src.position(0);
131                 src.get(dst);
132             }
133         }
134     }
135 
timeByteBuffer_getChar_indexed(int reps)136     public void timeByteBuffer_getChar_indexed(int reps) throws Exception {
137         ByteBuffer src = ByteBufferBenchmark.newBuffer(byteOrder, aligned, bufferType);
138         for (int rep = 0; rep < reps; ++rep) {
139             src.position(aligned ? 0 : 1);
140             for (int i = 0; i < 1024; ++i) {
141                 src.getChar(i * 2);
142             }
143         }
144     }
145 
timeByteBuffer_getDouble(int reps)146     public void timeByteBuffer_getDouble(int reps) throws Exception {
147         ByteBuffer src = ByteBufferBenchmark.newBuffer(byteOrder, aligned, bufferType);
148         for (int rep = 0; rep < reps; ++rep) {
149             src.position(aligned ? 0 : 1);
150             for (int i = 0; i < 1024; ++i) {
151                 src.getDouble();
152             }
153         }
154     }
155 
timeDoubleBuffer_getDoubleArray(int reps)156     public void timeDoubleBuffer_getDoubleArray(int reps) throws Exception {
157         DoubleBuffer src = ByteBufferBenchmark.newBuffer(byteOrder, aligned, bufferType).asDoubleBuffer();
158         double[] dst = new double[1024];
159         for (int rep = 0; rep < reps; ++rep) {
160             for (int i = 0; i < 1024; ++i) {
161                 src.position(0);
162                 src.get(dst);
163             }
164         }
165     }
166 
timeByteBuffer_getFloat(int reps)167     public void timeByteBuffer_getFloat(int reps) throws Exception {
168         ByteBuffer src = ByteBufferBenchmark.newBuffer(byteOrder, aligned, bufferType);
169         for (int rep = 0; rep < reps; ++rep) {
170             src.position(aligned ? 0 : 1);
171             for (int i = 0; i < 1024; ++i) {
172                 src.getFloat();
173             }
174         }
175     }
176 
timeFloatBuffer_getFloatArray(int reps)177     public void timeFloatBuffer_getFloatArray(int reps) throws Exception {
178         FloatBuffer src = ByteBufferBenchmark.newBuffer(byteOrder, aligned, bufferType).asFloatBuffer();
179         float[] dst = new float[1024];
180         for (int rep = 0; rep < reps; ++rep) {
181             for (int i = 0; i < 1024; ++i) {
182                 src.position(0);
183                 src.get(dst);
184             }
185         }
186     }
187 
timeByteBuffer_getInt(int reps)188     public void timeByteBuffer_getInt(int reps) throws Exception {
189         ByteBuffer src = ByteBufferBenchmark.newBuffer(byteOrder, aligned, bufferType);
190         for (int rep = 0; rep < reps; ++rep) {
191             src.position(aligned ? 0 : 1);
192             for (int i = 0; i < 1024; ++i) {
193                 src.getInt();
194             }
195         }
196     }
197 
timeIntBuffer_getIntArray(int reps)198     public void timeIntBuffer_getIntArray(int reps) throws Exception {
199         IntBuffer src = ByteBufferBenchmark.newBuffer(byteOrder, aligned, bufferType).asIntBuffer();
200         int[] dst = new int[1024];
201         for (int rep = 0; rep < reps; ++rep) {
202             for (int i = 0; i < 1024; ++i) {
203                 src.position(0);
204                 src.get(dst);
205             }
206         }
207     }
208 
timeByteBuffer_getLong(int reps)209     public void timeByteBuffer_getLong(int reps) throws Exception {
210         ByteBuffer src = ByteBufferBenchmark.newBuffer(byteOrder, aligned, bufferType);
211         for (int rep = 0; rep < reps; ++rep) {
212             src.position(aligned ? 0 : 1);
213             for (int i = 0; i < 1024; ++i) {
214                 src.getLong();
215             }
216         }
217     }
218 
timeLongBuffer_getLongArray(int reps)219     public void timeLongBuffer_getLongArray(int reps) throws Exception {
220         LongBuffer src = ByteBufferBenchmark.newBuffer(byteOrder, aligned, bufferType).asLongBuffer();
221         long[] dst = new long[1024];
222         for (int rep = 0; rep < reps; ++rep) {
223             for (int i = 0; i < 1024; ++i) {
224                 src.position(0);
225                 src.get(dst);
226             }
227         }
228     }
229 
timeByteBuffer_getShort(int reps)230     public void timeByteBuffer_getShort(int reps) throws Exception {
231         ByteBuffer src = ByteBufferBenchmark.newBuffer(byteOrder, aligned, bufferType);
232         for (int rep = 0; rep < reps; ++rep) {
233             src.position(aligned ? 0 : 1);
234             for (int i = 0; i < 1024; ++i) {
235                 src.getShort();
236             }
237         }
238     }
239 
timeShortBuffer_getShortArray(int reps)240     public void timeShortBuffer_getShortArray(int reps) throws Exception {
241         ShortBuffer src = ByteBufferBenchmark.newBuffer(byteOrder, aligned, bufferType).asShortBuffer();
242         short[] dst = new short[1024];
243         for (int rep = 0; rep < reps; ++rep) {
244             for (int i = 0; i < 1024; ++i) {
245                 src.position(0);
246                 src.get(dst);
247             }
248         }
249     }
250 
251     //
252     // poking
253     //
254 
timeByteBuffer_putByte(int reps)255     public void timeByteBuffer_putByte(int reps) throws Exception {
256         ByteBuffer src = ByteBufferBenchmark.newBuffer(byteOrder, aligned, bufferType);
257         for (int rep = 0; rep < reps; ++rep) {
258             src.position(0);
259             for (int i = 0; i < 1024; ++i) {
260                 src.put((byte) 0);
261             }
262         }
263     }
264 
timeByteBuffer_putByteArray(int reps)265     public void timeByteBuffer_putByteArray(int reps) throws Exception {
266         ByteBuffer dst = ByteBufferBenchmark.newBuffer(byteOrder, aligned, bufferType);
267         byte[] src = new byte[1024];
268         for (int rep = 0; rep < reps; ++rep) {
269             for (int i = 0; i < 1024; ++i) {
270                 dst.position(aligned ? 0 : 1);
271                 dst.put(src);
272             }
273         }
274     }
275 
timeByteBuffer_putChar(int reps)276     public void timeByteBuffer_putChar(int reps) throws Exception {
277         ByteBuffer src = ByteBufferBenchmark.newBuffer(byteOrder, aligned, bufferType);
278         for (int rep = 0; rep < reps; ++rep) {
279             src.position(aligned ? 0 : 1);
280             for (int i = 0; i < 1024; ++i) {
281                 src.putChar(' ');
282             }
283         }
284     }
285 
timeCharBuffer_putCharArray(int reps)286     public void timeCharBuffer_putCharArray(int reps) throws Exception {
287         CharBuffer dst = ByteBufferBenchmark.newBuffer(byteOrder, aligned, bufferType).asCharBuffer();
288         char[] src = new char[1024];
289         for (int rep = 0; rep < reps; ++rep) {
290             for (int i = 0; i < 1024; ++i) {
291                 dst.position(0);
292                 dst.put(src);
293             }
294         }
295     }
296 
timeByteBuffer_putDouble(int reps)297     public void timeByteBuffer_putDouble(int reps) throws Exception {
298         ByteBuffer src = ByteBufferBenchmark.newBuffer(byteOrder, aligned, bufferType);
299         for (int rep = 0; rep < reps; ++rep) {
300             src.position(aligned ? 0 : 1);
301             for (int i = 0; i < 1024; ++i) {
302                 src.putDouble(0.0);
303             }
304         }
305     }
306 
timeDoubleBuffer_putDoubleArray(int reps)307     public void timeDoubleBuffer_putDoubleArray(int reps) throws Exception {
308         DoubleBuffer dst = ByteBufferBenchmark.newBuffer(byteOrder, aligned, bufferType).asDoubleBuffer();
309         double[] src = new double[1024];
310         for (int rep = 0; rep < reps; ++rep) {
311             for (int i = 0; i < 1024; ++i) {
312                 dst.position(0);
313                 dst.put(src);
314             }
315         }
316     }
317 
timeByteBuffer_putFloat(int reps)318     public void timeByteBuffer_putFloat(int reps) throws Exception {
319         ByteBuffer src = ByteBufferBenchmark.newBuffer(byteOrder, aligned, bufferType);
320         for (int rep = 0; rep < reps; ++rep) {
321             src.position(aligned ? 0 : 1);
322             for (int i = 0; i < 1024; ++i) {
323                 src.putFloat(0.0f);
324             }
325         }
326     }
327 
timeFloatBuffer_putFloatArray(int reps)328     public void timeFloatBuffer_putFloatArray(int reps) throws Exception {
329         FloatBuffer dst = ByteBufferBenchmark.newBuffer(byteOrder, aligned, bufferType).asFloatBuffer();
330         float[] src = new float[1024];
331         for (int rep = 0; rep < reps; ++rep) {
332             for (int i = 0; i < 1024; ++i) {
333                 dst.position(0);
334                 dst.put(src);
335             }
336         }
337     }
338 
timeByteBuffer_putInt(int reps)339     public void timeByteBuffer_putInt(int reps) throws Exception {
340         ByteBuffer src = ByteBufferBenchmark.newBuffer(byteOrder, aligned, bufferType);
341         for (int rep = 0; rep < reps; ++rep) {
342             src.position(aligned ? 0 : 1);
343             for (int i = 0; i < 1024; ++i) {
344                 src.putInt(0);
345             }
346         }
347     }
348 
timeIntBuffer_putIntArray(int reps)349     public void timeIntBuffer_putIntArray(int reps) throws Exception {
350         IntBuffer dst = ByteBufferBenchmark.newBuffer(byteOrder, aligned, bufferType).asIntBuffer();
351         int[] src = new int[1024];
352         for (int rep = 0; rep < reps; ++rep) {
353             for (int i = 0; i < 1024; ++i) {
354                 dst.position(0);
355                 dst.put(src);
356             }
357         }
358     }
359 
timeByteBuffer_putLong(int reps)360     public void timeByteBuffer_putLong(int reps) throws Exception {
361         ByteBuffer src = ByteBufferBenchmark.newBuffer(byteOrder, aligned, bufferType);
362         for (int rep = 0; rep < reps; ++rep) {
363             src.position(aligned ? 0 : 1);
364             for (int i = 0; i < 1024; ++i) {
365                 src.putLong(0L);
366             }
367         }
368     }
369 
timeLongBuffer_putLongArray(int reps)370     public void timeLongBuffer_putLongArray(int reps) throws Exception {
371         LongBuffer dst = ByteBufferBenchmark.newBuffer(byteOrder, aligned, bufferType).asLongBuffer();
372         long[] src = new long[1024];
373         for (int rep = 0; rep < reps; ++rep) {
374             for (int i = 0; i < 1024; ++i) {
375                 dst.position(0);
376                 dst.put(src);
377             }
378         }
379     }
380 
timeByteBuffer_putShort(int reps)381     public void timeByteBuffer_putShort(int reps) throws Exception {
382         ByteBuffer src = ByteBufferBenchmark.newBuffer(byteOrder, aligned, bufferType);
383         for (int rep = 0; rep < reps; ++rep) {
384             src.position(aligned ? 0 : 1);
385             for (int i = 0; i < 1024; ++i) {
386                 src.putShort((short) 0);
387             }
388         }
389     }
390 
timeShortBuffer_putShortArray(int reps)391     public void timeShortBuffer_putShortArray(int reps) throws Exception {
392         ShortBuffer dst = ByteBufferBenchmark.newBuffer(byteOrder, aligned, bufferType).asShortBuffer();
393         short[] src = new short[1024];
394         for (int rep = 0; rep < reps; ++rep) {
395             for (int i = 0; i < 1024; ++i) {
396                 dst.position(0);
397                 dst.put(src);
398             }
399         }
400     }
401 
402 /*
403     public void time_new_byteArray(int reps) throws Exception {
404         for (int rep = 0; rep < reps; ++rep) {
405             byte[] bs = new byte[8192];
406         }
407     }
408 
409     public void time_ByteBuffer_allocate(int reps) throws Exception {
410         for (int rep = 0; rep < reps; ++rep) {
411             ByteBuffer bs = ByteBuffer.allocate(8192);
412         }
413     }
414     */
415 }
416