我想知道在 C++ 项目构建的测试阶段插入性能测试和测量是否是一个好习惯。
在我的项目中,我有一些方法,我有一些执行时间限制,并且我当前的实现足以尊重它们。我用 gtest 为这些方法实现了一些单元测试。我想利用它们来测试在我的实现的未来更新中我不会引入一些无意的性能下降。
这样的事情是正确的方法吗?
auto start = std::chrono::high_resolution_clock::now().time_since_epoch().count();
some_task();
auto end = std::chrono::high_resolution_clock::now().time_since_epoch().count();
EXPECT_LT((end-start), SOME_TASK_TIME_TRHESHOLD)
Run Code Online (Sandbox Code Playgroud)
或者有一些众所周知的替代方案/库来实现此类性能检查?
只是为了提供上下文,这是我的代码的简单版本:
class myqueue
{
struct readable
{
readable()
{
static int __next = 0;
id = __next++;
}
int id;
};
std::list<readable> readers;
public:
readable& sub(){
readers.emplace_back();
return readers.back();
}
void unsub(readable& reader)
{
for (auto it = readers.begin(); it != readers.end(); ++it)
{
if (it->id == reader.id)
{
readers.erase(it);
break;
}
}
}
};
int main()
{
myqueue q;
auto& read = q.sub();
q.unsub(read);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
使用此代码,在调用 后unsub(),您从中获得的引用sub()不再有效,对吗?
是否有更好(安全)的方法来处理这种情况并确保没有人会继续使用该引用?
我能想到的第一个替代方案是使用指针而不是引用在运行时检查有效性,但这是您每次都必须明确执行的操作,您也可以跳过/忘记它。如果能够在编译时捕获该引用的任何使用unsub()(就像 Rust 在移动对象后所做的那样),那就太好了。 …