一种C语言解决方案
通常,展示time_t
的值的方法是使用gmtime()
或localtime()
将其分解为struct tm
的组件,并显示这些组件或使用strftime()
按需转换它们,或使用ctime()
直接从time_t
转换为显示本地时间的字符串。
如果您想为某些目的查看原始值,C标准规定
time_t
是实数,这意味着它是整数或浮点数(C 2011 (N1570) 6.2.5 17)。因此,您应该使用
difftime()
将时间差转换为double:
#include <ctime>
#include <cstdio>
void process()
{
static unsigned dummy = 0;
for (size_t i = 0 ; i < 1000000000 ; ++i)
{
dummy += (dummy + i) / (dummy * i + 1);
}
}
int main()
{
const time_t t0 = time(NULL);
process();
const time_t t_end = time(NULL);
struct tm breakdown_time = { 0 };
breakdown_time.tm_sec = difftime(t_end, t0);
(void) mktime(&breakdown_time);
printf("duration: %.2d:%.2d:%.2d\n", breakdown_time.tm_hour, breakdown_time.tm_min, breakdown_time.tm_sec);
}
演示
C++解决方案
但是你不是在使用C++吗?std::clock()
提供了一种计算CPU时间持续时间的方法(CPU花费的时间,不包括它在其他线程上花费的时间,例如):
#include <iostream>
#include <iomanip>
void process()
{
static unsigned dummy = 0;
for (size_t i = 0 ; i < 1000000000 ; ++i)
{
dummy += (dummy + i) / (dummy * i + 1);
}
}
int main() {
const std::clock_t t0 = std::clock();
process();
const std::clock_t t_end = std::clock();
const double duration = static_cast<double>(t_end - t0) / CLOCKS_PER_SEC;
std::cout << "duration: " << std::setprecision(3) << duration << " s" << std::endl;
}
演示
C++14解决方案
我发现了一种优雅、多功能的计算真实持续时间的方法,它使用了C++14中所有先进的std::chrono
工具:
#include <iostream>
#include <iomanip>
#include <chrono>
void process()
{
static unsigned dummy = 0;
for (size_t i = 0 ; i < 100000000 ; ++i)
{
dummy += (dummy + i) / (dummy * i + 1);
}
}
template<typename TimeT = std::chrono::milliseconds>
struct measure
{
template<typename F, typename ...Args>
static typename TimeT::rep execution(F&& func, Args&&... args)
{
auto start = std::chrono::system_clock::now();
std::forward<decltype(func)>(func)(std::forward<Args>(args)...);
auto duration = std::chrono::duration_cast< TimeT>
(std::chrono::system_clock::now() - start);
return duration.count();
}
};
int main() {
std::cout << "duration: " << measure<>::execution(process) << " ms" << std::endl;
}
演示
time
的正常分辨率是秒吗?所以,如果你测量的时间少于一秒(即使是0.99秒),结果仍将为零。 - Some programmer dudefloat
类型吗?我尝试了这个方法但没有成功。 - Fadwagettimeofday
或clock
(但请注意,在Windows中使用Visual Studio编译器时,clock
函数的行为方式是非标准的,尽管它仍然可以使用)。 - Some programmer dude