C语言中测试某段代码效率
2016-03-02 11:54
417 查看
#ifndef _TEST_TICK_H_0416 #define _TEST_TICK_H_0416 #ifndef ImtLogINFO #define ImtLogINFO(x) LogTickCount x #endif #if defined(_DEBUG_TICK_)||!defined(ImtLogINFO) __inline void LogTickCount(LPCTSTR format, ...) { TCHAR sz[MAX_PATH]; FILE* fp; va_list va; va_start(va, format); #ifdef _INC_TCHAR _vstprintf(sz, format, va); #else vsprintf(sz, format, va); #endif va_end(va); fp = fopen("C:\\TestTick.txt", "a+"); if (!fp) { return; } fprintf(fp,"%s\n", sz); fclose(fp); } #endif #ifdef _DEBUG_TICK_ #define LOGTICK(x) LogTickCount x #else #define LOGTICK ImtLogINFO #endif //_DEBUG_TICK_ #define TICK_STATUS_STOPPED 3 #define TICK_STATUS_RUNNING 1 #define TICK_STATUS_PAUSE 2 #pragma pack(1) typedef struct __tickitem { unsigned char status; //计时器状态 char szName[19]; //计时器描述 unsigned long ulTickCount; //计时器数据 unsigned long ulTickTimes; //计时器计时次数 unsigned long ulLastStop; //最后一次停止的时间 unsigned long userdata; }TICK_ITEM,FAR* LPTICK_ITEM; #pragma pack() extern LPTICK_ITEM g_lpTickItem; extern CONST BYTE g_nMaxTickCount; extern BOOLEAN g_bTickEnable; #define TickGetEnable() g_lpTickItem #define TickGetItemCount() g_nMaxTickCount #define TickResetAll() if(g_lpTickItem)memset(g_lpTickItem, 0, sizeof(TICK_ITEM)*g_nMaxTickCount) #define TickSetEnable(b) g_bTickEnable = b #define TickAddUserData(i, u) do{if (g_lpTickItem)g_lpTickItem[i].userdata += u;}while(0) #define USE_TICK(count, en) TICK_ITEM g_TickItem[count] = {0};LPTICK_ITEM g_lpTickItem = g_TickItem; CONST BYTE g_nMaxTickCount = count;BOOLEAN g_bTickEnable = en #define TickStart(i, N) do{\ if (!g_bTickEnable)break;\ if ((i) >= 0 && (i) < g_nMaxTickCount)\ {\ if (g_lpTickItem[i].status == TICK_STATUS_STOPPED || g_lpTickItem[i].status == 0 )\ {\ g_lpTickItem[i].ulTickCount = GetTickCount();\ g_lpTickItem[i].ulTickTimes = 1;\ memcpy(g_lpTickItem[i].szName, N, sizeof(g_lpTickItem[i].szName) - 1);\ }\ else if (g_lpTickItem[i].status == TICK_STATUS_PAUSE)\ {\ g_lpTickItem[i].ulTickCount = GetTickCount() - g_lpTickItem[i].ulTickCount;\ g_lpTickItem[i].ulTickTimes = g_lpTickItem[i].ulTickTimes + 1;\ }\ g_lpTickItem[i].status = TICK_STATUS_RUNNING;\ }\ }while(0) #define TickStop(i) do{\ if (!g_bTickEnable)break;\ if ((i) >= 0 && (i) < g_nMaxTickCount)\ {\ if (g_lpTickItem[i].status == TICK_STATUS_RUNNING)\ {\ g_lpTickItem[i].ulTickCount = GetTickCount()-g_lpTickItem[i].ulTickCount;\ g_lpTickItem[i].ulLastStop = GetTickCount();\ }\ g_lpTickItem[i].status = TICK_STATUS_STOPPED;\ }\ }while(0) #define TickPause(i) do {\ if (!g_bTickEnable)break;\ if ((i) >= 0 && (i) < g_nMaxTickCount && g_lpTickItem[i].status == TICK_STATUS_RUNNING)\ {\ g_lpTickItem[i].ulTickCount = GetTickCount() - g_lpTickItem[i].ulTickCount;\ g_lpTickItem[i].ulLastStop = GetTickCount();\ g_lpTickItem[i].status = TICK_STATUS_PAUSE;\ }\ }while(0) #define TickStopAll() do{int __i;if (!g_bTickEnable)break;for(__i=0;__i<g_nMaxTickCount;__i++)if(g_lpTickItem[__i].status != 0)TickStop(__i);}while(0) #define TickGet(pt,i) do{if (!g_bTickEnable)break;if ((i) >= 0 && (i) < g_nMaxTickCount) *(pt) = g_lpTickItem[i].ulTickCount;}while(0) #define TickLogInfo(i) do{if (!g_bTickEnable)break;if ((i) >= 0 && (i) < g_nMaxTickCount)LOGTICK(("LastStop:%-10luTick%02lu(ms):%-10luTimes:%-10lu%s", g_lpTickItem[i].ulLastStop, (long)i,g_lpTickItem[i].ulTickCount,g_lpTickItem[i].ulTickTimes,g_lpTickItem[i].szName));}while(0) #define TickLogAllUsed() do{\ int __i;\ if (!g_bTickEnable)break;\ for(__i=0;__i<g_nMaxTickCount;__i++)\ if(g_lpTickItem[__i].status != 0 && g_lpTickItem[__i].ulTickTimes)\ TickLogInfo(__i);\ }while(0) #define TickStopAndLogAllUsed() do{TickStopAll();TickLogAllUsed();}while(0) #endif//_TEST_TICK_H_0416
使用方法:
#define ImtLogINFO(x) LogInfo x #include "TestTick.h" USE_TICK(100, TRUE); void LogInfo(LPCSTR lpFormat, ...) { va_list va; va_start(va, lpFormat); vprintf(lpFormat, va); printf("\n"); va_end(va); } void test() { TickStart(0, "test"); Sleep(1000); TickPause(0); } int main(int argc, char* argv[]) { TickResetAll(); for (int i = 0; i < 10; i++) { test(); } TickStopAndLogAllUsed(); getchar(); return 0; }运行结果:
相关文章推荐
- c语言:递归求学生年龄问题
- 【C++】const 常引用的用法
- C++ 中const
- C++primer 第四版部分习题的解答
- c++编译 (.obj, .lib, .dll, .exe的关系(附:lib和DLL的区别))
- C/C++——读入一系列由空白分割的(名字,值)对,其中每个名字是由空白分隔开的一个单词,值是一个整数或者一个浮点值, 计算并打印出对应于每个名字的所有值之和与平均值..
- c++ 思考
- c语言:用函数的嵌套调用,找4个整数中最大的数。(递推)
- 1:编写虚幻引擎中的UC和C++代码
- c语言之数据类型长度
- c++ 访问父类方法
- 小型C/C++项目的makefile编写
- C++文件读写详解(ofstream,ifstream,fstream)
- 浅谈C++数组与指针(一维)
- c++的几种典型数据类型
- 卡马克:用C++进行函数式编程
- c++中cout、cerr、clog的区别
- 在C代码中调用C++接口
- C++基础总结(3)--复杂数据类型
- C++基础总结(3)--复杂数据类型