Package org.apache.flink.runtime.memory

Source Code of org.apache.flink.runtime.memory.MemorySegmentSpeedBenchmark

/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements.  See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership.  The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License.  You may obtain a copy of the License at
*
*     http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package org.apache.flink.runtime.memory;

import java.util.Arrays;

import org.apache.flink.runtime.memorymanager.CheckedMemorySegment;
import org.apache.flink.runtime.memorymanager.SimpleMemorySegment;
import org.apache.flink.runtime.memorymanager.UnsafeMemorySegment;

/**
*
*/
public class MemorySegmentSpeedBenchmark {
 
  private static final long LONG_VALUE = 0x1234567890abcdefl;
 
  private static final int INT_VALUE = 0x12345678;
 
  private static final byte BYTE_VALUE = 0x56;
 
  @SuppressWarnings("unused")
  private static long sideEffect = 0;
 
 
  public static void main(String[] args) {
    final int SMALL_SEGMENT_SIZE = 32 * 1024;
    final int LARGE_SEGMENT_SIZE = 1024 * 1024 * 1024;
   
    final int SMALL_SEGMENTS_ROUNDS = 50000;
    final int LARGE_SEGMENT_ROUNDS = 10;
   
    final byte[] largeSegment = new byte[LARGE_SEGMENT_SIZE];
    final byte[] smallSegment = new byte[SMALL_SEGMENT_SIZE];
   
    testPutLongs(smallSegment, SMALL_SEGMENT_SIZE / 8, SMALL_SEGMENTS_ROUNDS);
    testGetLongs(smallSegment, SMALL_SEGMENT_SIZE / 8, SMALL_SEGMENTS_ROUNDS);
    testPutLongs(largeSegment, LARGE_SEGMENT_SIZE / 8, LARGE_SEGMENT_ROUNDS);
    testGetLongs(largeSegment, LARGE_SEGMENT_SIZE / 8, LARGE_SEGMENT_ROUNDS);
   
    testPutLongsBigEndian(smallSegment, SMALL_SEGMENT_SIZE / 8, SMALL_SEGMENTS_ROUNDS);
    testGetLongsBigEndian(smallSegment, SMALL_SEGMENT_SIZE / 8, SMALL_SEGMENTS_ROUNDS);
    testPutLongsBigEndian(largeSegment, LARGE_SEGMENT_SIZE / 8, LARGE_SEGMENT_ROUNDS);
    testGetLongsBigEndian(largeSegment, LARGE_SEGMENT_SIZE / 8, LARGE_SEGMENT_ROUNDS);
   
    testPutLongsLittleEndian(smallSegment, SMALL_SEGMENT_SIZE / 8, SMALL_SEGMENTS_ROUNDS);
    testGetLongsLittleEndian(smallSegment, SMALL_SEGMENT_SIZE / 8, SMALL_SEGMENTS_ROUNDS);
    testPutLongsLittleEndian(largeSegment, LARGE_SEGMENT_SIZE / 8, LARGE_SEGMENT_ROUNDS);
    testGetLongsLittleEndian(largeSegment, LARGE_SEGMENT_SIZE / 8, LARGE_SEGMENT_ROUNDS);
   
    testPutInts(smallSegment, SMALL_SEGMENT_SIZE / 4, SMALL_SEGMENTS_ROUNDS);
    testGetInts(smallSegment, SMALL_SEGMENT_SIZE / 4, SMALL_SEGMENTS_ROUNDS);
    testPutInts(largeSegment, LARGE_SEGMENT_SIZE / 4, LARGE_SEGMENT_ROUNDS);
    testGetInts(largeSegment, LARGE_SEGMENT_SIZE / 4, LARGE_SEGMENT_ROUNDS);
   
    testPutBytes(smallSegment, SMALL_SEGMENT_SIZE, SMALL_SEGMENTS_ROUNDS);
    testGetBytes(smallSegment, SMALL_SEGMENT_SIZE, SMALL_SEGMENTS_ROUNDS);
    testPutBytes(largeSegment, LARGE_SEGMENT_SIZE, LARGE_SEGMENT_ROUNDS);
    testGetBytes(largeSegment, LARGE_SEGMENT_SIZE, LARGE_SEGMENT_ROUNDS);
   
    testPutByteArrays1024(smallSegment, SMALL_SEGMENT_SIZE / 1024, SMALL_SEGMENTS_ROUNDS);
    testGetByteArrays1024(smallSegment, SMALL_SEGMENT_SIZE / 1024, SMALL_SEGMENTS_ROUNDS);
    testPutByteArrays1024(largeSegment, LARGE_SEGMENT_SIZE / 1024, LARGE_SEGMENT_ROUNDS);
    testGetByteArrays1024(largeSegment, LARGE_SEGMENT_SIZE / 1024, LARGE_SEGMENT_ROUNDS);
  }
 
