Regular Motion

개발자가 상팔자

Tag: Java (page 1 of 2)

[Java] StringBuffer 사용의 중요성.

압축되지 않은 파일 리스트를 다운받는 모듈이 있다.

파일 리스트는 짧게는 100개에서 많게는 700~800개가 될 수 있다.

이때 파일 리스트가 100개 정도일 때는 시스템이 느려지지 않는데,

파일 리스트의 길이가 500을 넘어가면 심각하게 느려져서 아무것도 할 수 없었다.

의심가는 곳을 몇군데 찾아보다가 발견한 코드.

……..부끄럽다………

혹시나 해서 시간을 체크해봤더니 Queue의 길이가 500일 때 3초, 600일 때 5초, 700일 때는 9초 가까이 소요됐다.

위의 코드를 아래와 같이 수정했더니 Queue의 길이가 700을 넘을 때도 80ms 이하로 동일한 작업을 수행했다.

StringBuffer 만쉐이.

전자의 코드가 느린 이유는 Java에서 String의 Immutable한 속성때문에 String 덧셈의 결과를 저장하기 위해 계속 새로운 String 객체를 생성하게 되는데 이 과정에는 메모리 할당 + @ 등의 작업이 추가되기 때문입니다.  GC를 유발하는 등의 단점은 덤입니다.

Java에서 효율적인 문자열 덧셈!

Java에서 2개의 문자열을 더하기 위해 많이 사용하는 방법에는 약 4가지가 있다.

그리고 각각의 방법은 결과는 동일하지만 내부 처리과정이 다르고,

반복해서 사용할 경우 상황에 따라 100배 이상의 성능차이가 발생한다.

그럼 각각의 방법을 살펴보자.

 

1. s1 = s1 + s2;

이 방법은 가장 직관적이고 사용하기 쉬운 장점이 있는 반면,

Java에서 String의 immutable(불변)한 속성때문에 s1 + s2의 연산 결과를

저장하기 위해 새로운 String 객체를 생성하고 이 과정에는

메모리 할당과 같은 추가적인 비용 + Garbage가 생성된다는 큰 단점이 있습니다.

실제로 수행 속도가 가장 느리고, 테스트에 사용된 문자열의 길이가

늘어남에 따라 가장 민감하게 시간이 증가하였습니다.

s1과 s2의 길이가 5일 때 평균 350ms가 소요되었고, 20일 때, 3000ms이 소요되었습니다.

 

2. s3 = s1.concat(s2);

1번과 비슷한 특징을 갖고 있고, 테스트에 사용된 문자열의 길이가 짧을 때는  1번보다 느리게 측정되었습니다. (Java 6 기준)

s1과 s2의 길이가 5일 때 평균 480ms가 소요되었고, 20일 때,  2800ms가 소요되었습니다.

 

3. StringBuffer의 append();

추가로 객체를 생성해야 한다는 단점이 있는 반면, 문자열을 더해야되는 횟수가 늘어날수록,

문자열의 길이가 길수록 월등한 성능을 보여주었습니다.

s1과 s2의 길이에 크게 상관없이 10ms 이하가 소요되었습니다.

 

4. StringBuilder의 append();

개인적으로 테스트한 결과에서는 StringBuffer와 별 차이를 보여주지 못했지만,

StringBuilder가 Brand New한 Class고 반복횟수와 문자열의 길이가 늘어날수록

더나은 성능을 보여준다고 한다!  (참고 : http://kaioa.com/node/59)

 

 

{ Reference }

http://kaioa.com/node/59

[Android] 이어받기 기능이 적용된 File Downloader

아래 코드를 이용하여 이어받기가 적용된 파일 다운로더를 만들 수 있습니다.

Java와 Android 기반 Program에 적용하실 수 있습니다.

1. RandomAccessFile을 만들어서 원하는 위치부터 writing 할 수 있도록 준비를 하고.
2. 원하는 URL로 connection을 생성.
3. Header에 Range 정보를 추가
conn.setRequestProperty(“Range”, “bytes=” + offset + ‘-‘);
4. 다운로드 시작

이 부분이 이어받기를 위한 부분이다.

현재 파일 사이즈(fileSize)를 얻어온 다음, 이 부분부터 전송해달라고 헤더에 추가하는 부분!!

[Library] MP3 태그를 수정할 수 있는 Library!

Android의 치명적인 버그중 하나는 바로 MP3 태그가 한글(사실 영어를 제외한 언어로 보는게 맞다)로 

되어 있을 경우 정상적으로 출력되지 않는 경우가 많다는 것이다.

위와 같은 문제가 발생하는 이유는 framework내에 버그가 존재하기 때문인데 버그는 아래와 같다.

ID3tag내에 정보는 한글로 채워져 있는데 encoding에 정보가 명시적으로 정의되어 있지 않은 경우 

이를 UTF-8로 인코딩해서 처리하기 때문에 발생하는 문제로 보인다.

위와 같은 문제를 피해서 한글로 태그정보를 입력하기 위해서는 EUC-KR로 encoding해서 입력하는

방법이 있다.

MP3 Tag정보를 수정할 수 있는 JAVA 기반의 Library는 많이 나와있으나 여기서는 사용하기 가장

편리하고 업데이트도 꾸준히 되는 jaudiotagger를 사용하는 것을 권고한다.

jaudiotagger사용법은 아래와 같다. 

참고 : http://www.androidpub.com/471907 
         http://www.jthink.net/jaudiotagger/       <- Library를 다운 받을 수 있는 사이트

[JAVA] String에서 TAG를 제거하는 함수.

문자열로 아래함수를 한번 호출하여 주면 놀랍게도 문자열에 포함된 모든 태그가 제거된다.

string.replaceAll(“<(/)?([a-zA-Z]*)(\\s[a-zA-Z]*=[^>]*)?(\\s)*(/)?>”, “”);

잊지 말아야 할 것은.

string = string.replaceAll(“<(/)?([a-zA-Z]*)(\\s[a-zA-Z]*=[^>]*)?(\\s)*(/)?>”, “”);

Tag를 제거한 뒤 다시 Assign을 해줘야 한다는 것!!

Older posts

© 2018 Regular Motion

Theme by Anders NorenUp ↑