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

  • Apple&Tech Reviews & Giveaways

    Apple&Tech R

    12 Temmuz 2008
  • MrChiCity3

    MrChiCity3

    14 NİSAN 2008
  • ODN

    ODN

    26 Kasım 2006