您的位置:首页 > 编程语言 > C语言/C++

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;
}
运行结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: