La funzione (unsigned int) GetTickCount() (Windows) è ideale per fare il profiling di codice abbastanza consistente.
Quando si tratta invece di piccole procedure, le API di Windows non sono sufficienti, e bisogna ricorrere all'assembly. Con l'interrogazione del contatore di istruzioni della CPU, presente nei processori Pentium, si possono ottenere risultati precisi, che spaccano il microsecondo in quattro. Però richiede una serie di macro abbastanza complessi e una buona conoscenza dell'Assembly (embedded).
Due esempi senza assembly:
<pre id=code><font face=courier size= id=code>
#include <stdio.h>
#include "windows.h"
int main(int argc, char **argv)
{
const int count = 64;
timeBeginPeriod(1);
printf("1. testing granularity of timeGetTime()...\n");
int its = 0;
long cur = 0, last = timeGetTime();
while (its < count) {
cur = timeGetTime();
if (cur != last) {
printf("%ld ", cur-last);
last = cur;
its++;
}
}
printf("\n\n2. testing granularity of Sleep(1)...\n ");
long first = timeGetTime();
cur = first;
last = first;
for (int n=0; n<count; n++) {
Sleep(1);
cur = timeGetTime();
printf("%d ", cur-last);
last = cur;
}
printf("\n");
return 0;
}
</font id=code></pre id=code>
<pre id=code><font face=courier size= id=code>
bool GetPentiumClockEstimateFromRegistry(unsigned __int64 *frequency)
{
HKEY hKey;
DWORD cbBuffer;
LONG rc;
*frequency = 0;
rc = RegOpenKeyEx(
HKEY_LOCAL_MACHINE,
"Hardware\\Description\\System\\CentralProcessor\\0",
0,
KEY_READ,
&hKey
);
if (rc == ERROR_SUCCESS)
{
cbBuffer = sizeof (DWORD);
DWORD freq_mhz;
rc = RegQueryValueEx
(
hKey,
"~MHz",
NULL,
NULL,
(LPBYTE)(&freq_mhz),
&cbBuffer
);
if (rc == ERROR_SUCCESS)
*frequency = freq_mhz*1024*1024;
RegCloseKey (hKey);
}
return (*frequency > 0);
}
</font id=code></pre id=code>
Giovanni
---
http://www.y2ksw.com/vbulletin