gpt4 book ai didi

c++ - 测量重载运算符和成员函数时间的函数

转载 作者:太空狗 更新时间:2023-10-29 20:21:07 27 4
gpt4 key购买 nike

描述


是否可以编写一个可用于测量运算符(operator)时间的函数以及类似这样的其他函数:

// pass an operator as an argument
measureTime(MyClass::operator*, lhs, rhs);

// Pass a function as an argument
measureTime(MyFunction(arg1, arg2));

// or
measureTime(MyFunction, arg1, arg2);

// or other signatures ...

我遇到了一个函数模板来执行此操作:

template<typename F, typename... Args>
double measureTime(F func, Args&&... args){
auto t1 = high_resolution_clock::now();
func(std::forward<Args>(args)...);
return high_resolution_clock::now() - t1;
}

不确定如何使用它(或编写新函数)来测量重载运算符的时间。

问题


  • 执行此操作的最佳方法是什么(如果可能)?
  • 如果不可能,还有哪些其他选择?

例子


我正在为大整数算法编写一个库,我正在使用不同的算法并希望在传递不同长度的整数时测量(和比较)它们的时间(并查看它们的行为)...

这是我类(class)的一部分:

class bigint {
public:
int compare(const bigint& other) const;
bigint operator*(const bigint& rhs) const;
bigint& operator++();
bigint otherAlgorithms(const bigint& other) const;
// and more ...
}

我还有很多输入数据,想在 for 循环中传递这些数据并打印出时间。

这就是为什么我一直在寻找一个可以为任何函数/运算符打印出时间的通用函数。

最佳答案

std::invoke 可以调用函数、lambda 和成员函数,所以让 std::invoke 处理函数调用:

template<typename... Args>
double measureTime(Args&&... args){
auto t1 = high_resolution_clock::now();
std::invoke(std::forward<Args>(args)...);
return duration(high_resolution_clock::now() - t1);
}

现在您可以测量成员函数和运算符:

struct Test {
void aFunction() {
std::cout << "Hello World\n";
}

void operator++() {
std::cout << "Hello World\n";
}
};
int main()
{
Test t;
std::cout << measureTime(&Test::aFunction, t) << "\n";
std::cout << measureTime(&Test::operator++, t) << "\n";
}

Working Example

编辑:尽管我不推荐使用它,但它看起来确实不错:

 #define MEASURE(call) measureTime([&](){ call; })
std::cout << MEASURE(t.aFunction()) << "\n";

它允许您测量多个函数调用。

std::cout << MEASURE(t.aFunction(); t.aFunction(); t.aFunction();) << "\n";

关于c++ - 测量重载运算符和成员函数时间的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45872529/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com