Created
August 5, 2014 14:43
-
-
Save sue445/cc0b2624794dc169b6a7 to your computer and use it in GitHub Desktop.
HashMapとLinkedHashMapのベンチマーク
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* HashMapとLinkedHashMapの性能を調べるためのベンチマーク用のテストコード | |
* | |
* テスト内容 | |
* ・乱数を100万回putして実行時間を出力 | |
* ・乱数keyで100万回getして実行時間を出力 | |
* ・mapのサイズを取得して実行時間を出力 | |
* | |
* インスタンスのメモリサイズの取得にはClassmexerを使用しているため実行時に下記オプションをつけること | |
* -javaagent:./lib/classmexer.jar | |
* via. http://blogs.yahoo.co.jp/dk521123/32941391.html | |
*/ | |
import com.javamex.classmexer.MemoryUtil; | |
import org.junit.Before; | |
import org.junit.Test; | |
import java.io.ByteArrayOutputStream; | |
import java.io.IOException; | |
import java.io.ObjectOutputStream; | |
import java.util.HashMap; | |
import java.util.LinkedHashMap; | |
import java.util.Map; | |
import java.util.Random; | |
public class MapBenchmarkTest { | |
// Mapにputする回数 | |
private static final int MAX_PUT_COUNT = 1000000; | |
// Mapからgetする回数 | |
private static final int MAX_GET_COUNT = 1000000; | |
// 乱数の上限値 | |
private static final int MAX_RANDOM_VALUE = 10000000; | |
private Random random; | |
@Before | |
public void setUp(){ | |
random = new Random(); | |
} | |
@Test | |
public void benchmarkHashMap() throws Exception{ | |
System.out.println("[HashMap]"); | |
Map<Integer, Integer> target = new HashMap<Integer, Integer>(); | |
benchmarkMapPut(target); | |
benchmarkMapGet(target); | |
printObjectSize(target); | |
} | |
@Test | |
public void benchmarkLinkedHashMap() throws Exception{ | |
System.out.println("[LinkedHashMap]"); | |
Map<Integer, Integer> target = new LinkedHashMap<Integer, Integer>(); | |
benchmarkMapPut(target); | |
benchmarkMapGet(target); | |
printObjectSize(target); | |
} | |
// Map#putのベンチマーク(100万個の乱数をMapにputする) | |
private void benchmarkMapPut(Map<Integer, Integer> target){ | |
long startTime = System.currentTimeMillis(); | |
for(int i = 0; i < MAX_PUT_COUNT; i++){ | |
int key = random.nextInt(MAX_RANDOM_VALUE); | |
int value = random.nextInt(MAX_RANDOM_VALUE); | |
target.put(key, value); | |
} | |
long endTime = System.currentTimeMillis(); | |
System.out.println("put: " + (endTime - startTime) + " ms"); | |
} | |
// Map#getのベンチマーク(100万個の乱数をMapにputする) | |
private void benchmarkMapGet(Map<Integer, Integer> target){ | |
long startTime = System.currentTimeMillis(); | |
for(int i = 0; i < MAX_GET_COUNT; i++){ | |
int key = random.nextInt(MAX_RANDOM_VALUE); | |
target.get(key); | |
} | |
long endTime = System.currentTimeMillis(); | |
System.out.println("get: " + (endTime - startTime) + " ms"); | |
} | |
private void printObjectSize(Object target) throws IOException { | |
long memorySize = MemoryUtil.deepMemoryUsageOf(target); | |
System.out.println("memory size: " + memorySize + " bytes"); | |
// byte[] array = serialize(target); | |
// System.out.println("object size: " + array.length + " bytes"); | |
} | |
private byte[] serialize(Object src) throws IOException { | |
try( | |
ByteArrayOutputStream baos = new ByteArrayOutputStream(); | |
ObjectOutputStream oos = new ObjectOutputStream(baos); | |
) { | |
oos.writeObject(src); | |
oos.flush(); | |
return baos.toByteArray(); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
実行環境
$ java -version openjdk version "1.7.0-u10-b09" OpenJDK Runtime Environment (build 1.7.0-u10-b09-20121015) OpenJDK 64-Bit Server VM (build 23.6-b03, mixed mode)