  // --------------------------------------------------------------------------------------------
  //                                  LONGs
  // --------------------------------------------------------------------------------------------
 
  private static final void testPutLongs(byte[] segmentArray, int numValues, int rounds) {
    Arrays.fill(segmentArray, (byte) 0);
    CheckedMemorySegment checkedSegment = new CheckedMemorySegment(segmentArray);
    long elapsedChecked = timePutLongsChecked(checkedSegment, numValues, rounds);
    checkedSegment = null;
   
    Arrays.fill(segmentArray, (byte) 0);
    SimpleMemorySegment directSegment = new SimpleMemorySegment(segmentArray);
    long elapsedDirect = timePutLongsDirect(directSegment, numValues, rounds);
    directSegment = null;
   
    Arrays.fill(segmentArray, (byte) 0);
    UnsafeMemorySegment unsafeSegment = new UnsafeMemorySegment(segmentArray);
    long elapsedUnsafe = timePutLongsUnsafe(unsafeSegment, numValues, rounds);
    unsafeSegment = null;
   
    System.out.println(String.format("Writing %d x %d longs to %d segment: checked=%,d nsecs,  direct=%,d nsecs, unsafe=%,d nsecs.", rounds, numValues, segmentArray.length, elapsedChecked, elapsedDirect, elapsedUnsafe));
  }
 
  private static final void testGetLongs(byte[] segmentArray, int numValues, int rounds) {
    Arrays.fill(segmentArray, (byte) 0);
    CheckedMemorySegment checkedSegment = new CheckedMemorySegment(segmentArray);
    long elapsedChecked = timeGetLongsChecked(checkedSegment, numValues, rounds);
    checkedSegment = null;
   
    Arrays.fill(segmentArray, (byte) 0);
    SimpleMemorySegment directSegment = new SimpleMemorySegment(segmentArray);
    long elapsedDirect = timeGetLongsDirect(directSegment, numValues, rounds);
    directSegment = null;
   
    Arrays.fill(segmentArray, (byte) 0);
    UnsafeMemorySegment unsafeSegment = new UnsafeMemorySegment(segmentArray);
    long elapsedUnsafe = timeGetLongsUnsafe(unsafeSegment, numValues, rounds);
    unsafeSegment = null;
   
    System.out.println(String.format("Reading %d x %d longs from %d segment: checked=%,d nsecs,  direct=%,d nsecs, unsafe=%,d nsecs.", rounds, numValues, segmentArray.length, elapsedChecked, elapsedDirect, elapsedUnsafe));
  }
 
  private static long timePutLongsChecked(final CheckedMemorySegment checked, final int num, final int rounds) {
    long start = System.nanoTime();
    for (int round = 0; round < rounds; round++) {
      int offset = 0;
      for (int i = 0; i < num; i++) {
        checked.putLong(offset, LONG_VALUE);
        offset += 8;
      }
    }
    long end = System.nanoTime();
    return end - start;
  }
 
  private static long timePutLongsDirect(final SimpleMemorySegment direct, final int num, final int rounds) {
    // checked segment
    long start = System.nanoTime();
    for (int round = 0; round < rounds; round++) {
      int offset = 0;
      for (int i = 0; i < num; i++) {
        direct.putLong(offset, LONG_VALUE);
        offset += 8;
      }
    }
    long end = System.nanoTime();
    return end - start;
  }
 
  private static long timePutLongsUnsafe(final UnsafeMemorySegment unsafe, final int num, final int rounds) {
    // checked segment
    long start = System.nanoTime();
    for (int round = 0; round < rounds; round++) {
      int offset = 0;
      for (int i = 0; i < num; i++) {
        unsafe.putLong(offset, LONG_VALUE);
        offset += 8;
      }
    }
    long end = System.nanoTime();
    return end - start;
  }
 
  private static long timeGetLongsChecked(final CheckedMemorySegment checked, final int num, final int rounds) {
    long l = 0;
    long start = System.nanoTime();
    for (int round = 0; round < rounds; round++) {
      int offset = 0;
      for (int i = 0; i < num; i++) {
        l += checked.getLong(offset);
        offset += 8;
      }
    }
    long end = System.nanoTime();
    sideEffect += l;
    return end - start;
  }
 
