<a target="_blank" href="http://todayhumor.com/?programmer_22747">http://todayhumor.com/?programmer_22747</a> <br> <br>지난 링크에서 for 문 사용할 때 List의 size 호출 관련 효율성이 어쩌구 언급 한 적이 있음.<br>그래서 어떤 것이 가장 좋을 까? 하고 무식하게 테스트 해 봤음.<br><br>약간 흥미롭게 결과가 나왔는데 JDK 버전마다 조금씩 결과가 다름.<br>그리고 동일한 JDK 버전으로 PC와 <a target="_blank" href="https://wandbox.org">https://wandbox.org</a> 에서 컴파일 했을 때 결론도 각기 다르게 나왔음.<br><br>일단은 테스트 코드<br><br><font face="Courier New">import java.util.ArrayList;<br>import java.util.Collections;<br>import java.util.Iterator;<br>import java.util.List;<br><br><br><b>public </b><font>class </font><b>TestRepeat </b>{<br> <br> <b>private </b><font>final static</font> List<String> <b>getList</b>(){<br> final List<String> result = new ArrayList<String>();<br> <br> for( int i=0 ; i<60000 ; i++ ){<br> result.add( String.format("%08d", i) );<br> }<br> <br> return result;<br> }<br> <br> <b>private </b><font>final static</font> String <b>resultMessage</b>(List<Long> lst){<br> long max=Collections.max(lst), min=Collections.min(lst), aver, sum=0;<br> <br> int cnt = 0;<br> for( long l : lst ){<br> sum += l;<br> if( l == 0 )<br> cnt ++;<br> }<br> <br> aver = sum / lst.size();<br> <br> return String.format("<font face="Verdana">Max=%7d\t\tMin=%7d\t\tAver=%7d\t\tZero Count=%7d</font>", max, min, aver, cnt);<br> }<br><br> <b>public </b><font>static </font>void <b>main</b>(String[] args) {<br> <br> final int MaxCount = 5000;<br> <br> final List<Long> sizeList = new ArrayList<Long>();<br> {<br> <br> final List<String> lst = getList();<br> <br> for( int i=0 ; i<MaxCount ; i++ ){<br> <br> final long start = System.nanoTime();<br> for( int j=0 ; j<lst.size() ; j++ ){<br> lst.get(j);<br> }<br> <br> sizeList.add( System.nanoTime() - start );<br> }<br> }<br> <br> final List<Long> constList = new ArrayList<Long>();<br> {<br> final List<String> lst = getList();<br> <br> for( int i=0 ; i<MaxCount ; i++ ){<br> <br> final int size = lst.size();<br> final long start = System.nanoTime();<br> for( int j=0 ; j<size ; j++ ){<br> lst.get(j);<br> }<br> <br> constList.add( System.nanoTime() - start );<br> }<br> }<br> <br> final List<Long> forList = new ArrayList<Long>();<br> {<br> final List<String> lst = getList();<br> <br> for( int i=0 ; i<MaxCount ; i++ ){<br> <br> final long start = System.nanoTime();<br> for( String s : lst ){<br> ;<br> }<br> <br> forList.add( System.nanoTime() - start );<br> }<br> }<br><br> final List<Long> iterList = new ArrayList<Long>();<br> {<br> final List<String> lst = getList();<br> <br> for( int i=0 ; i<MaxCount ; i++ ){<br> <br> final long start = System.nanoTime();<br> for( Iterator<String> s = lst.iterator(); s.hasNext(); ){<br> s.next();<br> }<br> <br> iterList.add( System.nanoTime() - start );<br> }<br> }<br> <br> System.out.println("<font face="Verdana">size 매번 호출\t</font>" + resultMessage(sizeList) );<br> System.out.println("<font face="Verdana">size 한번 호출\t</font>" + resultMessage(constList) );<br> System.out.println("<font face="Verdana">foreach \t</font>" + resultMessage(forList) );<br> System.out.println("<font face="Verdana">Iterator 패턴\t</font>" + resultMessage(iterList) );<br><br> }<br><br>}</font><br><br><br>◈ JDK 1.7 PC Windows7<br><font face="Verdana">size 매번 호출 Max=3459601 Min= 0 Aver= 1441 Zero Count= 4693<br>size 한번 호출 Max=1818125 Min= 0 Aver= 976 Zero Count= 4786<br>foreach Max=8044722 Min= 192511 Aver= 204727 Zero Count= 0<br>Iterator 패턴 Max=4768303 Min= 81171 Aver= 84916 Zero Count= 0</font><br><br><br>◈ JDK 1.8 PC Windows7<br><font face="Verdana">size 매번 호출 Max=3579648 Min= 0 Aver= 22607 Zero Count= 4390<br>size 한번 호출 Max=1686260 Min= 0 Aver= 1776 Zero Count= 4693<br>foreach Max=3399266 Min= 121913 Aver= 142415 Zero Count= 0<br>Iterator 패턴 Max=2076569 Min= 4976 Aver= 9294 Zero Count= 0</font><br><br><br>◈ JDK 1.7 wandbox.org<br><font face="Verdana">size 매번 호출 Max=9959131 Min= 1145 Aver= 5156 Zero Count= 0<br>size 한번 호출 Max= 714845 Min= 271180 Aver= 296579 Zero Count= 0<br>foreach Max=18782974 Min= 276058 Aver= 344822 Zero Count= 0<br>Iterator 패턴 Max=10282601 Min= 466734 Aver= 535358 Zero Count= 0</font><br><br><br>◈ JDK 1.8 wandbox.org<br><font face="Verdana">size 매번 호출 Max=8511093 Min= 1340 Aver= 48145 Zero Count= 0<br>size 한번 호출 Max=3233879 Min= 0 Aver= 34890 Zero Count= 360<br>foreach Max=15693267 Min= 277988 Aver= 339264 Zero Count= 0<br>Iterator 패턴 Max=3507748 Min= 497543 Aver= 640804 Zero Count= 0</font><br><br><br>◈ JDK 1.9+181 wandbox.org<br><font face="Verdana">size 매번 호출 Max=7186845 Min= 73194 Aver= 201134 Zero Count= 0<br>size 한번 호출 Max=6043744 Min= 73189 Aver= 164352 Zero Count= 0<br>foreach Max=7884471 Min= 333090 Aver= 412907 Zero Count= 0<br>Iterator 패턴 Max=1248011 Min= 519698 Aver= 566357 Zero Count= 0</font><br><br><br>◈ JDK 1.10+23 wandbox.org<br><font face="Verdana">size 매번 호출 Max=6827381 Min= 52742 Aver= 205384 Zero Count= 0<br>size 한번 호출 Max=3576097 Min= 73169 Aver= 130013 Zero Count= 0<br>foreach Max=7937696 Min= 349524 Aver= 419772 Zero Count= 0<br>Iterator 패턴 Max=1812288 Min= 632961 Aver= 739575 Zero Count= 0</font><br><br><br>컴파일 버전마다 조금씩은 차이가 있지만 size 함수를 한번만 호출 하는 것이 대체적으로 좋은 결과를 보여줌.<br>foreach 방식은 속도가 안습임. 왜그러지? ㅡ,ㅡ;;; 내가 좋아하는 for문이였는데 쩝...<br><div>허나 극악의 속도를 원하는 것 아니면 크게 문제 없으니 걍 참고만 하고 잘 쓰면 될꺼라 생각함.</div> <div><br></div> <div>아... 일해야지. ㅋ<br></div> <div style="border:3px dashed #0000FF;display:none;"></div> <div style="display:none;width:100%;height:1724px;background:none repeat scroll 0% 0%;"></div>
댓글 분란 또는 분쟁 때문에 전체 댓글이 블라인드 처리되었습니다.