2009-10-11 23 views

Odpowiedz

23

Uważam, że klasa Stopwatch jest tym, czego szukasz.

+0

+1, z uwagi na czas (w porównaniu z uzyskanie absolutnego czasu), to stoper. – orip

+2

Stoper jest zdecydowanie najlepszym sposobem na odmierzanie czasu w BCL, to nie jest dokładna nanosekunda. – overstood

+3

@overstood: Tak, dokładność nie spada do nanosekund, podobnie jak metoda nanoTime. :) – Guffa

1

da ci aktualny czas w milisekundach, ale czas, który jest dokładny do nanosekund, jest dość niepraktyczny, przynajmniej w systemie Windows.

+1

Wierzę, że dokładność DateTime.Now wynosi ~ 15 lub 20 milisekund. Ma większą precyzję niż dokładność. – snarf

1

Najbliższa rzecz jaką mogłem znaleźć to metoda DateTime.ToFileTime(). można nazwać na przykład z DateTime tak:

long starttime = DateTime.Now.ToFileTime() 

Metoda zwraca czasowych plików systemu Windows:

czas plik

z systemem Windows jest wartość 64-bitową, która reprezentuje liczbę 100 - przerwy interwałowe, które upłynęły od północy, 1 stycznia 1601 AD (CE) Coordinated Universal Time (UTC).

można przydzielić przynajmniej czas do 100 ns interwałów.

src: http://msdn.microsoft.com/en-us/library/system.datetime.tofiletime.aspx

+0

To tylko daje 100 ns dokładność na czas ostatniej aktualizacji zegara Windows, co dzieje się co 15 do 16 ms – overstood

+2

ok, tylko z ciekawości, z których informacje pochodzą? –

-1

Chyba masz zamiar uderzyć twarde granice OS jeśli rozrządu w nanosekund. Oto dobry artykuł na ten temat:

http://www.lochan.org/2005/keith-cl/useful/win32time.html

Podczas gdy Windows będzie szczęśliwie powrócić dokładność 100 nanosekund, zegar jest zagwarantowana tylko do aktualizacji raz na 15,6 milisekund lub tak. Tak skutecznie system Windows zwraca czas, w którym te aktualizacje wystąpiły do ​​100 nanosekundy dokładności. Aby uzyskać większą dokładność niż ta, prawdopodobnie musisz być przygotowany do napisania C lub asemblera oraz uruchomionego i wbudowanego systemu operacyjnego.

1

DateTime.Now.Ticks

starałem się znaleźć odpowiedź na to, aby uruchomić kilka testów wydajności.

DateTime startTime = DateTime.Now; 
generatorEntity.PopulateValueList(); 
TimeSpan elapsedTime = DateTime.Now - startTime; 
Console.WriteLine("Completed! time(ticks) - " + elapsedTime.Ticks); 
2

Jeśli chcesz znacznik czasu do porównania pomiędzy różnymi procesami, różnych języków (Java, C, C#), GNU/Linux i Windows (Siedem przynajmniej):

Java:

java.lang.System.nanoTime(); 

C GNU/Linux:

static int64_t hpms_nano() { 
    struct timespec t; 
    clock_gettime(CLOCK_MONOTONIC, &t); 
    int64_t nano = t.tv_sec; 
    nano *= 1000; 
    nano *= 1000; 
    nano *= 1000; 
    nano += t.tv_nsec; 
    return nano; 
} 

C Windows:

static int64_t hpms_nano() { 
    static LARGE_INTEGER ticksPerSecond; 
    if(ticksPerSecond.QuadPart == 0) { 
     QueryPerformanceFrequency(&ticksPerSecond); 
    } 
    LARGE_INTEGER ticks; 
    QueryPerformanceCounter(&ticks); 
    uint64_t nano = (1000*1000*10UL * ticks.QuadPart)/ticksPerSecond.QuadPart; 
    nano *= 100UL; 
    return nano; 
} 

C#

private static long nanoTime() { 
    long nano = 10000L * Stopwatch.GetTimestamp(); 
    nano /= TimeSpan.TicksPerMillisecond; 
    nano *= 100L; 
    return nano; 
} 
Powiązane problemy