  private static long timeGetLongsDirect(final SimpleMemorySegment direct, final int num, final int rounds) {
    long l = 0;
    long start = System.nanoTime();
    for (int round = 0; round < rounds; round++) {
      int offset = 0;
      for (int i = 0; i < num; i++) {
        l += direct.getLong(offset);
        offset += 8;
      }
    }
    long end = System.nanoTime();
    sideEffect += l;
    return end - start;
  }
 
  private static long timeGetLongsUnsafe(final UnsafeMemorySegment unsafe, final int num, final int rounds) {
    // checked segment
    long l = 0;
    long start = System.nanoTime();
    for (int round = 0; round < rounds; round++) {
      int offset = 0;
      for (int i = 0; i < num; i++) {
        l += unsafe.getLong(offset);
        offset += 8;
      }
    }
    long end = System.nanoTime();
    sideEffect += l;
    return end - start;
  }
 
  // --------------------------------------------------------------------------------------------
  //                                  LONG BIG ENDIAN
  // --------------------------------------------------------------------------------------------
 
  private static final void testPutLongsBigEndian(byte[] segmentArray, int numValues, int rounds) {
    Arrays.fill(segmentArray, (byte) 0);
    CheckedMemorySegment checkedSegment = new CheckedMemorySegment(segmentArray);
    long elapsedChecked = timePutLongsCheckedBigEndian(checkedSegment, numValues, rounds);
    checkedSegment = null;
   
    Arrays.fill(segmentArray, (byte) 0);
    SimpleMemorySegment directSegment = new SimpleMemorySegment(segmentArray);
    long elapsedDirect = timePutLongsDirectBigEndian(directSegment, numValues, rounds);
    directSegment = null;
   
    Arrays.fill(segmentArray, (byte) 0);
    UnsafeMemorySegment unsafeSegment = new UnsafeMemorySegment(segmentArray);
    long elapsedUnsafe = timePutLongsUnsafeBigEndian(unsafeSegment, numValues, rounds);
    unsafeSegment = null;
   
    System.out.println(String.format("Writing %d x %d big endian longs to %d segment: checked=%,d nsecs,  direct=%,d nsecs, unsafe=%,d nsecs.", rounds, numValues, segmentArray.length, elapsedChecked, elapsedDirect, elapsedUnsafe));
  }
 
  private static final void testGetLongsBigEndian(byte[] segmentArray, int numValues, int rounds) {
    Arrays.fill(segmentArray, (byte) 0);
    CheckedMemorySegment checkedSegment = new CheckedMemorySegment(segmentArray);
    long elapsedChecked = timeGetLongsCheckedBigEndian(checkedSegment, numValues, rounds);
    checkedSegment = null;
   
    Arrays.fill(segmentArray, (byte) 0);
    SimpleMemorySegment directSegment = new SimpleMemorySegment(segmentArray);
    long elapsedDirect = timeGetLongsDirectBigEndian(directSegment, numValues, rounds);
    directSegment = null;
   
    Arrays.fill(segmentArray, (byte) 0);
    UnsafeMemorySegment unsafeSegment = new UnsafeMemorySegment(segmentArray);
    long elapsedUnsafe = timeGetLongsUnsafeBigEndian(unsafeSegment, numValues, rounds);
    unsafeSegment = null;
   
    System.out.println(String.format("Reading %d x %d big endian longs from %d segment: checked=%,d nsecs,  direct=%,d nsecs, unsafe=%,d nsecs.", rounds, numValues, segmentArray.length, elapsedChecked, elapsedDirect, elapsedUnsafe));
  }
 
  private static long timePutLongsCheckedBigEndian(final CheckedMemorySegment checked, final int num, final int rounds) {
    long start = System.nanoTime();
    for (int round = 0; round < rounds; round++) {
      int offset = 0;
      for (int i = 0; i < num; i++) {
        checked.putLongBigEndian(offset, LONG_VALUE);
        offset += 8;
      }
    }
    long end = System.nanoTime();
    return end - start;
  }
 
  private static long timePutLongsDirectBigEndian(final SimpleMemorySegment direct, final int num, final int rounds) {
    // checked segment
    long start = System.nanoTime();
    for (int round = 0; round < rounds; round++) {
      int offset = 0;
      for (int i = 0; i < num; i++) {
        direct.putLongBigEndian(offset, LONG_VALUE);
        offset += 8;
      }
    }
    long end = System.nanoTime();
    return end - start;
  }
 
  private static long timePutLongsUnsafeBigEndian(final UnsafeMemorySegment unsafe, final int num, final int rounds) {
    // checked segment
    long start = System.nanoTime();
    for (int round = 0; round < rounds; round++) {
      int offset = 0;
      for (int i = 0; i < num; i++) {
        unsafe.putLongBigEndian(offset, LONG_VALUE);
        offset += 8;
      }
    }
    long end = System.nanoTime();
    return end - start;
  }
 
