Sleep Time 과 관련된 질문.
글쓴이: jsharp / 작성시간: 일, 2008/08/03 - 5:31오후
Java에서 Sleep 시간이 얼마나 정확한가 궁금해져서 돌려봤습니다.
public void run()
{
while(true)
{
System.out.println(System.currentTimeMillis());
try {
sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
결과로
1217751800484
1217751800593
1217751800687
1217751800796
1217751800890
같이 찍히더군요.. 원래 오차가 있다고 들었던터라 약간 있구나 생각했는데
sleep 시간을 더 작게 두면 어떻게 될지 궁금해서 sleep(10); 으로 두고 돌려봤습니다.
1217752140140
1217752140140
1217752140156
1217752140171
1217752140171
1217752140187
재밌는건 아예 1밀리세컨드도 sleep이 안걸릴 때도 있더라는겁니다.
어째서 Sleep이 안걸리는 순간이 생기는걸까요?
Forums:
마이크로 세컨드로..
찍어야 하지 않을까요?
음.. 마이크로 세컨드로..
음.. 찍는것의 문제는 아닌거 같아요.
System.out.println(java.util.concurrent.TimeUnit.MILLISECONDS.toMicros(System.currentTimeMillis()));
로 찍으니까
1217809040671000
1217809040687000
1217809040687000
이런식으로 자리수만 늘어나지 또 같은 값이 찍히네요.
아무튼 감사합니다^^
바보짓 했네요;;
생각해보니 바보짓 했네요..;;; millis로 측정된값을 마이크로로 바꾸면
그냥 자리수만 당연히 늘어나겠네요;;
생각해 보니..
보시면 100밀리 세컨 슬립의 편차가 많게는 9밀리 세컨 정도 나네요.... 10밀리 세컨 슬립한경우.. 그시간차가 19정도가 될수도.. 그러면 최소한 1은 나야하지 않겠느냐? 그건 확실히 모르겠네요.. 제 생각엔 밀리세컨단위라서 반올림이 된듯(뒤에 마이크로 세컨때문에).. 그리고 마이크로세컨이 000으로 똑같이 찍힌걸로 봐서는 자바에서는 마이크로세컨을 제대로 지원하지 않는듯.. 아무래도 언어적인 특성인듯합니다.. c로 한번 해보세요.. 실행 프로세스가 많지않다면 밀리세컨단위의 편차가 나는경우는 없을듯..
해당 작업을 어떤
해당 작업을 어떤 OS위에서 돌고 있는 Java Virtual Machine에서 작동시켰느냐에 따라 해석이 달라질 수 있을 것 같습니다.
그리고 현재 질문 내용을 보면 sleep을 의심하고 currentTimeMillis은 정확하다고 생각하시는 것 같은데 currentTimeMillis도 정상적인 시간을 돌려주고 있는지도 의심해 볼 필요가 있을 것 같습니다.
제 생각에는 sleep(10)을 했을 때 적어도 10ms이상은 sleep을 한 다음에 깨어났지만 currentTimeMillis가 정확한 시간을 돌려주고 있지 않은게 원인이 아닌가 생각됩니다.
sleep(10)을 했는데 10ms이상 sleep하는 것은 문제가 안되지만(non realtime case이므로), 10ms이하로 sleep을 하면 여러가지 문제를 일으킬 가능성이 있기 때문에 아마 10ms이상 sleep을 하고 있지 않을까 생각됩니다.
Taeho Oh ( ohhara@postech.edu , ohhara@plus.or.kr ) http://ohhara.sarang.net
Postech ( Pohang University of Science and Technology ) http://www.postech.edu
Digital Media Professionals Inc. http://www.dmprof.com
Taeho Oh ( ohhara@postech.edu ) http://ohhara.sarang.net
Postech ( Pohang University of Science and Technology ) http://www.postech.edu
Alticast Corp. http://www.alticast.com
답변 감사합니다. ^^
XP 위에서 1.6 버젼으로 Eclipse로 돌렸습니다.
음..글을 읽고 currentTimeMillis 이 부정확할 수도 있겠구나 라고 생각하고
이번에는
System.out.println(System.currentTimeMillis());
try {
for(int i = 0 ; i < 10; i ++)
sleep(10);
이런식으로 돌려줘 봤는데요..
1217892204578
1217892204687
1217892204796
1217892204890
1217892205000
라고 찍히는것 보니 꼭 그것만의 문제는 아니라고 생각이 됩니다.
물론 currentTimeMillis가 잘못됐다고 생각하면 애초에 이렇게 확인을 한다는것 자체가 말이 안되는것이겠죠;;
요점은.. 10밀리센컨을 걸어놨을 때 최소한 10밀리세컨은 슬립을 한다.. 라는 것을 확인 할 방법이 있을까요?
혹은.. for문을 처리하는데 걸리는 시간을 확인하고 싶어서 for(int i = 0; i < 100; i++); 이런식으로 해놓고
시간을 측정하고 싶을 때 currentTimeMillis 가지고는 측정이 안되는데 이런걸 확인 할 수 있는 방법이 있을까요?
답변 감사합니다^^
댓글 달기