JAVA的System.currentTimeMillis()或C#的Environment.TickCount?

时间:2009-09-05 06:01:53

标签: c# java

嘿,就在最近,我一直在努力寻找平滑线程睡眠的好方法(如果它受到干扰或者你的计算机滞后等)。

那么这是一种整体“更好的表现”方法呢?

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

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 个答案:

答案 0 :(得分:2)

使用TickCount方法具有更好的性能,原因如下:

  • 它是一个整数,而不是一个多字节数据结构
  • 它直接可用,不需要各种计算

在性能方面,您不应该使用double类型。要测量100秒的跨度,int应该足够了。请注意,TickCount在24天后从正数转为负数,因此如果您使用double,则使用TickCount将不再适用于该时间;如果使用int,则应将其写为

if (Environment.TickCount-lastUpdate > 600)

答案 1 :(得分:0)

TickCount肯定有更好的表现。

此用例中不需要计算当前时间的开销。你只关心经过的时间,所以如果纪元是1970年或过程的开始,它就没有区别。