البحث عن مقتطف كود قياس الأداء (c++)
-
20-08-2019 - |
سؤال
تستغرق بعض إجراءات التحميل في برنامجي وقتًا طويلاً حتى تكتمل.أريد مقتطفًا صغيرًا سريعًا للتحقق من المدة التي تستغرقها الوظيفة للتنفيذ.أعني بالقليل "يفضل أن يكون ذلك بدون مكتبات الطرف الثالث".
ربما شيء بسيط مثل أخذ وقت النظام؟
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());