  private static long timeGetLongsCheckedBigEndian(final CheckedMemorySegment checked, final int num, final int rounds) {
    long l = 0;
    long start = System.nanoTime();
    for (int round = 0; round < rounds; round++) {
      int offset = 0;
      for (int i = 0; i < num; i++) {
        l += checked.getLongBigEndian(offset);
        offset += 8;
      }
    }
    long end = System.nanoTime();
    sideEffect += l;
    return end - start;
  }
 
  private static long timeGetLongsDirectBigEndian(final SimpleMemorySegment direct, final int num, final int rounds) {
    long l = 0;
    long start = System.nanoTime();
    for (int round = 0; round < rounds; round++) {
      int offset = 0;
      for (int i = 0; i < num; i++) {
        l += direct.getLongBigEndian(offset);
        offset += 8;
      }
    }
    long end = System.nanoTime();
    sideEffect += l;
    return end - start;
  }
 
  private static long timeGetLongsUnsafeBigEndian(final UnsafeMemorySegment unsafe, final int num, final int rounds) {
    // checked segment
    long l = 0;
    long start = System.nanoTime();
    for (int round = 0; round < rounds; round++) {
      int offset = 0;
      for (int i = 0; i < num; i++) {
        l += unsafe.getLongBigEndian(offset);
        offset += 8;
      }
    }
    long end = System.nanoTime();
    sideEffect += l;
    return end - start;
  }
 
  // --------------------------------------------------------------------------------------------
  //                                  LONG LITTLE ENDIAN
  // --------------------------------------------------------------------------------------------
 
  private static final void testPutLongsLittleEndian(byte[] segmentArray, int numValues, int rounds) {
    Arrays.fill(segmentArray, (byte) 0);
    CheckedMemorySegment checkedSegment = new CheckedMemorySegment(segmentArray);
    long elapsedChecked = timePutLongsCheckedLittleEndian(checkedSegment, numValues, rounds);
    checkedSegment = null;
   
    Arrays.fill(segmentArray, (byte) 0);
    SimpleMemorySegment directSegment = new SimpleMemorySegment(segmentArray);
    long elapsedDirect = timePutLongsDirectLittleEndian(directSegment, numValues, rounds);
    directSegment = null;
   
    Arrays.fill(segmentArray, (byte) 0);
    UnsafeMemorySegment unsafeSegment = new UnsafeMemorySegment(segmentArray);
    long elapsedUnsafe = timePutLongsUnsafeLittleEndian(unsafeSegment, numValues, rounds);
    unsafeSegment = null;
   
    System.out.println(String.format("Writing %d x %d little endian longs to %d segment: checked=%,d nsecs,  direct=%,d nsecs, unsafe=%,d nsecs.", rounds, numValues, segmentArray.length, elapsedChecked, elapsedDirect, elapsedUnsafe));
  }
 
  private static final void testGetLongsLittleEndian(byte[] segmentArray, int numValues, int rounds) {
    Arrays.fill(segmentArray, (byte) 0);
    CheckedMemorySegment checkedSegment = new CheckedMemorySegment(segmentArray);
    long elapsedChecked = timeGetLongsCheckedLittleEndian(checkedSegment, numValues, rounds);
    checkedSegment = null;
   
    Arrays.fill(segmentArray, (byte) 0);
    SimpleMemorySegment directSegment = new SimpleMemorySegment(segmentArray);
    long elapsedDirect = timeGetLongsDirectLittleEndian(directSegment, numValues, rounds);
    directSegment = null;
   
    Arrays.fill(segmentArray, (byte) 0);
    UnsafeMemorySegment unsafeSegment = new UnsafeMemorySegment(segmentArray);
    long elapsedUnsafe = timeGetLongsUnsafeLittleEndian(unsafeSegment, numValues, rounds);
    unsafeSegment = null;
   
    System.out.println(String.format("Reading %d x %d little endian longs from %d segment: checked=%,d nsecs,  direct=%,d nsecs, unsafe=%,d nsecs.", rounds, numValues, segmentArray.length, elapsedChecked, elapsedDirect, elapsedUnsafe));
  }
 
  private static long timePutLongsCheckedLittleEndian(final CheckedMemorySegment checked, final int num, final int rounds) {
    long start = System.nanoTime();
    for (int round = 0; round < rounds; round++) {
      int offset = 0;
      for (int i = 0; i < num; i++) {
        checked.putLongLittleEndian(offset, LONG_VALUE);
        offset += 8;
      }
    }
    long end = System.nanoTime();
    return end - start;
  }
 
