2010-09-27 4 views
1

J'ai besoin de mettre en œuvre une méthode qui permet de mesurer le temps et les cycles CPU de changement de contexte entre les threads dans Windows.Mesure ContextSwitch Time C (Windows)

Voici mon code

#include <stdio.h> 
#include <windows.h> 
#include <time.h> 

LARGE_INTEGER initialTimeStamp, finalTimeStamp, freq; 

DWORD ThreadProc(LPVOID lpdwThreadParam) 
{ 
SwitchToThread(); 
return 0; 
} 

int main() 
{ 
    int result; 
    HANDLE hThread; 
    QueryPerformanceFrequency(&freq); 
    hThread = CreateThread(NULL,0, (LPTHREAD_START_ROUTINE)ThreadProc,NULL, 0, 0); 

    QueryPerformanceCounter(&initialTimeStamp); 
    SwitchToThread(); 
    QueryPerformanceCounter(&finalTimeStamp); 

    result = (1000000 * ((finalTimeStamp.QuadPart - initialTimeStamp.QuadPart)/2)/freq.QuadPart); 
    printf("Windows Thread - context switch time is %u ns\n", result); 

    WaitForSingleObject(hThread, INFINITE); 
    return 0; 
} 

Note: La division par deux, parce que j'ai deux changement de contexte entre initialTimeStamp et finalTimeStamp.

Je ne sais pas si c'est la meilleure ou la meilleure façon de le faire ... J'ai un temps différent à chaque exécution, ce qui n'est pas ce à quoi je m'attendais. Je ne suis pas sûr de savoir comment obtenir un certain nombre de cycles CPU.

Répondre

3

Vous devrez en fait avoir un thread qui brûle les cycles du processeur pour que SwitchToThread() mette en place un changement de contexte. Plus d'un si votre CPU a plusieurs cœurs. Même alors, le résultat que vous obtiendrez est en grande partie vide de sens. La quantité de surcharge est très variable selon le processus qui possède le thread qui obtient le quantum et l'état du cache TLB. Recharger les registres TLB et obtenir des échecs de cache ajoute beaucoup de temps. Le nombre habituel est de 2 000 à 10 000 cycles.

+1

En remplaçant SwitchToThread() à Sleep (0) va résoudre ceci ou pas? Il doit y avoir un moyen d'obtenir un temps approximatif. – aumanets

1

Vous obtenez des temps différents parce que la performance de l'ordinateur est très variable.