获取使用 std::chrono 所花费的平均时间
Get average of time spent using std::chrono
我有一个函数 运行宁超过一百万次。我想通过打印 10,000 次调用该函数的持续时间总和来打印出该函数花费多长时间 运行 的持续时间。
在每个函数的开头我都有这样的东西:
int counter = 0;
auto duration_total = 0; //not sure about the type
std::chrono::high_resolution_clock::time_point t1, t2, duration;
t1 = std::chrono::high_resolution_clock::now();
Function f(){
counter++;
}
t2 = std::chrono::high_resolution_clock::now();
duration= std::chrono::duration_cast<std::chrono::nanoseconds>( t2 - t1 ).count();
duration_total += duration;
if(counter %10000 == 0){
long int average_duration = duration_total/10000;
duration_total = 0;
cout << average_duration << "\n";
}
我找不到添加持续时间然后计算其平均值的方法。
首先这里的类型是int:
auto duration_total = 0;
你应该做类似的事情:
auto t1 = std::chrono::steady_clock::now();
//do some work
auto t2 = std::chrono::steady_clock::now();
double duration_in_seconds = std::chrono::duration_cast<std::chrono::duration<double>>(t2 - t1).count();
请注意,我将持续时间加倍。那么就可以更自由的使用duration值了
如果您更喜欢纳秒:
double duration_in_nanoseconds = std::chrono::duration_cast<std::chrono::nanoseconds>(t2 - t1).count();
如果您查看 std::chrono::duration<Rep,Period>::count
,您会发现可以使用
int duration = std::chrono::duration_cast<std::chrono::nanoseconds>( t2 - t1 ).count();
(或其他,例如 unsigned long
),因为 return 值为
The number of ticks for this duration.
完整:
#include <iostream>
#include <chrono>
int main()
{
int counter = 0;
auto duration_total = 0; //not sure about the type
std::chrono::high_resolution_clock::time_point t1, t2;
t1 = std::chrono::high_resolution_clock::now();
t2 = std::chrono::high_resolution_clock::now();
int duration = std::chrono::duration_cast<std::chrono::nanoseconds>( t2 - t1 ).count();
duration_total += duration;
if(counter %10000 == 0){
long int average_duration = duration_total/10000;
duration_total = 0;
std::cout << average_duration << "\n";
}
}
在 Coliru 中查看。
开始时创建一个时钟,停止时创建一个时钟。
从一个时钟减去另一个时钟时,您会得到一个持续时间。将持续时间除以迭代次数。
示例:
#include <chrono>
#include <functional>
#include <iostream>
template<typename T>
auto timeit(size_t iterations, std::function<void()> func_to_test) {
auto start = std::chrono::high_resolution_clock::now();
for(size_t i = 0; i < iterations; ++i)
func_to_test();
auto end = std::chrono::high_resolution_clock::now();
return std::chrono::duration_cast<T>(end - start) / iterations;
}
int main() {
auto dur =
timeit<std::chrono::microseconds>(10000, [] { system("echo Hello World"); });
std::cout << dur.count() << " µs\n";
}
如果您需要对单个 运行 求和,请保留您添加的持续时间变量。我正在重用相同的 timeit
函数,但如果您只想 运行 一次,您可以删除其中的 iteration
内容。
int main() {
std::chrono::microseconds tot{0};
size_t iterations = 0;
for(size_t i = 0; i < 10; ++i) {
// sum up the total time spent
tot += timeit<decltype(tot)>(1, [] { system("echo Hello World"); });
++iterations;
}
// divide with the number of iterations
std::cout << (tot / iterations).count() << " µs\n";
}
我有一个函数 运行宁超过一百万次。我想通过打印 10,000 次调用该函数的持续时间总和来打印出该函数花费多长时间 运行 的持续时间。
在每个函数的开头我都有这样的东西:
int counter = 0;
auto duration_total = 0; //not sure about the type
std::chrono::high_resolution_clock::time_point t1, t2, duration;
t1 = std::chrono::high_resolution_clock::now();
Function f(){
counter++;
}
t2 = std::chrono::high_resolution_clock::now();
duration= std::chrono::duration_cast<std::chrono::nanoseconds>( t2 - t1 ).count();
duration_total += duration;
if(counter %10000 == 0){
long int average_duration = duration_total/10000;
duration_total = 0;
cout << average_duration << "\n";
}
我找不到添加持续时间然后计算其平均值的方法。
首先这里的类型是int:
auto duration_total = 0;
你应该做类似的事情:
auto t1 = std::chrono::steady_clock::now();
//do some work
auto t2 = std::chrono::steady_clock::now();
double duration_in_seconds = std::chrono::duration_cast<std::chrono::duration<double>>(t2 - t1).count();
请注意,我将持续时间加倍。那么就可以更自由的使用duration值了
如果您更喜欢纳秒:
double duration_in_nanoseconds = std::chrono::duration_cast<std::chrono::nanoseconds>(t2 - t1).count();
如果您查看 std::chrono::duration<Rep,Period>::count
,您会发现可以使用
int duration = std::chrono::duration_cast<std::chrono::nanoseconds>( t2 - t1 ).count();
(或其他,例如 unsigned long
),因为 return 值为
The number of ticks for this duration.
完整:
#include <iostream>
#include <chrono>
int main()
{
int counter = 0;
auto duration_total = 0; //not sure about the type
std::chrono::high_resolution_clock::time_point t1, t2;
t1 = std::chrono::high_resolution_clock::now();
t2 = std::chrono::high_resolution_clock::now();
int duration = std::chrono::duration_cast<std::chrono::nanoseconds>( t2 - t1 ).count();
duration_total += duration;
if(counter %10000 == 0){
long int average_duration = duration_total/10000;
duration_total = 0;
std::cout << average_duration << "\n";
}
}
在 Coliru 中查看。
开始时创建一个时钟,停止时创建一个时钟。 从一个时钟减去另一个时钟时,您会得到一个持续时间。将持续时间除以迭代次数。
示例:
#include <chrono>
#include <functional>
#include <iostream>
template<typename T>
auto timeit(size_t iterations, std::function<void()> func_to_test) {
auto start = std::chrono::high_resolution_clock::now();
for(size_t i = 0; i < iterations; ++i)
func_to_test();
auto end = std::chrono::high_resolution_clock::now();
return std::chrono::duration_cast<T>(end - start) / iterations;
}
int main() {
auto dur =
timeit<std::chrono::microseconds>(10000, [] { system("echo Hello World"); });
std::cout << dur.count() << " µs\n";
}
如果您需要对单个 运行 求和,请保留您添加的持续时间变量。我正在重用相同的 timeit
函数,但如果您只想 运行 一次,您可以删除其中的 iteration
内容。
int main() {
std::chrono::microseconds tot{0};
size_t iterations = 0;
for(size_t i = 0; i < 10; ++i) {
// sum up the total time spent
tot += timeit<decltype(tot)>(1, [] { system("echo Hello World"); });
++iterations;
}
// divide with the number of iterations
std::cout << (tot / iterations).count() << " µs\n";
}