  private static long timePutLongsDirectLittleEndian(final SimpleMemorySegment direct, final int num, final int rounds) {
    // checked segment
    long start = System.nanoTime();
    for (int round = 0; round < rounds; round++) {
      int offset = 0;
      for (int i = 0; i < num; i++) {
        direct.putLongLittleEndian(offset, LONG_VALUE);
        offset += 8;
      }
    }
    long end = System.nanoTime();
    return end - start;
  }
 
  private static long timePutLongsUnsafeLittleEndian(final UnsafeMemorySegment unsafe, final int num, final int rounds) {
    // checked segment
    long start = System.nanoTime();
    for (int round = 0; round < rounds; round++) {
      int offset = 0;
      for (int i = 0; i < num; i++) {
        unsafe.putLongLittleEndian(offset, LONG_VALUE);
        offset += 8;
      }
    }
    long end = System.nanoTime();
    return end - start;
  }
 
  private static long timeGetLongsCheckedLittleEndian(final CheckedMemorySegment checked, final int num, final int rounds) {
    long l = 0;
    long start = System.nanoTime();
    for (int round = 0; round < rounds; round++) {
      int offset = 0;
      for (int i = 0; i < num; i++) {
        l += checked.getLongLittleEndian(offset);
        offset += 8;
      }
    }
    long end = System.nanoTime();
    sideEffect += l;
    return end - start;
  }
 
  private static long timeGetLongsDirectLittleEndian(final SimpleMemorySegment direct, final int num, final int rounds) {
    long l = 0;
    long start = System.nanoTime();
    for (int round = 0; round < rounds; round++) {
      int offset = 0;
      for (int i = 0; i < num; i++) {
        l += direct.getLongLittleEndian(offset);
        offset += 8;
      }
    }
    long end = System.nanoTime();
    sideEffect += l;
    return end - start;
  }
 
  private static long timeGetLongsUnsafeLittleEndian(final UnsafeMemorySegment unsafe, final int num, final int rounds) {
    // checked segment
    long l = 0;
    long start = System.nanoTime();
    for (int round = 0; round < rounds; round++) {
      int offset = 0;
      for (int i = 0; i < num; i++) {
        l += unsafe.getLongLittleEndian(offset);
        offset += 8;
      }
    }
    long end = System.nanoTime();
    sideEffect += l;
    return end - start;
  }
 
  // --------------------------------------------------------------------------------------------
  //                                  INTs
  // --------------------------------------------------------------------------------------------
 
  private static final void testPutInts(byte[] segmentArray, int numValues, int rounds) {
    Arrays.fill(segmentArray, (byte) 0);
    CheckedMemorySegment checkedSegment = new CheckedMemorySegment(segmentArray);
    long elapsedChecked = timePutIntsChecked(checkedSegment, numValues, rounds);
    checkedSegment = null;
   
    Arrays.fill(segmentArray, (byte) 0);
    SimpleMemorySegment directSegment = new SimpleMemorySegment(segmentArray);
    long elapsedDirect = timePutIntsDirect(directSegment, numValues, rounds);
    directSegment = null;
   
    Arrays.fill(segmentArray, (byte) 0);
    UnsafeMemorySegment unsafeSegment = new UnsafeMemorySegment(segmentArray);
    long elapsedUnsafe = timePutIntsUnsafe(unsafeSegment, numValues, rounds);
    unsafeSegment = null;
   
    System.out.println(String.format("Writing %d x %d ints to %d segment: checked=%,d nsecs,  direct=%,d nsecs, unsafe=%,d nsecs.", rounds, numValues, segmentArray.length, elapsedChecked, elapsedDirect, elapsedUnsafe));
  }
 
  private static final void testGetInts(byte[] segmentArray, int numValues, int rounds) {
    Arrays.fill(segmentArray, (byte) 0);
    CheckedMemorySegment checkedSegment = new CheckedMemorySegment(segmentArray);
    long elapsedChecked = timeGetIntsChecked(checkedSegment, numValues, rounds);
    checkedSegment = null;
   
    Arrays.fill(segmentArray, (byte) 0);
    SimpleMemorySegment directSegment = new SimpleMemorySegment(segmentArray);
    long elapsedDirect = timeGetIntsDirect(directSegment, numValues, rounds);
    directSegment = null;
   
    Arrays.fill(segmentArray, (byte) 0);
    UnsafeMemorySegment unsafeSegment = new UnsafeMemorySegment(segmentArray);
    long elapsedUnsafe = timeGetIntsUnsafe(unsafeSegment, numValues, rounds);
    unsafeSegment = null;
   
    System.out.println(String.format("Reading %d x %d ints from %d segment: checked=%,d nsecs,  direct=%,d nsecs, unsafe=%,d nsecs.", rounds, numValues, segmentArray.length, elapsedChecked, elapsedDirect, elapsedUnsafe));
  }
 
