一、需求分析

在开发阶段中,经常会需要打印出某些方式或步骤的耗时情况,大致需求如下:

  • 能打印出某个步骤的耗时;
  • 有开关可以控制打开和关闭耗时统计;
  • 使用方便。

二、准备工作

之前介绍过一个 log 输出的工具类,可以沿用,链接为:https://blog.csdn.net/afei__/article/details/81030373。

LogUtils.h 示例:

#ifndef _LOG_UTILS_H_
#define _LOG_UTILS_H_#ifdef __ANDROID__ // Android平台
#include <android/log.h>
#else // 其它平台
#include <stdio.h>
#endif // __ANDROID__ #include <string.h>#define DEBUG // 可以通过 CmakeLists.txt 等方式来定义在这个宏,实现动态打开和关闭LOG// Windows 和 Linux 这两个宏是在 CMakeLists.txt 通过 ADD_DEFINITIONS 定义的
#ifdef Windows
#define __FILENAME__ (strrchr(__FILE__, '\\') + 1) // Windows下文件目录层级是'\\'
#else
#define __FILENAME__ (strrchr(__FILE__, '/') + 1) // Linux下文件目录层级是'/',默认使用这种方式
#endif // Windows#ifdef DEBUG // 如果打开了 DEBUG 开关#ifdef __ANDROID__
#define TAG "JNI"
#define LOGV(fmt, ...) __android_log_print(ANDROID_LOG_VERBOSE, TAG, "[%s][%s][%d]: " fmt, __FILENAME__, __FUNCTION__, __LINE__, ##__VA_ARGS__)
#define LOGD(fmt, ...) __android_log_print(ANDROID_LOG_DEBUG, TAG, "[%s][%s][%d]: " fmt, __FILENAME__, __FUNCTION__, __LINE__, ##__VA_ARGS__)
#define LOGI(fmt, ...) __android_log_print(ANDROID_LOG_INFO, TAG, "[%s][%s][%d]: " fmt, __FILENAME__, __FUNCTION__, __LINE__, ##__VA_ARGS__)
#define LOGW(fmt, ...) __android_log_print(ANDROID_LOG_WARN, TAG, "[%s][%s][%d]: " fmt, __FILENAME__, __FUNCTION__, __LINE__, ##__VA_ARGS__)
#define LOGE(fmt, ...) __android_log_print(ANDROID_LOG_ERROR, TAG, "[%s][%s][%d]: " fmt, __FILENAME__, __FUNCTION__, __LINE__, ##__VA_ARGS__)
#else
#define LOGV(fmt, ...) printf("[%s][%s][%d]: " fmt "\n", __FILENAME__, __FUNCTION__, __LINE__, ##__VA_ARGS__)
#define LOGD(fmt, ...) printf("[%s][%s][%d]: " fmt "\n", __FILENAME__, __FUNCTION__, __LINE__, ##__VA_ARGS__)
#define LOGI(fmt, ...) printf("[%s][%s][%d]: " fmt "\n", __FILENAME__, __FUNCTION__, __LINE__, ##__VA_ARGS__)
#define LOGW(fmt, ...) printf("[%s][%s][%d]: " fmt "\n", __FILENAME__, __FUNCTION__, __LINE__, ##__VA_ARGS__)
#define LOGE(fmt, ...) printf("[%s][%s][%d]: " fmt "\n", __FILENAME__, __FUNCTION__, __LINE__, ##__VA_ARGS__)
#endif // __ANDROID__#else // 如果没打开 DEBUG 开关,则只是一些空的语句
#define LOGV(fmt, ...)
#define LOGD(fmt, ...)
#define LOGI(fmt, ...)
#define LOGW(fmt, ...)
#define LOGE(fmt, ...)
#endif // DEBUG#endif // _LOG_UTILS_H_

三、耗时工具类

1. TimeUtils.h

#ifndef _TIME_UTILS_H_
#define _TIME_UTILS_H_#include "LogUtils.h"#ifdef DEBUG // 在 LogUtils.h 中定义了,也可以单独使用另一个宏开控制开关
#include <ctime>
#include <chrono>#define __TIC__(tag) auto time_##tag##_start = std::chrono::high_resolution_clock::now()
#define __TOC__(tag) auto time_##tag##_end = std::chrono::high_resolution_clock::now();\std::chrono::duration<double> time_##tag##_elapsed = std::chrono::duration_cast<std::chrono::duration<double>>(time_##tag##_end - time_##tag##_start);\LOGD(#tag " time: %.3f ms", time_##tag##_elapsed.count() * 1000)
#else
#define __TIC__(tag)
#define __TOC__(tag)
#endif // DEBUG#endif //_TIME_UTILS_H_

2. 使用示例

#include "TimeUtils.h" // 包含这个头文件int dump_image(const char *path, unsigned char *data, unsigned int len) {FILE *file = fopen(path, "wb");if (file == NULL) {LOGE("fopen %s failed.", path);return -1;}__TIC__(fwrite); // 耗时统计起始处int size = fwrite(data, 1, len, file);__TOC__(fwrite); // 耗时统计终止处,注意括号内的内容必须一致fclose(file);return 0;
}

