Come calcolare il tempo di esecuzione in c

di il
1 risposte

Come calcolare il tempo di esecuzione in c

Ciao a tutti,
che funzione devo usare per calcolare il tempo di esecuzione di un programma in c?
Per favore specificate anche il tipo del valore di rirtorno!
grazie

1 Risposte

  • Re: Come calcolare il tempo di esecuzione in c

    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
Devi accedere o registrarti per scrivere nel forum
1 risposte