  private static long timePutIntsChecked(final CheckedMemorySegment checked, final int num, final int rounds) {
    long start = System.nanoTime();
    for (int round = 0; round < rounds; round++) {
      int offset = 0;
      for (int i = 0; i < num; i++) {
        checked.putInt(offset, INT_VALUE);
        offset += 4;
      }
    }
    long end = System.nanoTime();
    return end - start;
  }
 
  private static long timePutIntsDirect(final SimpleMemorySegment direct, final int num, final int rounds) {
    // checked segment
    long start = System.nanoTime();
    for (int round = 0; round < rounds; round++) {
      int offset = 0;
      for (int i = 0; i < num; i++) {
        direct.putInt(offset, INT_VALUE);
        offset += 4;
      }
    }
    long end = System.nanoTime();
    return end - start;
  }
 
  private static long timePutIntsUnsafe(final UnsafeMemorySegment unsafe, final int num, final int rounds) {
    // checked segment
    long start = System.nanoTime();
    for (int round = 0; round < rounds; round++) {
      int offset = 0;
      for (int i = 0; i < num; i++) {
        unsafe.putInt(offset, INT_VALUE);
        offset += 4;
      }
    }
    long end = System.nanoTime();
    return end - start;
  }
 
  private static long timeGetIntsChecked(final CheckedMemorySegment checked, final int num, final int rounds) {
    int l = 0;
    long start = System.nanoTime();
    for (int round = 0; round < rounds; round++) {
      int offset = 0;
      for (int i = 0; i < num; i++) {
        l += checked.getInt(offset);
        offset += 4;
      }
    }
    long end = System.nanoTime();
    sideEffect += l;
    return end - start;
  }
 
  private static long timeGetIntsDirect(final SimpleMemorySegment direct, final int num, final int rounds) {
    int l = 0;
    long start = System.nanoTime();
    for (int round = 0; round < rounds; round++) {
      int offset = 0;
      for (int i = 0; i < num; i++) {
        l += direct.getInt(offset);
        offset += 4;
      }
    }
    long end = System.nanoTime();
    sideEffect += l;
    return end - start;
  }
 
  private static long timeGetIntsUnsafe(final UnsafeMemorySegment unsafe, final int num, final int rounds) {
    int l = 0;
    long start = System.nanoTime();
    for (int round = 0; round < rounds; round++) {
      int offset = 0;
      for (int i = 0; i < num; i++) {
        l += unsafe.getInt(offset);
        offset += 4;
      }
    }
    long end = System.nanoTime();
    sideEffect += l;
    return end - start;
  }
 
  // --------------------------------------------------------------------------------------------
  //                                  BYTEs
  // --------------------------------------------------------------------------------------------
 
  private static final void testPutBytes(byte[] segmentArray, int numValues, int rounds) {
    Arrays.fill(segmentArray, (byte) 0);
    CheckedMemorySegment checkedSegment = new CheckedMemorySegment(segmentArray);
    long elapsedChecked = timePutBytesChecked(checkedSegment, numValues, rounds);
    checkedSegment = null;
   
    Arrays.fill(segmentArray, (byte) 0);
    SimpleMemorySegment directSegment = new SimpleMemorySegment(segmentArray);
    long elapsedDirect = timePutBytesDirect(directSegment, numValues, rounds);
    directSegment = null;
   
    Arrays.fill(segmentArray, (byte) 0);
    UnsafeMemorySegment unsafeSegment = new UnsafeMemorySegment(segmentArray);
    long elapsedUnsafe = timePutBytesUnsafe(unsafeSegment, numValues, rounds);
    unsafeSegment = null;
   
    System.out.println(String.format("Writing %d x %d bytes to %d segment: checked=%,d nsecs,  direct=%,d nsecs, unsafe=%,d nsecs.", rounds, numValues, segmentArray.length, elapsedChecked, elapsedDirect, elapsedUnsafe));
  }
 
