Adding basic benchmarks for IntObjectHashMap
Motivation: It needs to be fast :) Modifications: Added a simple benchmark to the microbench module. Result: Yay, benchmarks!
This commit is contained in:
parent
c6cfb683f5
commit
a5eb2e66d2
@ -81,6 +81,11 @@
|
|||||||
<version>1.7.1</version>
|
<version>1.7.1</version>
|
||||||
<scope>provided</scope>
|
<scope>provided</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>uk.co.real-logic</groupId>
|
||||||
|
<artifactId>Agrona</artifactId>
|
||||||
|
<version>0.1</version>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
<build>
|
<build>
|
||||||
|
@ -0,0 +1,192 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2015 The Netty Project
|
||||||
|
*
|
||||||
|
* The Netty Project 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 io.netty.microbenchmark.common;
|
||||||
|
|
||||||
|
import io.netty.microbench.util.AbstractMicrobenchmark;
|
||||||
|
import io.netty.util.collection.IntObjectHashMap;
|
||||||
|
import org.openjdk.jmh.annotations.Benchmark;
|
||||||
|
import org.openjdk.jmh.annotations.BenchmarkMode;
|
||||||
|
import org.openjdk.jmh.annotations.Level;
|
||||||
|
import org.openjdk.jmh.annotations.Mode;
|
||||||
|
import org.openjdk.jmh.annotations.Param;
|
||||||
|
import org.openjdk.jmh.annotations.Setup;
|
||||||
|
import org.openjdk.jmh.infra.Blackhole;
|
||||||
|
import uk.co.real_logic.agrona.collections.Int2ObjectHashMap;
|
||||||
|
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Random;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
public class IntObjectHashMapBenchmark extends AbstractMicrobenchmark {
|
||||||
|
private static final Long VALUE = Long.MAX_VALUE;
|
||||||
|
|
||||||
|
public enum MapType {
|
||||||
|
AGRONA,
|
||||||
|
NETTY
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum KeyDistribution {
|
||||||
|
HTTP2,
|
||||||
|
RANDOM
|
||||||
|
}
|
||||||
|
|
||||||
|
@Param({ "10", "100", "1000", "10000", "100000" })
|
||||||
|
public int size;
|
||||||
|
|
||||||
|
@Param
|
||||||
|
public MapType mapType;
|
||||||
|
|
||||||
|
@Param
|
||||||
|
public KeyDistribution keyDistribution;
|
||||||
|
|
||||||
|
private Environment environment;
|
||||||
|
|
||||||
|
@Setup(Level.Trial)
|
||||||
|
public void setup() {
|
||||||
|
switch(mapType) {
|
||||||
|
case AGRONA: {
|
||||||
|
environment = new AgronaEnvironment();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case NETTY: {
|
||||||
|
environment = new NettyEnvironment();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default: {
|
||||||
|
throw new IllegalStateException("Invalid mapType: " + mapType);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Benchmark
|
||||||
|
@BenchmarkMode(Mode.Throughput)
|
||||||
|
public void put(Blackhole bh) {
|
||||||
|
environment.put(bh);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Benchmark
|
||||||
|
@BenchmarkMode(Mode.Throughput)
|
||||||
|
public void lookup(Blackhole bh) {
|
||||||
|
environment.lookup(bh);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Benchmark
|
||||||
|
@BenchmarkMode(Mode.Throughput)
|
||||||
|
public void remove(Blackhole bh) {
|
||||||
|
environment.remove(bh);
|
||||||
|
}
|
||||||
|
|
||||||
|
private abstract class Environment {
|
||||||
|
final int[] keys;
|
||||||
|
Environment() {
|
||||||
|
keys = new int[size];
|
||||||
|
switch(keyDistribution) {
|
||||||
|
case HTTP2:
|
||||||
|
for (int index = 0, key = 3; index < size; ++index, key += 2) {
|
||||||
|
keys[index] = key;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case RANDOM: {
|
||||||
|
// Create a 'size' # of random integers.
|
||||||
|
Random r = new Random();
|
||||||
|
Set<Integer> keySet = new HashSet<Integer>();
|
||||||
|
while (keySet.size() < size) {
|
||||||
|
keySet.add(r.nextInt());
|
||||||
|
}
|
||||||
|
|
||||||
|
int index = 0;
|
||||||
|
for (Integer key : keySet) {
|
||||||
|
keys[index++] = key;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default: {
|
||||||
|
throw new IllegalStateException("Unknown keyDistribution: " + keyDistribution);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
abstract void put(Blackhole bh);
|
||||||
|
abstract void lookup(Blackhole bh);
|
||||||
|
abstract void remove(Blackhole bh);
|
||||||
|
}
|
||||||
|
|
||||||
|
private class AgronaEnvironment extends Environment {
|
||||||
|
private final Int2ObjectHashMap<Long> map = new Int2ObjectHashMap<Long>();
|
||||||
|
|
||||||
|
AgronaEnvironment() {
|
||||||
|
for (int key : keys) {
|
||||||
|
map.put(key, VALUE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
void put(Blackhole bh) {
|
||||||
|
Int2ObjectHashMap<Long> map = new Int2ObjectHashMap<Long>();
|
||||||
|
for (int key : keys) {
|
||||||
|
bh.consume(map.put(key, VALUE));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
void lookup(Blackhole bh) {
|
||||||
|
for (int key : keys) {
|
||||||
|
bh.consume(map.get(key));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
void remove(Blackhole bh) {
|
||||||
|
Int2ObjectHashMap<Long> copy = new Int2ObjectHashMap<Long>();
|
||||||
|
copy.putAll(map);
|
||||||
|
for (int key : keys) {
|
||||||
|
bh.consume(copy.remove(key));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private class NettyEnvironment extends Environment {
|
||||||
|
private final IntObjectHashMap<Long> map = new IntObjectHashMap<Long>();
|
||||||
|
|
||||||
|
NettyEnvironment() {
|
||||||
|
for (int key : keys) {
|
||||||
|
map.put(key, VALUE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
void put(Blackhole bh) {
|
||||||
|
IntObjectHashMap<Long> map = new IntObjectHashMap<Long>();
|
||||||
|
for (int key : keys) {
|
||||||
|
bh.consume(map.put(key, VALUE));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
void lookup(Blackhole bh) {
|
||||||
|
for (int key : keys) {
|
||||||
|
bh.consume(map.get(key));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
void remove(Blackhole bh) {
|
||||||
|
IntObjectHashMap<Long> copy = new IntObjectHashMap<Long>();
|
||||||
|
copy.putAll(map);
|
||||||
|
for (int key : keys) {
|
||||||
|
bh.consume(copy.remove(key));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user