검색결과 리스트
글
[java] for 문의 각 Operator(Inner Size, Outer Size, Colon Operator) 별 속도 차이
비슷한 기존 글 : http://www.850530.com/51
Q. for 문을 이용하여 for 문 안의 Operator 를 변경하여
ArrayList와 Array(배열) 을 값을 가져오는 처리 속도를 비교한다.
※ 테스트 장비
1. CPU : AMD FX-4100 Quad-Core Processor
2. Ram : PC3-12800 2G * 2
3. OS : Windows 7 (32-bit)
4. java : Sun Java JRE 1.6.0.24
※ 유의사항
각 장비의 성능에 따라서 다른 결과치를 보일수 있음.
위 테스트 장비를 기준으로 처리했을때를 기준으로 평가함.
※ 테스트 프로그램
public class SeqNumber { private int seq; /*getter, setter 생략*/ } ArrayList<SeqNumber> info = new ArrayList<SeqNumber>(); int inRoopSize = 1000000; for( int i = 0; i < inRoopSize; i++ ) { SeqNumber seq = new SeqNumber(); seq.setSeq( i ); info.add( seq ); } |
※ ArrayList get 테스트 Operator
1. Inner Size |
start = System.nanoTime(); for( int i = 0; i < info.size(); i++ ) { info.get( i ).getSeq(); } end = System.nanoTime(); System.out.println( ( ( (double)( end - start ) / 1000000000 ) ) + "(sec)" ); |
2. Outer Size |
start = System.nanoTime(); int size = info.size(); for( int i = 0; i < size; i++ ) { info.get( i ).getSeq(); } end = System.nanoTime(); System.out.println( ( ( (double)( end - start ) / 1000000000 ) ) + "(sec)" ); |
3. New Type Operator : Colon Operator |
start = System.nanoTime(); for( SeqNumber lst : info ) { lst.getSeq(); } end = System.nanoTime(); System.out.println( ( ( (double)( end - start ) / 1000000000 ) ) + "(sec)" ); |
1. Inner Size | 2. Outer Size | 3. Colon Operator |
0.005541824(sec) 0.005524248(sec) 0.005493065(sec) 0.005518578(sec) 0.005482009(sec) 乃 0.005486828(sec) 0.005467551(sec) 0.005507239(sec) 0.00549505(sec) 0.005506955(sec) ☞ Good (까비) | 0.005351606(sec) 0.005340551(sec) 0.005376269(sec) 0.005351039(sec) 0.005370883(sec) 0.005331763(sec) 乃 0.005389876(sec) 0.005414256(sec) 0.005352173(sec) 0.005335731(sec) ☞ Best (오오) | 0.028813856(sec) 0.028473959(sec) 乃 0.029103576(sec) 0.028899468(sec) 0.028646601(sec) 0.029743115(sec) 0.029102158(sec) 0.028849574(sec) 0.029152052(sec) 0.028638947(sec) ☞ Bad (쓰레기 -_-) |
그러나 ! 저런 구린 성능을 내는데 ! 필요가 없는것이냐 ?!
ArrayList 를 돌렸을때는 위와 같이 성능을 내는데,
List가 아닌 배열(Array)로 선언해서 돌리게되면 말이 달라집니다.
※ 배열(Array) get 테스트 Operator
1. Inner Size |
start = System.nanoTime(); for( int i = 0; i < info.length; i++ ) { info[i].getSeq(); } end = System.nanoTime(); System.out.println( ( ( (double)( end - start ) / 1000000000 ) ) + "(sec)" ); |
2. Outer Size |
start = System.nanoTime(); int size = info.length; for( int i = 0; i < size; i++ ) { info[i].getSeq(); } end = System.nanoTime(); System.out.println( ( ( (double)( end - start ) / 1000000000 ) ) + "(sec)" ); |
3. New Type Operator : Colon Operator |
start = System.nanoTime(); for( SeqNumber lst : info ) { lst.getSeq(); } end = System.nanoTime(); System.out.println( ( ( (double)( end - start ) / 1000000000 ) ) + "(sec)" ); |
1. Inner Size | 2. Outer Size | 3. Colon Operator |
0.003044048(sec) 0.003147237(sec) 0.003017117(sec) 0.002984233(sec) 乃 0.003989467(sec) 0.003142701(sec) 0.003753608(sec) 0.003117754(sec) 0.003025622(sec) 0.003216974(sec) ☞ Good (얘도 까비) | 0.002951917(sec) 0.002892101(sec) 0.00294653(sec) 0.002955885(sec) 0.002942844(sec) 0.002953051(sec) 0.002914213(sec) 0.002881896(sec) 乃 0.002976863(sec) 0.002943412(sec) ☞ Good (까비) | 0.002832003(sec) 0.002832287(sec) 0.002842491(sec) 0.002911095(sec) 0.002850712(sec) 0.00283342(sec) 0.002797701(sec) 乃 0.002863469(sec) 0.00283994(sec) 0.002911094(sec) ☞ Best (오오) |
※ 결론
당연히 생각해보면 0.001 ~ 0.0001초 차이는 체감하기엔 극히 적은 차이이다.
구글에서 검색해본결과도 위 구문 모두 크게 차이를 나타내지 않는다고 한다.
그렇다고해서, 체감하기 적은 차이라고 해서 무시하고 사용할수 있을까 ?
어쨌든 빠른게 낫다 ?
무조건 빠른것을 원한다면 어셈블러로 코딩하는게 맞다.
우리가 자바로 프로그램을 하는 이유가 있듯이 각 문법에 장단점이 있지만,
각 프로그램에서 요구하는 형태의 상황에 따라서 적절히 쓰는게 중요하다 !
(절대, 저건 좋고 저건 나쁘다는게 아님 !)
컴파일러가 변환을 해줄때에 가장 최적의 어셈블러로 변환은 해주겠지만,
퍼포먼스를 컴파일러에만 의존하는것만이 좋은것은 아니다.
역시나 유저가....... ㅠ_ㅠ
'program > java' 카테고리의 다른 글
[java] 문자열 합치기, StringBuffer, String + String, concat 성능 비교 (0) | 2012.10.07 |
---|---|
[java] Iterator 사용법과 성능 비교 (0) | 2012.10.07 |
[java] 우편번호 DB에 가져오기, 우편번호 검색기 넣는 방법 (0) | 2012.10.05 |
[java] for 문에서 객체의 size 선언법 (0) | 2012.10.05 |
[java] 문자열(String) 나누기, Split VS SubString (0) | 2012.10.05 |