[java] for 문의 각 Operator(Inner Size, Outer Size, Colon Operator) 별 속도 차이

program/java 2012. 10. 7. 16:22
반응형

비슷한 기존 글 : 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초 차이는 체감하기엔 극히 적은 차이이다. 

구글에서 검색해본결과도 위 구문 모두 크게 차이를 나타내지 않는다고 한다.


그렇다고해서, 체감하기 적은 차이라고 해서 무시하고 사용할수 있을까 ?


어쨌든 빠른게 낫다 ?


무조건 빠른것을 원한다면 어셈블러로 코딩하는게 맞다.

우리가 자바로 프로그램을 하는 이유가 있듯이 각 문법에 장단점이 있지만,

각 프로그램에서 요구하는 형태의 상황에 따라서 적절히 쓰는게 중요하다 !

(절대, 저건 좋고 저건 나쁘다는게 아님 !)


컴파일러가 변환을 해줄때에 가장 최적의 어셈블러로 변환은 해주겠지만,

퍼포먼스를 컴파일러에만 의존하는것만이 좋은것은 아니다.


역시나 유저가....... ㅠ_ㅠ

반응형