使用 chrono c++ 与时间进行比较
comparing against time with chrono c++
我想说的差不多就是“只要我们在某个时间以下,就继续迭代”
这个代码看起来像
int time = atoi(argv[1]);
auto start = std::chrono::high_resolution_clock::now();
while((std::chrono::duration_cast<chrono::milliseconds>(std::chrono::high_resolution_clock::now() - start).count()) < time){
/*perform operation*/
}
但是我无法像这样与时间进行比较并得到错误 error: conversion to ‘double’ from ‘std::chrono::duration<long int, std::ratio<1, 1000> >::rep {aka long int}’ may alter its value [-Werror=conversion]
有谁知道如何使用 chrono 与小于运算符进行比较?
错误在优先级,你的转换是在count()
函数之后执行的,这导致转换超过了double
值。
问题可以这样解决:
int time = atoi(argv[1]);
auto start = std::chrono::high_resolution_clock::now();
while(((std::chrono::duration_cast<chrono::milliseconds>(std::chrono::high_resolution_clock::now() - start)).count()) < time){
/*perform operation*/
}
int time = atoi(argv[1]);
time
是什么单位? seconds
? nanoseconds
?对于这个答案,我假设 seconds
,但将其更改为您需要的任何内容:
std::chrono::seconds time{atoi(arv[1])};
下一个:
auto start = std::chrono::high_resolution_clock::now();
high_resolution_clock
将成为 system_clock
或 steady_clock
的类型别名。 我建议根据您的需要选择system_clock
或steady_clock
,而不是让供应商为您选择。
while((std::chrono::duration_cast<chrono::milliseconds>(std::chrono::high_resolution_clock::now() - start).count()) < time){
/*perform operation*/
}
始终尝试留在计时类型系统中,而不是使用 .count()
退出它。一旦退出 chrono 库,它就无法再帮助你。在这种情况下,这意味着使用计时单位而不是 int
s.
进行比较
比较计时单位时,不需要强制转换,比较的双方都是相同的单位。例如比较 seconds
和 milliseconds
就可以了。考虑到不同的单位,chrono 会正确地进行比较。
我想发布 function-scope using namespace std::chrono
,因为我发现重复 std::chrono::
过于冗长,使代码更难阅读。
using namespace std::chrono;
seconds time{atoi(arv[1])};
auto start = steady_clock::now();
while(steady_clock::now() - start < time)
{
// perform operation
}
或者你可以用代数重新排列这个:
while(steady_clock::now() < start + time)
{
// perform operation
}
注意到 rhs 上的“常量”,您可以收集并重命名它:
auto finish = steady_clock::now() + seconds{atoi(arv[1])};
while(steady_clock::now() < finish)
{
// perform operation
}
以上都是等价的,所以你可以选择你觉得更易读的那个。
我想说的差不多就是“只要我们在某个时间以下,就继续迭代”
这个代码看起来像
int time = atoi(argv[1]);
auto start = std::chrono::high_resolution_clock::now();
while((std::chrono::duration_cast<chrono::milliseconds>(std::chrono::high_resolution_clock::now() - start).count()) < time){
/*perform operation*/
}
但是我无法像这样与时间进行比较并得到错误 error: conversion to ‘double’ from ‘std::chrono::duration<long int, std::ratio<1, 1000> >::rep {aka long int}’ may alter its value [-Werror=conversion]
有谁知道如何使用 chrono 与小于运算符进行比较?
错误在优先级,你的转换是在count()
函数之后执行的,这导致转换超过了double
值。
问题可以这样解决:
int time = atoi(argv[1]);
auto start = std::chrono::high_resolution_clock::now();
while(((std::chrono::duration_cast<chrono::milliseconds>(std::chrono::high_resolution_clock::now() - start)).count()) < time){
/*perform operation*/
}
int time = atoi(argv[1]);
time
是什么单位? seconds
? nanoseconds
?对于这个答案,我假设 seconds
,但将其更改为您需要的任何内容:
std::chrono::seconds time{atoi(arv[1])};
下一个:
auto start = std::chrono::high_resolution_clock::now();
high_resolution_clock
将成为 system_clock
或 steady_clock
的类型别名。 system_clock
或steady_clock
,而不是让供应商为您选择。
while((std::chrono::duration_cast<chrono::milliseconds>(std::chrono::high_resolution_clock::now() - start).count()) < time){
/*perform operation*/
}
始终尝试留在计时类型系统中,而不是使用
进行比较.count()
退出它。一旦退出 chrono 库,它就无法再帮助你。在这种情况下,这意味着使用计时单位而不是int
s.比较计时单位时,不需要强制转换,比较的双方都是相同的单位。例如比较
seconds
和milliseconds
就可以了。考虑到不同的单位,chrono 会正确地进行比较。
我想发布 function-scope using namespace std::chrono
,因为我发现重复 std::chrono::
过于冗长,使代码更难阅读。
using namespace std::chrono;
seconds time{atoi(arv[1])};
auto start = steady_clock::now();
while(steady_clock::now() - start < time)
{
// perform operation
}
或者你可以用代数重新排列这个:
while(steady_clock::now() < start + time)
{
// perform operation
}
注意到 rhs 上的“常量”,您可以收集并重命名它:
auto finish = steady_clock::now() + seconds{atoi(arv[1])};
while(steady_clock::now() < finish)
{
// perform operation
}
以上都是等价的,所以你可以选择你觉得更易读的那个。