背景(如果不感兴趣,请跳到下面的问题)
我有一个运行三种状态的模拟器:
- 单线程启动(I/O 正常)
- 多线程内存中 CPU 限制模拟阶段(I/O 不正常)
- 后模拟、后连接单线程阶段(I/O 正常)
有没有搞错!在标准测试期间,CPU 使用率从100% 降至 20%,总运行时间约为比正常时间长 30 倍(130 秒 vs 4.2 秒)。
When Callgrind
没有发现任何可疑的情况,我的头嗡嗡作响,因为我正处于回滚到最后一次提交的边缘,失去所有错误修复。
沮丧地,我在跑步时走进服务器机房,注意到令人讨厌的磨擦声,后来证实是由写入 Mysql 套接字引起的/proc/PID/fd https://stackoverflow.com/questions/8181662/disk-io-profiler-for-a-c-application-on-linux!!!事实证明,位于第 2 阶段几层的 Mysql 代码导致了问题。
得到教训
- 意外的 I/O 对实时应用程序来说可能是致命的
- 单元测试还不够:我还需要基准测试
Fix我将在 ReadAllowed() 和 WriteAllowed() 上引入线程本地存储 IOSentinels 和 asserts(),以确保第 2 阶段线程永远不会执行任何 IO。
Question
有人有幸使用 googletest 附加/编写基准测试框架吗?
不幸的是,这次我所有的谷歌测试都通过了。如果我离开一会儿然后回来时没有注意到运行时,这将是一个灾难性的提交,并且可能更难以修复。
我希望 googletest 如果运行时间超过上次运行时间的 2 或 3 倍,就会失败:最后一部分很棘手,因为对于非常快速的运行,系统状态可能会导致某些事情花费两倍的时间,但仍然没问题。但对于长时间的模拟运行/测试,我预计运行时间不会发生很大变化(>50% 是不寻常的)。
我愿意接受这里的建议,但是最好有一个低维护检查,可以与自动化测试一起使用,这样,如果系统突然变慢,即使所有输出看起来都正常,也会很明显。
我在 v1.5.0 中这样做:
BENCHMARK(SomeBenchmark);
BENCHMARK(AnotherBenchmark);
TEST(MyTest, Benchmarks)
{
::benchmark::RunSpecifiedBenchmarks();
}
也就是说,我只是在 gtest 测试之一中直接调用 RunSpecifiedBenchmarks。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)