البحث عن مقياس الشفرة القياسي(c++)




windows time (4)

تستغرق بعض إجراءات التحميل في البرنامج وقتًا طويلاً لإكمالها. أريد مقتطفًا صغيرًا سريعًا للتحقق من المدة التي استغرقها تنفيذ إحدى المهام. أعني بكلمة صغيرة "يفضل بدون مكتبات الطرف الثالث".

ربما شيء بسيط مثل أخذ وقت النظام؟

start = current_system_time()
load_something()
delta = current_system_time()-start
log_debug("load took "+delta)

تحرير: نظام التشغيل الهدف في السؤال هو ويندوز.


أستخدم صفًا لهذا الغرض ، مصممًا لقياس الوقت المستغرق لتنفيذ وظيفة وكتابة ذلك إلى ملف نص uth-16le (أحتاج إلى تحديث هذا لاستخدام فئة جديدة تم إنشاؤها لهذا ... لكن nm).

قم بإنشاء مثيل جديد في أعلى وظيفة ، على سبيل المثال jProfiler (L "myFunction") وسيقوم التنظيف في نهاية الدالة بالباقي ، إذا كنت تريد التأكد من جديد وحذفه بنفسك. انها مبالغة قليلا لاختبار صغير ، ولكن قد يساعد:

// start header

/* jProfiler class by Semi Essessi
 *
 * (class description goes here)
 *
 */

#ifndef __JPROFILER_H
#define __JPROFILER_H

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

class jProfiler
{
private:
    wchar_t*        str;
    LARGE_INTEGER   start;
    LARGE_INTEGER   tps;
    LARGE_INTEGER   buf;

    static FILE*    f;
    static int      instCount;

    static void     Initialise();
    static void     Shutdown();
public:
    jProfiler(const wchar_t* msg);
    ~jProfiler();
};

#endif

// - end header

/* jProfiler class by Semi Essessi
 *
 * (class description goes here)
 *
 */

#include "jProfiler.h"

#include <windows.h>

FILE* jProfiler::f = 0;
int jProfiler::instCount = 0;

jProfiler::jProfiler(const wchar_t* msg)
{
    // constructor code for menuVar
    int i = (int)wcslen(msg)+1;
    str = new wchar_t[i];
    memcpy(str, msg, sizeof(wchar_t)*i);
    str[i-1] =  0;

    QueryPerformanceFrequency(&tps);
    QueryPerformanceCounter(&start);

    instCount++;
    Initialise();
}

jProfiler::~jProfiler()
{
    // destructor code for menuVar
    QueryPerformanceCounter(&buf);
    // work out change in time
    double dt=((float)buf.QuadPart - (float)start.QuadPart)/(float)tps.QuadPart;
    fwprintf(f, L"%s : %.20f\r\n", str, dt);

    if(str) delete[] str;
    instCount--;
    Shutdown();
}

void jProfiler::Initialise()
{
    if(!f)
    {
        f = _wfopen(L"profilerlog.txt", L"wb");
        unsigned short a = 0xFEFF;
        fwrite(&a, sizeof(unsigned short), 1, f);
    }
}

void jProfiler::Shutdown()
{
    if(instCount==0) if(f) fclose(f);
}

إجابتك: نعم

التحذير: لن يعمل هذا النوع في الشفرة متعددة الأسطر أو آلات متعددة النواة ، بل يحتاج إلى جهاز توقيت قوي لساعة الحائط. لذا أوصيك باستخدام wallclock omp ل. يتم تضمين OMP مع VC و GCC ، ومعظم المترجمين ومعيار لا تحتاج إلى القلق بشأن الاختفاء

#include <omp.h>

// Starting the time measurement
double start = omp_get_wtime();
// Computations to be measured
...
// Measuring the elapsed time
double end = omp_get_wtime();
// Time calculation (in seconds)

هذه هي طريقة سريعة وقذرة لوقت كتلة من رمز C / C + +. يجب #include <sys/time.h> ، والتي يجب أن تكون عنوان قياسي ...

struct timeval start, end;
gettimeofday(&start, NULL);
// benchmark code
gettimeofday(&end, NULL);
long long time =   (end.tv_sec * (unsigned int)1e6 +   end.tv_usec) - 
                 (start.tv_sec * (unsigned int)1e6 + start.tv_usec);

يجب أن يعطي هذا القرار 1-2µ على أنظمة Linux الحديثة (ما هو نظام التشغيل الذي تستخدمه؟) ، مما يعني أنه ليس مناسبًا تمامًا لتعلم الكثير عن العناصر التي تستغرق أقل من 10 ثوانٍ. ومع ذلك ، لا يبدو أنك في هذا الموقف.

تحديث: بناء على نظام التشغيل المحدد ... تنفيذ Windows من gettimeofday ()


#if defined(_WIN32) || defined(__WIN32__) || defined(WIN32)

namespace win32 {
    #include <windows.h>
}

class timer
{
    win32::LARGE_INTEGER start_time_;
public:
    timer() { QueryPerformanceCounter( &start_time_ ); }
    void   restart() { QueryPerformanceCounter( &start_time_ ); }
    double elapsed() const
    {
        win32::LARGE_INTEGER end_time, frequency;
        QueryPerformanceCounter( &end_time );
        QueryPerformanceFrequency( &frequency );
        return double( end_time.QuadPart - start_time_.QuadPart )
            / frequency.QuadPart;
    }
};

#else

#include <ctime>

class timer
{
    clock_t _start_time;
public:
    timer() { _start_time = clock(); }
    void   restart() { _start_time = clock(); }
    double elapsed() const
    {
        return double(clock() - _start_time) / CLOCKS_PER_SEC;
    }
};

#endif

template< typename Func >
double measure_time( Func f )
{
    timer t;
    f();
    return t.elapsed();
}






benchmarking