Path: blob/master/test/micro/org/openjdk/bench/java/nio/DoubleBuffers.java
41161 views
/*1* Copyright (c) 2020, 2021, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation.7*8* This code is distributed in the hope that it will be useful, but WITHOUT9* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or10* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License11* version 2 for more details (a copy is included in the LICENSE file that12* accompanied this code).13*14* You should have received a copy of the GNU General Public License version15* 2 along with this work; if not, write to the Free Software Foundation,16* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.17*18* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA19* or visit www.oracle.com if you need additional information or have any20* questions.21*/22package org.openjdk.bench.java.nio;2324import org.openjdk.jmh.annotations.Benchmark;25import org.openjdk.jmh.annotations.BenchmarkMode;26import org.openjdk.jmh.annotations.Fork;27import org.openjdk.jmh.annotations.Measurement;28import org.openjdk.jmh.annotations.Mode;29import org.openjdk.jmh.annotations.OutputTimeUnit;30import org.openjdk.jmh.annotations.Param;31import org.openjdk.jmh.annotations.Scope;32import org.openjdk.jmh.annotations.Setup;33import org.openjdk.jmh.annotations.State;34import org.openjdk.jmh.annotations.Warmup;35import java.nio.*;36import java.util.concurrent.TimeUnit;37import static java.nio.ByteOrder.*;3839/**40* Benchmark for memory access operations on java.nio.Buffer ( and its views )41*42* A large number of variants are covered. The individual benchmarks conform to43* the following convention:44* test(Direct|Heap)(Bulk|Loop)(Get|Put)Double(View)?(Swap)?(RO)?45*46* This allows to easily run a subset of particular interest. For example:47* Direct only :- "org.openjdk.bench.java.nio.DoubleBuffers.testDirect.*"48* Bulk only :- "org.openjdk.bench.java.nio.DoubleBuffers.test.*Bulk.*"49* Loop Put Swapped Views: -50* test(Direct|Heap)(Loop)(Put)Double(View)+(Swap)+"51*/52@BenchmarkMode(Mode.AverageTime)53@Warmup(iterations = 5, time = 500, timeUnit = TimeUnit.MILLISECONDS)54@Measurement(iterations = 10, time = 500, timeUnit = TimeUnit.MILLISECONDS)55@OutputTimeUnit(TimeUnit.NANOSECONDS)56@State(Scope.Thread)57@Fork(3)58public class DoubleBuffers {5960static final int CARRIER_BYTE_WIDTH = 8;6162@Param({"16", "1024", "131072"})63private int size;6465public double doubleValue;66public double[] doubleArray;6768public DoubleBuffer heapDoubleBuffer;69public DoubleBuffer heapDoubleBufferRO;70public DoubleBuffer heapByteBufferAsDoubleBufferView;71public DoubleBuffer heapByteBufferAsDoubleBufferViewRO;72public DoubleBuffer heapByteBufferAsDoubleBufferViewSwap;73public DoubleBuffer heapByteBufferAsDoubleBufferViewSwapRO;74public DoubleBuffer directByteBufferAsDoubleBufferView;75public DoubleBuffer directByteBufferAsDoubleBufferViewRO;76public DoubleBuffer directByteBufferAsDoubleBufferViewSwap;77public DoubleBuffer directByteBufferAsDoubleBufferViewSwapRO;7879@Setup80public void setup() {81doubleArray = new double[size / CARRIER_BYTE_WIDTH];8283// explicitly allocated heap carrier buffer84heapDoubleBuffer = DoubleBuffer.allocate(size / CARRIER_BYTE_WIDTH);85heapDoubleBufferRO = DoubleBuffer.allocate(size / CARRIER_BYTE_WIDTH).asReadOnlyBuffer();8687// ByteBuffer views88heapByteBufferAsDoubleBufferView = ByteBuffer.allocate(size).order(nativeOrder()).asDoubleBuffer();89heapByteBufferAsDoubleBufferViewRO = ByteBuffer.allocate(size).order(nativeOrder()).asDoubleBuffer().asReadOnlyBuffer();90directByteBufferAsDoubleBufferView = ByteBuffer.allocateDirect(size).order(nativeOrder()).asDoubleBuffer();91directByteBufferAsDoubleBufferViewRO = ByteBuffer.allocateDirect(size).order(nativeOrder()).asDoubleBuffer().asReadOnlyBuffer();9293// endianness swapped94ByteOrder nonNativeOrder = nativeOrder() == BIG_ENDIAN ? LITTLE_ENDIAN : BIG_ENDIAN;95heapByteBufferAsDoubleBufferViewSwap = ByteBuffer.allocate(size).order(nonNativeOrder).asDoubleBuffer();96heapByteBufferAsDoubleBufferViewSwapRO = ByteBuffer.allocate(size).order(nonNativeOrder).asDoubleBuffer().asReadOnlyBuffer();97directByteBufferAsDoubleBufferViewSwap = ByteBuffer.allocateDirect(size).order(nonNativeOrder).asDoubleBuffer();98directByteBufferAsDoubleBufferViewSwapRO = ByteBuffer.allocateDirect(size).order(nonNativeOrder).asDoubleBuffer().asReadOnlyBuffer();99}100101// ---------------- HELPER METHODS102103private int innerLoopGetDouble(DoubleBuffer buf) {104int r = 0;105for (int i = 0; i < buf.capacity(); i++) {106r += buf.get(i);107}108return r;109}110111private void innerLoopPutDouble(DoubleBuffer buf) {112for (int i = 0; i < buf.capacity(); i++) {113buf.put(i, doubleValue);114}115}116117// -- Heap___118119@Benchmark120public double[] testHeapBulkPutDouble() {121heapDoubleBuffer.put(0, doubleArray);122return doubleArray;123}124125@Benchmark126public double[] testHeapBulkGetDouble() {127heapDoubleBuffer.get(0, doubleArray);128return doubleArray;129}130131@Benchmark132public void testHeapLoopPutDouble() {133innerLoopPutDouble(heapDoubleBuffer);134}135136@Benchmark137public int testHeapLoopGetDouble() {138return innerLoopGetDouble(heapDoubleBuffer);139}140141// -- Heap_View_Swap_RO142143@Benchmark144public double[] testHeapBulkGetDoubleViewSwapRO() {145heapByteBufferAsDoubleBufferViewSwapRO.get(0, doubleArray);146return doubleArray;147}148149@Benchmark150public int testHeapLoopGetDoubleViewSwapRO() {151return innerLoopGetDouble(heapByteBufferAsDoubleBufferViewSwapRO);152}153154// -- Heap_View_Swap_155156@Benchmark157public double[] testHeapBulkPutDoubleViewSwap() {158heapByteBufferAsDoubleBufferViewSwap.put(0, doubleArray);159return doubleArray;160}161162@Benchmark163public double[] testHeapBulkGetDoubleViewSwap() {164heapByteBufferAsDoubleBufferViewSwap.get(0, doubleArray);165return doubleArray;166}167168@Benchmark169public void testHeapLoopPutDoubleViewSwap() {170innerLoopPutDouble(heapByteBufferAsDoubleBufferViewSwap);171}172173@Benchmark174public int testHeapLoopGetDoubleViewSwap() {175return innerLoopGetDouble(heapByteBufferAsDoubleBufferViewSwap);176}177178// -- Heap_View__RO179180@Benchmark181public double[] testHeapBulkGetDoubleViewRO() {182heapByteBufferAsDoubleBufferViewRO.get(0, doubleArray);183return doubleArray;184}185186@Benchmark187public int testHeapLoopGetDoubleViewRO() {188return innerLoopGetDouble(heapByteBufferAsDoubleBufferViewRO);189}190191// -- Heap_View__192193@Benchmark194public double[] testHeapBulkPutDoubleView() {195heapByteBufferAsDoubleBufferView.put(0, doubleArray);196return doubleArray;197}198199@Benchmark200public double[] testHeapBulkGetDoubleView() {201heapByteBufferAsDoubleBufferView.get(0, doubleArray);202return doubleArray;203}204205@Benchmark206public void testHeapLoopPutDoubleView() {207innerLoopPutDouble(heapByteBufferAsDoubleBufferView);208}209210@Benchmark211public int testHeapLoopGetDoubleView() {212return innerLoopGetDouble(heapByteBufferAsDoubleBufferView);213}214215// -- Direct_View_Swap_RO216217@Benchmark218public double[] testDirectBulkGetDoubleViewSwapRO() {219directByteBufferAsDoubleBufferViewSwapRO.get(0, doubleArray);220return doubleArray;221}222223@Benchmark224public int testDirectLoopGetDoubleViewSwapRO() {225return innerLoopGetDouble(directByteBufferAsDoubleBufferViewSwapRO);226}227228// -- Direct_View_Swap_229230@Benchmark231public double[] testDirectBulkPutDoubleViewSwap() {232directByteBufferAsDoubleBufferViewSwap.put(0, doubleArray);233return doubleArray;234}235236@Benchmark237public double[] testDirectBulkGetDoubleViewSwap() {238directByteBufferAsDoubleBufferViewSwap.get(0, doubleArray);239return doubleArray;240}241242@Benchmark243public void testDirectLoopPutDoubleViewSwap() {244innerLoopPutDouble(directByteBufferAsDoubleBufferViewSwap);245}246247@Benchmark248public int testDirectLoopGetDoubleViewSwap() {249return innerLoopGetDouble(directByteBufferAsDoubleBufferViewSwap);250}251252// -- Direct_View__RO253254@Benchmark255public double[] testDirectBulkGetDoubleViewRO() {256directByteBufferAsDoubleBufferViewRO.get(0, doubleArray);257return doubleArray;258}259260@Benchmark261public int testDirectLoopGetDoubleViewRO() {262return innerLoopGetDouble(directByteBufferAsDoubleBufferViewRO);263}264265// -- Direct_View__266267@Benchmark268public double[] testDirectBulkPutDoubleView() {269directByteBufferAsDoubleBufferView.put(0, doubleArray);270return doubleArray;271}272273@Benchmark274public double[] testDirectBulkGetDoubleView() {275directByteBufferAsDoubleBufferView.get(0, doubleArray);276return doubleArray;277}278279@Benchmark280public void testDirectLoopPutDoubleView() {281innerLoopPutDouble(directByteBufferAsDoubleBufferView);282}283284@Benchmark285public int testDirectLoopGetDoubleView() {286return innerLoopGetDouble(directByteBufferAsDoubleBufferView);287}288}289290291