import gnu.trove.*;
// Map map = new HashMap(); // standard hashmap Map map = new THashMap(); // trove version of hashmap
Comparing 100000 Map.put() operations -------------------------------------------------------------- JDK average (msec): 321 Trove average (msec): 93 Difference: Trove is 3.45 times faster!Trove는 얼마나 작은가?
Comparing size of Set implementation: 1,000 Integer"s -------------------------------------------------------------- JDK size: 46216 bytes Trove size: 28856 bytesTrove의 Collection은 JDK 사용시 필요한 메모리의 62%만을 요구한다.
참고 도서 Learning Java, Second Edition |
% java -Dusetrove=true MyProgram.java
usetrove=true
public class CollectionFactory { static boolean useTrove = false; /** * Try to find the usetrove property on command line, or * in a trove.properties in the CLASSPATH * If usetrove is set to true, then set the useTrove * boolean, else leave it as false */ static { try { System.getProperties().load( Thread.currentThread(). getContextClassLoader(). getResourceAsStream("trove.properties") ); useTrove = "true".equalsIgnoreCase( ((String) System.getProperty("usetrove") ).trim() ) ? true : false; } catch (Exception e) { // do nothing. keep the default: false } }이제 useTrove 값을 이용하여 해당되는 타입의 Collection를 생성하여 반환한다.
/** * Return a hashmap based on the properties */ public static Map getHashMap() { if ( useTrove ) return new THashMap(); else return new HashMap(); } /** * Return a hashset based on the properties */ public static Set getHashSet() { if ( useTrove ) return new THashSet(); else return new HashSet(); } /** * Return a linkedlist based on the properties */ public static List getLinkedList() { if ( useTrove ) return new TLinkedList(); else return new LinkedList(); }이제 Trove를 사용할 것인지 JDK클래스를 사용할 것인지 명확하게 구별할 수 있는 방법이 생겼으니, 실제 Collection 클래스가 필요할 때에는 다음과 같이 사용한다.
Map map = CollectionFactory.getHashMap(); map.put("name", "dion"); System.out.println("name = " + map.get("name")); System.out.println("Class is: " + map.getClass());위의 코드는 프로그램에서 사용한다면, 각 경우 성공적으로 수행되는지 테스트하면서 두 가지 방법으로 실행시킬 수 있다.
dion@frag [~]> java CollectionFactory name = dion Class is: class java.util.HashMap -------------------------------------------------------------- dion@frag [~]> java -Dusetrove=true CollectionFactory name = dion Class is: class gnu.trove.THashMapTrove 기본 데이터 타입 Collections
TObjectIntHashMap intmap = new TObjectIntHashMap(); intmap.put("NumInStock", 2); int numInStock = intmap.get("NumInStock");JDK map과 Trove의 ObjectInt map의 성능을 비교하면 다음과 같다.
Comparing TObjectIntHashMap to HashMap: -------------------------------------------------------------- JDK average (msec): 502 Trove average (msec): 183 Difference: Trove is 2.74 times faster!HashMap에서 키(key)와 값(value)을 모두 정수(integer)로 사용할 경우(key = int, value = int), JDK와 Trove의 성능은 더욱 차이가 난다.
Comparing TIntIntHashMap to HashMap: -------------------------------------------------------------- JDK average (msec): 502 Trove average (msec): 67 Difference: Trove is 7.5 times faster!Trove의 기본 데이터 타입을 위한 클래스를 사용할 경우, Collection에 저장되는 자료에 특정 제한을 가할 수 있는 부대효과가 있다. 일반 HashMap의 경우, java.lang.Object를 사용하기 때문에, 사용자는 자신이 원하는 객체는 무엇이나 HashMap에 입력할 수 있다. 그러나 TintHashMap를 사용할 경우, 부적당한 자료를 입력하면 컴파일시 경고 메시지를 사용자에게 보낸다.
이전 글 : 『MySQL 시스템 관리와 프로그래밍: 자바, PHP, 펄, C, 파이썬, 개정판』의 역자 서환수님이 말하는 MySQL
다음 글 : 게오르그의 Brave GNU World 제 38 호
최신 콘텐츠