سؤال

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

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

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

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

هل كانت مفيدة؟

المحلول

إجابتك:نعم

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

#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)

نصائح أخرى

#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();
}

هذه طريقة سريعة وقذرة لتحديد وقت كتلة من كود 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 ()

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

قم بإنشاء مثيل جديد في الجزء العلوي من الوظيفة، على سبيل المثال.سيقوم 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);
}

انا املك معيار.hpp رأس في بلدي hpp مكتبة.لديها اثنين من الأدوات القياسية.الأول هو أخذ وقت التوقف اليدوي البسيط

Bench b;
...
b.stop();
b.milli(); // returns an uint with passed millisec. Also has sec and micro sec

والآخر أكثر تعقيدًا بعض الشيء.تكتب وظائف أو تحظر عبارات مثل هذه.

void myFunc() {
    BENCH(someName);
    ...
}

وفي النهاية اتصل sweet::Benchmark::printResults(); للحصول على الوقت الذي يقضيه وعدد المكالمات المطبوعة.

يحرر:لقد أضفت وظيفة حتى تتمكن من تسميتها هكذا.

double c = BENCHMARK_CNT(25, yourFunctionCallHere());
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top