簡易ベンチマーク
#include <unistd.h>
#include <sys/time.h>
static struct timeval g_timeval;
void init_bench()
{
struct timezone tz;
gettimeofday(&g_timeval, &tz);
}
void bench(const char *message)
{
struct timezone tz;
struct timeval old_timeval = g_timeval;
gettimeofday(&g_timeval, &tz);
int usec = (g_timeval.tv_sec - old_timeval.tv_sec) * 1000000
+ g_timeval.tv_usec - old_timeval.tv_usec;
printf("bench %10d usec: %s\n", usec, message);
}
マクロ
TRACE
#ifndef __TRACE_H__
#define __TRACE_H__
#include <stdio.h>
#include <stdlib.h>
#ifdef _MSC_VER
#include <stdarg.h>
#endif
// 有効にする
#ifndef NDEBUG
#define __ENABLE_TRACE__
#endif
//======================================
// デバッグ用の処理
#ifdef __ENABLE_TRACE__
// ASSERT
#define ASSERT(condition) \
if (!(condition)) {\
fprintf(stderr,"%s %d: assertion failed ! %s\n",__FILE__,__LINE__,#condition); \
exit(-1); \
}
//--------------------------------------
// VC++
#ifdef _MSC_VER
// TRACE
#define TRACE _tracemacro_trace
inline void _tracemacro_trace(const char *format, ...)
{
va_list va;
va_start(va, format);
vfprintf(stderr, format, va);
va_end(va);
}
// ASSERT_TRACE
/*
condition ファイル名 行表示ができない
*/
#define ASSERT_TRACE _tracemacro_assert_trace
inline void _tracemacro_assert_trace(int condition, const char *format, ...)
{
if (condition) return;
va_list va;
va_start(va, format);
fprintf(stderr,"assertion failed !\n");
vfprintf(stderr, format, va);
va_end(va);
exit(-1);
}
//--------------------------------------
// それ以外
#else // _MSC_VER
#define TRACE(fmt,...) fprintf(stderr,fmt,##__VA_ARGS__)
#define ASSERT_TRACE(condition,fmt,...) \
if (!(condition)) {\
fprintf(stderr,"%s %d: assertion failed ! %s\n",__FILE__,__LINE__,#condition); \
fprintf(stderr,fmt,##__VA_ARGS__); \
exit(-1); \
}
#endif // _MSC_VER
//======================================
// リリース時
#else // __ENABLE_TRACE__
#define ASSERT(condition) ((void)0)
//--------------------------------------
// VC++
#ifdef _MSC_VER
#define TRACE if(1);else _tracemacro_null_func
#define ASSERT_TRACE if(1);else _tracemacro_null_func
inline void _tracemacro_null_func(...)
{
}
//--------------------------------------
// それ以外
#else
#define TRACE(fmt,...) ((void)0)
#define ASSERT_TRACE(condition,fmt,...) ((void)0)
#endif // _MSC_VER
#endif // __ENABLE_TRACE__
#endif // __TRACE_H__