반응형
Hex2Bytes
1. BigInteger(String val, int radix)
public static void main(String args[]) {
String hex = "aaaaaa";
byte[] bytes = new BigInteger(hex, 16).toByteArray();
}
2. 순수 자바
public static byte[] hexStringToByteArray(String s) {
int len = s.length();
byte[] data = new byte[len / 2];
for (int i = 0; i < len; i += 2) {
data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
+ Character.digit(s.charAt(i + 1), 16));
}
return data;
}
3. javax.xml.bind.DatatypeConverter.parseHexBinary(String lexicalXSDHexBinary)
4. org.apache.commons.codec.binary.Hex.decodeHex(char[] data)
성능 비교
BigInteger는 10^7부터는 너무 오래걸려서 테스트 불가능했다.
차트에는 BigInteger의 10^6데이터는 표현하지 않았다.
- BigInterger가 성능이 제일 좋지 않은것으로 판단된다. BigInteger라도 너무 큰 숫자를 처리하기에는 성능 이슈가 있는것으로 판단된다.
- DatatypeConverter.parseHexBinary는 작은 데이터도 평균적으로 0.15초는 적어도 소요되었다. 신기해서 소스를 보니, 아래 소스처럼 처음 수행될 때 실제 컨버터 구현체를 인스턴스화 한다. 만약 실시간성이 중요하다면, 미리 인스턴스화 하는게 좋을 것 같다.
public static java.math.BigInteger parseInteger( String lexicalXSDInteger ) {
if (theConverter == null) initConverter();
return theConverter.parseInteger( lexicalXSDInteger );
}
private static synchronized void initConverter() {
theConverter = new DatatypeConverterImpl();
}
- DatatypeConverter 초기화 시간만 제외한다면 BigInteger를 제외한 세 개는 거의 동일한 성능을 보인다.
- DatatypeConverter 또는 Hex를 기본적으로 어플리케이션에서 사용하지 않는다면, 순수자바로 구현된 hexStringToByteArray를 사용하는 것이 좋다고 생각된다.
반응형
'Java > 기본' 카테고리의 다른 글
[JAVA] Marker Interface : 아무것도 선언되지 않은 인터페이스 (0) | 2021.12.28 |
---|---|
[JAVA] Constant Interface : 상수를 정의한 인터페이스 (1) | 2021.12.28 |
[JAVA][Weblogic] java.lang.NoClassDefFoundError: Could not initialize class org.apache.poi.POIXMLDocument (0) | 2021.11.15 |
[JAVA] Runtime.addShutdownHook() : 프로그램 종료될 때 특정 작업 수행 (0) | 2021.09.16 |
[JAVA] CountDownLatch : 다른 쓰레드를 기다리는 방법 (0) | 2021.09.16 |