2009-09-05 68 views
2

嘿,最近,我一直在試圖找到很好的方法來平滑線程睡眠(因爲它受到干擾或者如果你的電腦滯後等)。JAVA的System.currentTimeMillis()或C#的Environment.TickCount?

那麼這是一個整體「更好的性能」方法?

JAVA的System.currentTimeMillis的()爲C#方法:

public static double GetCurrentMilliseconds() 
{ 
    DateTime staticDate = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); 
    TimeSpan timeSpan = DateTime.UtcNow - staticDate; 
    return timeSpan.TotalMilliseconds; 
} 

System.currentTimeMillis的()中使用:

public void Run() 
    { 
     this.lastUpdate = TimeUtilities.GetCurrentMilliseconds(); 
     while (isRunning) 
     { 
      if (TimeUtilities.GetCurrentMilliseconds() - lastUpdate >= 600) 
      { 
       lastUpdate = TimeUtilities.GetCurrentMilliseconds(); 
       // bla bla bla... 
      } 

      try 
      { 
       Thread.Sleep(100); 
      } 
      catch (Exception ex) 
      { 
       Jolt.GetLog().WriteException(ex); 
      } 
     } 
    } 

和C#的Environment.TickCount:

private void Run() 
    { 
     double lastUpdate = Environment.TickCount; 

     while (isRunning) 
     { 
      if (lastUpdate + 600 < Environment.TickCount) 
      { 
       lastUpdate = Environment.TickCount; 
       // bla bla bla... 
      } 

      try 
      { 
       Thread.Sleep(100); 
      } 
      catch (Exception ex) 
      { 
       Jolt.GetLog().WriteException(ex); 
      } 
     } 
    } 

不限幫助將不勝感激。否則,如果這是一個壞主意,請你提供一個更好的方法來做到這一點。

回答

2

使用計時單位計數方法具有更好的性能,有以下幾個原因:

  • 它是一個整數,而不是多字節的數據結構
  • 這是直接可用,不需要不同的計算

在性能方面,您不應該使用雙重類型。要測量100秒的跨度,int應該足夠了。請注意,TickCount在24天后從正面翻轉到負面,因此如果您使用雙倍時間,那麼在此之後使用TickCount將不再有效;如果你使用int,你應該把它寫爲

if (Environment.TickCount-lastUpdate > 600) 
+0

感謝隊友,這可能是我需要的答案。 – TheAJ 2009-09-05 06:33:29

+0

Tiny評論:如果你考慮TickCount是一個無符號的int,那麼它不會翻轉到48天。 – RenniePet 2015-09-30 02:18:25

0

TickCount肯定有更好的性能。

計算當前時間的開銷在此用例中不需要。你只關心時間流逝,所以如果時代是1970年或者是流程的開始,那麼它就沒有區別。

相關問題