我想将一个大的包含日期时间字符串的文件转换为自C ++的UNIX时代(1970年1月1日)以来的秒数。我需要计算速度非常快,因为我需要处理大量的日期时间。
到目前为止,我已经尝试了两种选择。首先是使用在中定义的mktime time.h
。我尝试的第二个选项是Howard Hinnant的带时区扩展的日期库。
这是我用来比较mktime和Howard Hinnant的tz的性能的代码:
for( int i=0; i<RUNS; i++){
genrandomdate(&time_str);
time_t t = mktime(&time_str);
}
auto tz = current_zone()
for( int i=0; i<RUNS; i++){
genrandomdate(&time_str);
auto ymd = year{time_str.tm_year+1900}/(time_str.tm_mon+1)/time_str.tm_mday;
auto tcurr = make_zoned(tz, local_days{ymd} +
seconds{time_str.tm_hour*3600 + time_str.tm_min*60 + time_str.tm_sec}, choose::earliest);
auto tbase = make_zoned("UTC", local_days{January/1/1970});
auto dp = tcurr.get_sys_time() - tbase.get_sys_time() + 0s;
}
Run Code Online (Sandbox Code Playgroud)
比较结果:
time for mktime : 0.000142s
time for tz : 0.018748s
Run Code Online (Sandbox Code Playgroud)
与mktime相比,tz的性能不好。我想要比mktime更快的东西,因为当重复用于大量迭代时,mktime也非常慢。Java Calendar提供了一种非常快速的方法来执行此操作,但是当时区也在起作用时,我不知道有任何C ++替代方法。
注意:在没有时区的情况下,Howard Hinnant的日期可以非常快速地工作(甚至超过Java)。但这还不足以满足我的要求。