  private static final void testGetBytes(byte[] segmentArray, int numValues, int rounds) {
    Arrays.fill(segmentArray, (byte) 0);
    CheckedMemorySegment checkedSegment = new CheckedMemorySegment(segmentArray);
    long elapsedChecked = timeGetBytesChecked(checkedSegment, numValues, rounds);
    checkedSegment = null;
   
    Arrays.fill(segmentArray, (byte) 0);
    SimpleMemorySegment directSegment = new SimpleMemorySegment(segmentArray);
    long elapsedDirect = timeGetBytesDirect(directSegment, numValues, rounds);
    directSegment = null;
   
    Arrays.fill(segmentArray, (byte) 0);
    UnsafeMemorySegment unsafeSegment = new UnsafeMemorySegment(segmentArray);
    long elapsedUnsafe = timeGetBytesUnsafe(unsafeSegment, numValues, rounds);
    unsafeSegment = null;
   
    System.out.println(String.format("Reading %d x %d bytes from %d segment: checked=%,d nsecs,  direct=%,d nsecs, unsafe=%,d nsecs.", rounds, numValues, segmentArray.length, elapsedChecked, elapsedDirect, elapsedUnsafe));
  }
 
  private static long timePutBytesChecked(final CheckedMemorySegment checked, final int num, final int rounds) {
    long start = System.nanoTime();
    for (int round = 0; round < rounds; round++) {
      int offset = 0;
      for (int i = 0; i < num; i++) {
        checked.put(offset, BYTE_VALUE);
        offset++;
      }
    }
    long end = System.nanoTime();
    return end - start;
  }
 
  private static long timePutBytesDirect(final SimpleMemorySegment direct, final int num, final int rounds) {
    // checked segment
    long start = System.nanoTime();
    for (int round = 0; round < rounds; round++) {
      int offset = 0;
      for (int i = 0; i < num; i++) {
        direct.put(offset, BYTE_VALUE);
        offset++;
      }
    }
    long end = System.nanoTime();
    return end - start;
  }
 
  private static long timePutBytesUnsafe(final UnsafeMemorySegment unsafe, final int num, final int rounds) {
    // checked segment
    long start = System.nanoTime();
    for (int round = 0; round < rounds; round++) {
      int offset = 0;
      for (int i = 0; i < num; i++) {
        unsafe.put(offset, BYTE_VALUE);
        offset++;
      }
    }
    long end = System.nanoTime();
    return end - start;
  }
 
  private static long timeGetBytesChecked(final CheckedMemorySegment checked, final int num, final int rounds) {
    long start = System.nanoTime();
    for (int round = 0; round < rounds; round++) {
      int offset = 0;
      for (int i = 0; i < num; i++) {
        checked.get(offset);
        offset++;
      }
    }
    long end = System.nanoTime();
    return end - start;
  }
 
  private static long timeGetBytesDirect(final SimpleMemorySegment direct, final int num, final int rounds) {
    // checked segment
    long start = System.nanoTime();
    for (int round = 0; round < rounds; round++) {
      int offset = 0;
      for (int i = 0; i < num; i++) {
        direct.get(offset);
        offset++;
      }
    }
    long end = System.nanoTime();
    return end - start;
  }
 
  private static long timeGetBytesUnsafe(final UnsafeMemorySegment unsafe, final int num, final int rounds) {
    // checked segment
    long start = System.nanoTime();
    for (int round = 0; round < rounds; round++) {
      int offset = 0;
      for (int i = 0; i < num; i++) {
        unsafe.get(offset);
        offset++;
      }
    }
    long end = System.nanoTime();
    return end - start;
  }
 
  // --------------------------------------------------------------------------------------------
  //                                  BYTE ARRAYs
  // --------------------------------------------------------------------------------------------
 
  private static final void testPutByteArrays1024(byte[] segmentArray, int numValues, int rounds) {
    byte[] sourceArray = new byte[1024];
    for (int i = 0; i < sourceArray.length; i++) {
      sourceArray[i] = (byte) (i % Byte.MAX_VALUE);
    }

    Arrays.fill(segmentArray, (byte) 0);
    CheckedMemorySegment checkedSegment = new CheckedMemorySegment(segmentArray);
    long elapsedChecked = timePutByteArrayChecked(checkedSegment, sourceArray, numValues, rounds);
    checkedSegment = null;
   
    Arrays.fill(segmentArray, (byte) 0);
    SimpleMemorySegment directSegment = new SimpleMemorySegment(segmentArray);
    long elapsedDirect = timePutByteArrayDirect(directSegment, sourceArray, numValues, rounds);
    directSegment = null;
   
    Arrays.fill(segmentArray, (byte) 0);
    UnsafeMemorySegment unsafeSegment = new UnsafeMemorySegment(segmentArray);
    long elapsedUnsafe = timePutByteArrayUnsafe(unsafeSegment, sourceArray, numValues, rounds);
    unsafeSegment = null;
   
    System.out.println(String.format("Writing %d x %d byte[1024] to %d segment: checked=%,d nsecs,  direct=%,d nsecs, unsafe=%,d nsecs.", rounds, numValues, segmentArray.length, elapsedChecked, elapsedDirect, elapsedUnsafe));
  }
 