然后运行程序就会有类似如下的信息输出:

D/JNI: [ImageUtils.cpp][dump_image][97]: fwrite: 1.037 ms

NDK/C++ 耗时统计类TimeUtils相关推荐

  1. 优雅的利用Mybatis插件实现sql查询耗时统计

    优雅的利用Mybatis插件实现sql查询耗时统计 一. Mybatis反射机制讲解 二. 代理模式讲解 静态代理 动态代理 JDK动态代理参考代码 Proxy.newProxyInstance(xx ...

  2. Android魔镜:方法耗时统计插件Mirror-基础篇

    晓锋,曾在PPTV工作,饿了么资深Android工程师,专注于Android单元测试.架构设计.性能优化.以及最新技术分享,个人博客:michaelzhong. 注:本篇是<Android魔镜: ...

  3. 神兵利器—Android方法耗时统计插件Mirror(上)

    1 前言 1.1 发生背景 有一天,Boss跑过来说,下次迭代我们要做蜂鸟团队App性能调优.对于一个大型成熟的App应用,在业务稳定后,往往会更加关注性能相关的表现.那么,Android App的性 ...

  4. android 方法统计,神兵利器—Android方法耗时统计插件Mirror(上)

    1 前言 1.1 发生背景 有一天,Boss跑过来说,下次迭代我们要做蜂鸟团队App性能调优.对于一个大型成熟的App应用,在业务稳定后,往往会更加关注性能相关的表现.那么,Android App的性 ...

  5. 耗时统计利器——StopWatch秒表

    [前言]在程序性能分析的过程中,最直观的方式就是通过统计程序的实际耗时来衡量代码的性能,从而了解程序的整体性能表现,以便快速定位出耗时长的位置进行分析优化. 以往我们统计的程序的运行时间,常常采用如下 ...

  6. TimeWatch程序耗时统计

    调用方法: /**** @title: 程序时间统计类TimeWatchUtil* @time: 2019年5月28日* */ public class TimeWatchTest {public s ...

  7. 邀请函|欢迎参加2019云创大数据实验平台金融类/电子商务类/数学统计类院校各省总代理招募大会!...

    云创大数据将于2019年1月16日(周三)在南京举办"2019云创大数据实验平台金融类/电子商务类/数学统计类院校各省总代理招募大会",欢迎全国各省有意愿成为云创大数据实验平台各省 ...

  8. CostMonitorUtils耗时监控工具类(线程安全)

    转载请注明出处::https://blog.csdn.net/jevonsCSDN/article/details/83118799 [Jevons'Blog] 本文是关于实时监控方法耗时的工具,不依 ...

  9. 大数据产品测试----统计类产品测试项目总结

    统计类产品测试总结 一.需求背景: 统计平台面向微信小程序.微信小游戏.QQ小程序.QQ小游戏进行数据统计.用户分析,给运营人员提供不同场景下小程序的数据进行分析,分享.二维码.事件,小游戏提供关卡. ...

最新文章

  1. 区块链简史:解读这场技术革命的前世今生
  2. 考研成绩查询系统(jsp、mysql、java)
  3. spss分析qpcr数据_SPSS 数据分析,掌握这 6 大模块就够了!
  4. 图:BFS/DFS java实现
  5. CmsEasy 漏洞挖掘
  6. c 调用java包_C#调用java代码(IKVMC)
  7. 44 个 JavaScript 变态题解析
  8. html和ascll有什么关联,什么是HTML ASCII(HTML ASCII)?
  9. 【USACO 1.3】Ski Course Design
  10. HDU1257 最少拦截系统【最长上升子序列+DP】
  11. h5 语音识别_h5 在线语音识别接口_html5 语音识别 - 云+社区 - 腾讯云
  12. hMailServer邮件服务器之安装
  13. vue 获取本地的json文件内容
  14. 教你如何用bat程序给电脑清理缓存垃圾(普通版)
  15. 计算机安全群,大开眼界||斯坦福大学信息安全课程群
  16. oracle诉讼_Oracle诉Google:Aaaaand诉讼又回来了! [更新]
  17. Product Requirement Document
  18. 提高工作效率的工具[分享]
  19. 干货 | Linux面试题(2020最新版)
  20. 一图轻松搞懂吉利Basetech之OCC

热门文章

  1. Egret 学习笔记
  2. Packet Data Convergence Protocol (PDCP)阅读笔记
  3. 【大数据开发必看】可视化BI神器---FineBI
  4. stm32内部Flash读写
  5. echarts修改标题字体大小、颜色、位置、内容
  6. 修改MacOS下的输入法切换键为shift键
  7. 基于Opencv的图像卡通化
  8. 我的性格分析和对未来职业的规划
  9. Windows XP注册表信息
  10. 使用python将罗马字转换为对应的阿拉伯数字