C++如何使用宏定义来简化代码性能测试 | cpp macro like function to implement a performance profiler
本文首发于个人博客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
- Post author: kezunlin
- Post link: https://kezunlin.me/post/65dc693d/
- Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 3.0 unless stating additionally.
C++如何使用宏定义来简化代码性能测试 | cpp macro like function to implement a performance profiler的更多相关文章
- iOS 使用宏定义函数和代码块
iOS使用宏定义函数和代码块 今天在开发过程中碰到一个问题:就是父类中要向外发送通知,然后子类中或者其他类中来接收它.当然一般是把它写到类方法中去,但是有个问题,就是如果调用的类不是它的子类,就不能直 ...
- IOS开发,知识点小结,ios开发中经常使用的宏定义总结
IOS开发,从应用跳转到用浏览器打开网页: [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"http:// ...
- 使用宏定义来减少JNI的繁琐
本篇文章由:http://www.sollyu.com/use-macro-definitions-to-reduce-tedious-jni/ 说明 相信写过cocos2d-x的朋友,或者写过jni ...
- 宏定义中的##操作符和... and _ _VA_ARGS_ _
1.Preprocessor Glue: The ## Operator 预处理连接符:##操作符 Like the # operator, the ## operator can be used i ...
- 利用宏定义实现C++程序在Unix和Win32环境下的通用性
[转] 1.1. 宏定义软件的代码,从跨平台的角度来看,可以分为平台相关的和平台无关的.采用C/C++编写的软件,在进行移植时,平台无关的的代码基本上不需要做大的改动,但平台相关的代码需要做很大的调整 ...
- C中的空宏定义,即只有一个参数
空宏定义的测试代码 #include <stdio.h> #define D(x) int main() { D(printf("null macro")); retu ...
- C语言宏定义和宏定义函数
要写好C语言,漂亮的宏定义是非常重要的.宏定义可以帮助我们防止出错,提高代码的可移植性和可读性等. 在软件开发过程中,经常有一些常用或者通用的功能或者代码段,这些功能既可以写成函数,也可以封装成为宏定 ...
- 【转】C语言中DEFINE简介及多行宏定义
要写好C语言,漂亮的宏定义是非常重要的.宏定义可以帮助我们防止出错,提高代码的可移植性和可读性等. 在软件开发过程中,经常有一些常用或者通用的功能或者代码段,这些功能既可以写成函数,也可以封装成为宏定 ...
- C Program基础-宏定义
写好c语言,漂亮的宏定义是非常重要的,我们在阅读别人工程时,往往能看到大量的宏定义,宏定义可以增加代码的可读性,也能增加代码的可移植性,一个好的宏定义甚至是一件艺术品.今天我们就来看看宏定义的方方面面 ...
随机推荐
- hibernate mysql中文检出无效
在学习ssh框架是发现,检索条件是英文时,sql就能按照条件过滤出数据,当我换成中文是,检索出来的数据就是空,最后发现没有设置数据库连接url的编码格式 1.数据库编码 COLLATE='utf8_g ...
- 3年Java开发10面阿里、京东、拼多多
拼多多 地点:2号线娄山关路地铁站(金虹桥国际中心) 环境:新的写字楼,环境很好,有种高大上的感觉.大厅进入后需要登记,然后进闸机.电梯是需要刷卡才能使用的.会议室都是用城市名称命名,例如杭州.香港等 ...
- vue响应式数据变化
vue响应式数据变化 话不多说,先上代码: //拷贝一份数组原型,防止修改所有数组类型变量的原型方法 let arrayProto = Array.prototype;// 数组原型上的方法 let ...
- 使用Pycharm轻轻松松脱下git版本控制高大上的外衣
一.思考❓❔ 1.git操作难吗? git操作命令繁杂 需求复杂场景, 使用不易 原理深邃,对初学者来说是有难度的 2.那么难,还要学吗? 作为IT行业从业者(搬砖小工),不会Git?滚,出去~~~ ...
- Elasticsearch 监控指标解析
1.集群监控 集群监控主要包括两个方面的内容,分别是集群健康情况和集群的运行状态. 集群健康状态可以通过以下api获取: http://ip:9200/_cluster/health?pretty 关 ...
- Python基础-day02-1
判断(if)语句 目标 开发中的应用场景 if 语句体验 if 语句进阶 综合应用 01. 开发中的应用场景 生活中的判断几乎是无所不在的,我们每天都在做各种各样的选择,如果这样?如果那样?-- 程序 ...
- 慢sql查询优化
explain使用介绍 id:执行编号,标识select所属的行.如果在语句中没子查询或关联查询,只有唯一的select,每行都将显示1.否则,内层的select语句一般会顺序编号,对应于其在原始语句 ...
- 使用docker运行dotnetcore站点
使用docker运行netcore站点 1.新建一.netcore测试站点,dotnet publish 发布到publish目录下 2.编写Dockerfile文件 3.打包上传到centos服务器 ...
- Sql: Oracle paging
--书分类目录kind --涂聚文 Geovin Du create table geovindu.BookKindList ( BookKindID INT PRIMARY KEY, BookKin ...
- oracle数据库执行sql文件
使用oracle客户端连接数据库,从oracle官网下载客户端instantclient_18_3工具,到目录下打开cmd命令窗口: 个人网盘客户端工具:https://pan.baidu.com/s ...