  private static final void testGetByteArrays1024(byte[] segmentArray, int numValues, int rounds) {
    byte[] targetArray = new byte[1024];

    Arrays.fill(segmentArray, (byte) 0);
    CheckedMemorySegment checkedSegment = new CheckedMemorySegment(segmentArray);
    long elapsedChecked = timeGetByteArrayChecked(checkedSegment, targetArray, numValues, rounds);
    checkedSegment = null;
   
    Arrays.fill(segmentArray, (byte) 0);
    SimpleMemorySegment directSegment = new SimpleMemorySegment(segmentArray);
    long elapsedDirect = timeGetByteArrayDirect(directSegment, targetArray, numValues, rounds);
    directSegment = null;
   
    Arrays.fill(segmentArray, (byte) 0);
    UnsafeMemorySegment unsafeSegment = new UnsafeMemorySegment(segmentArray);
    long elapsedUnsafe = timeGetByteArrayUnsafe(unsafeSegment, targetArray, numValues, rounds);
    unsafeSegment = null;
   
    System.out.println(String.format("Reading %d x %d byte[1024] from %d segment: checked=%,d nsecs,  direct=%,d nsecs, unsafe=%,d nsecs.", rounds, numValues, segmentArray.length, elapsedChecked, elapsedDirect, elapsedUnsafe));
  }
 

  private static long timePutByteArrayChecked(final CheckedMemorySegment checked, final byte[] source, final int num, final int rounds) {
    final int len = source.length;
   
    // checked segment
    long start = System.nanoTime();
    for (int round = 0; round < rounds; round++) {
      int offset = 0;
      for (int i = 0; i < num; i++) {
        checked.put(offset, source, 0, len);
        offset += len;
      }
    }
    long end = System.nanoTime();
    return end - start;
  }
 
  private static long timePutByteArrayDirect(final SimpleMemorySegment direct, final byte[] source, final int num, final int rounds) {
    final int len = source.length;
   
    // checked segment
    long start = System.nanoTime();
    for (int round = 0; round < rounds; round++) {
      int offset = 0;
      for (int i = 0; i < num; i++) {
        direct.put(offset, source, 0, len);
        offset += len;
      }
    }
    long end = System.nanoTime();
    return end - start;
  }
 
  private static long timePutByteArrayUnsafe(final UnsafeMemorySegment unsafe, final byte[] source, final int num, final int rounds) {
    final int len = source.length;
   
    // checked segment
    long start = System.nanoTime();
    for (int round = 0; round < rounds; round++) {
      int offset = 0;
      for (int i = 0; i < num; i++) {
        unsafe.put(offset, source, 0, len);
        offset += len;
      }
    }
    long end = System.nanoTime();
    return end - start;
  }
 
  private static long timeGetByteArrayChecked(final CheckedMemorySegment checked, final byte[] target, final int num, final int rounds) {
    final int len = target.length;
   
    // checked segment
    long start = System.nanoTime();
    for (int round = 0; round < rounds; round++) {
      int offset = 0;
      for (int i = 0; i < num; i++) {
        checked.get(offset, target, 0, len);
        offset += len;
      }
    }
    long end = System.nanoTime();
    return end - start;
  }
 
  private static long timeGetByteArrayDirect(final SimpleMemorySegment direct, final byte[] target, final int num, final int rounds) {
    final int len = target.length;
   
    // checked segment
    long start = System.nanoTime();
    for (int round = 0; round < rounds; round++) {
      int offset = 0;
      for (int i = 0; i < num; i++) {
        direct.get(offset, target, 0, len);
        offset += len;
      }
    }
    long end = System.nanoTime();
    return end - start;
  }
 
  private static long timeGetByteArrayUnsafe(final UnsafeMemorySegment unsafe, final byte[] target, final int num, final int rounds) {
    final int len = target.length;
   
    // checked segment
    long start = System.nanoTime();
    for (int round = 0; round < rounds; round++) {
      int offset = 0;
      for (int i = 0; i < num; i++) {
        unsafe.get(offset, target, 0, len);
        offset += len;
      }
    }
    long end = System.nanoTime();
    return end - start;
  }
}
TOP

Related Classes of org.apache.flink.runtime.memory.MemorySegmentSpeedBenchmark

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.