本文首发于个人博客https://kezunlin.me/post/65dc693d/,欢迎阅读最新内容!

cpp macro like function to implement a performance profiler

Guide

macro expansions

  • name ===> quote as strings "xxx"

  • name, name ===> xxx

  • a ## b ===> concatenate the preceding and following tokens.
// #name ===>  "xxx"
// name, ##name ===> xxx // ##name ===> concatenate
// #name ===> quote as strings // a ## b ===> concatenate the preceding and following tokens. #define QUOTE(name) #name
#define CONCAT(x,y) x##y // x ## y space in ommited #define MACRO(name) #name "foo"
#define MACRO2(name) name "foo"
#define MACRO3(name) ##name "foo" #define CAT(a, ...) a ## __VA_ARGS__ #define IIF(c) CAT(IIF_, c)
#define IIF_0(t, ...) __VA_ARGS__
#define IIF_1(t, ...) t void macro_demo()
{
QUOTE(test); // "test"
CONCAT(test, foo); // testfoo MACRO(test); // "test" "foo"
MACRO2(test);// test "foo"
MACRO3(test);// test "foo"
}

macro function

define

#define SUM(a,b)  (a+b)

#define MYDEBUG(...)   fprintf(stderr, ##__VA_ARGS__)

usage

int c = SUM(1,2);
MYDEBUG("%d,%d \n",1,2); /* Becomes fprintf(stderr,"%d,%d \n",1,2); */

with class object

define

class profiler {
public:
profiler(const char* func_name, unsigned int times = 1);
~profiler(); void start();
int stop(); private:
boost::posix_time::ptime pt1;
boost::posix_time::ptime pt2;
const char * m_func_name;
int m_times = 1;
}; #define ONCE_PROFILER() profiler _profiler_instance##__LINE__(__FUNCTION__) #define BEGIN_PROFILE_ONE(name) profiler _profiler_##name(#name)
#define BEGIN_PROFILE_TIMES(name,times) profiler _profiler_##name(#name,times) #define BEGIN_PROFILE(name,...) profiler _profiler_##name(#name, ##__VA_ARGS__)
#define END_PROFILE(name) _profiler_##name.stop()

usage

void main()
{ BEGIN_PROFILE(LoadImage); load_image(); END_PROFILE(LoadImage); BEGIN_PROFILE_TIMES(ProcessImageTimes, 100);
//BEGIN_PROFILE(ProcessImageTimes, 100);
for(int i=0; i<100;i++){
process_image();
}
END_PROFILE(ProcessImageTimes); }

Reference

History

  • 20191010: created.

Copyright

C++如何使用宏定义来简化代码性能测试 | cpp macro like function to implement a performance profiler的更多相关文章

  1. iOS 使用宏定义函数和代码块

    iOS使用宏定义函数和代码块 今天在开发过程中碰到一个问题:就是父类中要向外发送通知,然后子类中或者其他类中来接收它.当然一般是把它写到类方法中去,但是有个问题,就是如果调用的类不是它的子类,就不能直 ...

  2. IOS开发,知识点小结,ios开发中经常使用的宏定义总结

    IOS开发,从应用跳转到用浏览器打开网页: [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"http:// ...

  3. 使用宏定义来减少JNI的繁琐

    本篇文章由:http://www.sollyu.com/use-macro-definitions-to-reduce-tedious-jni/ 说明 相信写过cocos2d-x的朋友,或者写过jni ...

  4. 宏定义中的##操作符和... and _ _VA_ARGS_ _

    1.Preprocessor Glue: The ## Operator 预处理连接符:##操作符 Like the # operator, the ## operator can be used i ...

  5. 利用宏定义实现C++程序在Unix和Win32环境下的通用性

    [转] 1.1. 宏定义软件的代码,从跨平台的角度来看,可以分为平台相关的和平台无关的.采用C/C++编写的软件,在进行移植时,平台无关的的代码基本上不需要做大的改动,但平台相关的代码需要做很大的调整 ...

  6. C中的空宏定义,即只有一个参数

    空宏定义的测试代码 #include <stdio.h> #define D(x) int main() { D(printf("null macro")); retu ...

  7. C语言宏定义和宏定义函数

    要写好C语言,漂亮的宏定义是非常重要的.宏定义可以帮助我们防止出错,提高代码的可移植性和可读性等. 在软件开发过程中,经常有一些常用或者通用的功能或者代码段,这些功能既可以写成函数,也可以封装成为宏定 ...

  8. 【转】C语言中DEFINE简介及多行宏定义

    要写好C语言,漂亮的宏定义是非常重要的.宏定义可以帮助我们防止出错,提高代码的可移植性和可读性等. 在软件开发过程中,经常有一些常用或者通用的功能或者代码段,这些功能既可以写成函数,也可以封装成为宏定 ...

  9. C Program基础-宏定义

    写好c语言,漂亮的宏定义是非常重要的,我们在阅读别人工程时,往往能看到大量的宏定义,宏定义可以增加代码的可读性,也能增加代码的可移植性,一个好的宏定义甚至是一件艺术品.今天我们就来看看宏定义的方方面面 ...

随机推荐

  1. 要想深入理解mysql索引?这16个点你必须要了解!

    前言 MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度. 打个比方,如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQ ...

  2. eclipse Outline里图标的含义

    source: http://www.cnblogs.com/qdwyg2013/p/6489019.html 先说颜色: 绿色:public 黄色:protected 蓝色:no modifier ...

  3. SVN重新定位操作流程

    因服务器其他系统需要SVN原来使用的443端口无法继续使用需要更换,服务器SVN端口已更新为8443,现将个人电脑SVN文件夹路径重新定位流程展示如下: 确定即修改成功!

  4. IDC:助力转型、深入变革:中国云专业服务市场持续升温

    来源:IDC 北京,2019 年 10 月 24 日——随着云计算在中国市场更深入和广泛的应用,与云相关的专业服务(咨询.迁移.开发与建设服务)需求旺盛.IDC 首次发布的<2019 年上半年云 ...

  5. 慢sql查询优化

    explain使用介绍 id:执行编号,标识select所属的行.如果在语句中没子查询或关联查询,只有唯一的select,每行都将显示1.否则,内层的select语句一般会顺序编号,对应于其在原始语句 ...

  6. 松软科技Web课堂:JavaScript JSON

    JSON 是存储和传输数据的格式. JSON 经常在数据从服务器发送到网页时使用. 什么是 JSON? JSON 指的是 JavaScript Object Notation JSON 是轻量级的数据 ...

  7. ABAP分享六 alv显示的几种方式的简单示例

    方法1,也是大家常见的方法通过函数   REUSE_ALV_GRID_DISPLAY TYPES: BEGIN OF  ty_spfli,   "定义结构     carrid like s ...

  8. Sqlite—查询语句(Select)

    基本语法如下 sqlite> select * from tb_user; sqlite> select userid,username from tb_user; 格式化的查询输出 sq ...

  9. Aery的UE4 C++游戏开发之旅(1)基础对象模型

    目录 UObject Actor种类 AActor APawn(可操控单位) AController(控制器) AGameMode(游戏模式) AHUD(HUD) ... Component种类 UA ...

  10. 同步IO, 异步IO的理解

    1. 什么是IO? 在计算机中无时无刻不存在着对数据的访问和读取(数据都存储在物理的媒介上,例如寄存器,高速缓存,内存,磁盘,网卡等等),这些操作被称为IO. 2. 阻塞IO (1)当用户线程发起IO ...