SORU
28 EKİM 2008, Salı


Çevre.Vs DateTime TickCount.Şimdi

Hiç Ortamı kullanmak için OK.Zamana yayılmış hesaplamak için TickCount?

int start = Environment.TickCount;
// Do stuff
int duration = Environment.TickCount - start;
Console.WriteLine("That took "   duration " ms");

Çünkü TickCount imzalanmış ve aktarma 25 gün sonra (50 gün sürer vurmak tüm 32 bit ama senle hurda imzalı bit istiyorsanız hiç mantıklı olan matematik), göründüğü gibi çok riskli için yararlı olabilir.

DateTime kullanıyorum.Şimdi yerine. Bu en iyi yolu bunu yapmak için?

DateTime start = DateTime.Now;
// Do stuff
TimeSpan duration = DateTime.Now - start;
Console.WriteLine("That took "   duration.TotalMilliseconds   " ms");

CEVAP
14 Ocak 2012, CUMARTESİ


Çevre.TickCountGetTickCount() temel işlevi Winapı. Milisaniye cinsinden. Ama gerçek bu hassas konuda 15.6 ms. Daha kısa zaman aralıklarında (0 alacaksın) ölçebilirsiniz

Not:Dönen değeri bu sayaç ~49.7 her gün dönüyor yani Int32. Bu kadar uzun aralıklarla ölçmek için kullanmamalısın.

DateTime.KenelerGetSystemTimeAsFileTime dayanmaktadır() işlevi Winapı. 100 nanosaniye (microsoconds onda). DateTime gerçek hassas.Keneler sistemine bağlıdır. XP, sistem saati artımı hakkında 15.6 ms, Ortamda aynıdır.TickCount. Windows 7 hassasiyet 1 ms (süre Environemnt.TickCount hala 15.6 ms), ancak eğer güç tasarrufu düzeni kullanılır (genellikle dizüstü bilgisayarlarda) 15.6 ms de git.

KronometreQueryPerformanceCounter() WinAPİ fonksiyonu eğer yüksek çözünürlüklü performans sayacı sistemi, DateTime destekliyorsa. (ama dayanır Kullanılan kene)

Kronometre kullanmadan önce iki sorun dikkat:

  • çok işlemcili sistemler (MS kb895980, kb896256bakın) üzerinde güvenilmez olabilir
  • CPU frekansı değişir (this makaleyi okuyun) eğer güvenilmez olabilir

Sistem üzerinde basit bir test ile: hassas değerlendirebilir

static void Main(string[] args)
{
    int xcnt = 0;
    long xdelta, xstart;
    xstart = DateTime.UtcNow.Ticks;
    do {
        xdelta = DateTime.UtcNow.Ticks - xstart;
        xcnt  ;
    } while (xdelta == 0);

    Console.WriteLine("DateTime:\t{0} ms, in {1} cycles", xdelta / (10000.0), xcnt);

    int ycnt = 0, ystart;
    long ydelta;
    ystart = Environment.TickCount;
    do {
        ydelta = Environment.TickCount - ystart;
        ycnt  ;
    } while (ydelta == 0);

    Console.WriteLine("Environment:\t{0} ms, in {1} cycles ", ydelta, ycnt);


    Stopwatch sw = new Stopwatch();
    int zcnt = 0;
    long zstart, zdelta;

    sw.Start();
    zstart = sw.ElapsedTicks; // This minimizes the difference (opposed to just using 0)
    do {
        zdelta = sw.ElapsedTicks - zstart;
        zcnt  ;
    } while (zdelta == 0);
    sw.Stop();

    Console.WriteLine("StopWatch:\t{0} ms, in {1} cycles", (zdelta * 1000.0) / Stopwatch.Frequency, zcnt);
    Console.ReadKey();
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • justintimberlakeVEVO

    justintimber

    2 EYLÜL 2009
  • olinerd

    olinerd

    23 AĞUSTOS 2007
  • TouchePro

    TouchePro

    27 EYLÜL 2007