时间:2020-09-10 14:00:18 | 栏目: | 点击:次
近期用到了一位师兄写的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主频都要高,所以耗时短)。从数据看出,效果还是很明显的。