时间:2021-05-19
近期用到了一位师兄写的C++程序,总体功能良好。使用不同的数据测试,发现了一个明显的缺点:大数据量下,预处理过程耗时很长。中科院的某计算集群,普通队列中的程序运行时间不能超过6个小时。而手上这套程序,大数据量下预处理就花了不止六个小时,结果当然是还没开始就被结束了。
和天河二号的工作人员联系,确认没有执行时间限制。于是开通了天河二号的账号,把程序扔上去跑。执行大数据量时,程序莫名被kill。询问技术支持,得知是内存耗尽,建议每个节点的进程数少一点。如此折腾了两次,大数据量的例子没跑通,大部分时间都费在预处理上,然后程序崩了,又要调整参数重新再来。
耗时长,最多是多花点机时,问题不大。但是没跑通的情况下每次要等五六个小时,然后才知道能否运行,测试然后反馈的过程太低效。忍无可忍,就开始进行优化吧!
第一步,找出耗时的点。原来的程序输出日志用的cout,没有附带时间,不能通过日志发现耗时的点。为了找出性能关键点,第一步是改进log,在输出中加上时间。写了一个Log类,替换掉cout,程序的输出中就带上时间了:
#include "../include/Log.hpp"#include #include #include #include using namespace std;namespace tlanyan { string Log::datetimeFormat = "%F %T"; Log::Log() { } void Log::info(const char* message) { cout << getCurrentTime() << " [info] " << message << endl; } void Log::debug(const char* message) {#if DEBUG cout << getCurrentTime() << " [debug] " << message;#endif; } const char* Log::getCurrentTime() { //locale::global(locale("zh_CN.utf8")); time_t t = time(NULL); char mbstr[512]; if (strftime(mbstr, sizeof(mbstr), Log::datetimeFormat.c_str(), localtime(&t))) { return mbstr; } cerr << "获取或格式化时间错误!" << endl; exit(1); } Log::~Log() { }}// 调用示例:Log::info("program begins...");通过查看Log,定位到了耗时长的过程。
优化前后的结果对比:中等数据规模下,耗时从8'43"降到3'25";大数据量下,耗时从4h38'44"降到1h49'21"(注:使用自己的机器测试,CPU主频3.46GHz,比中科院和天河二号集群的CPU主频都要高,所以耗时短)。从数据看出,效果还是很明显的。
以上就是C++ 程序优化历程总结的详细内容,更多关于C++ 程序优化的资料请关注其它相关文章!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
第一次用C++写程序,对C++只是菜鸟级别的,倒是对C#很熟悉。两者有很大的相似性。但也有不同。首先写了一个网络通讯用的小的MFC程序。发现(1)MFC写界面真
本文总结了C++输入输出的各种注意事项,对于C++初学者或C++程序员来说都有一定的借鉴参考价值。具体总结分析如下:一、string类:1.cin>>strin
第一次使用python写程序,确实比C/C++之类方便许多。既然这个抽奖的数据不大,对效率要求并不高,所以采用python写,更加简洁、清晰、方便。1.用到的模
前言一次在VScode上配置C/C++环境的记录。一、VScode下载及安装VScode官网下载链接:https://code.visualstudio.com
1.一般来说,导入objectivec的头文件时用#import,包含c/c++头文件时用#include。2.#import确定一个文件只能被导入一次,这使你