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