【发布时间】:2012-01-23 20:08:24
【问题描述】:
背景(如果不感兴趣,请跳至下面的问题)
我有一个模拟器,它运行三种状态:
- 单线程启动(I/O 正常)
- 多线程内存中 CPU 绑定模拟阶段(I/O 不正常)
- 模拟后、连接后单线程阶段(I/O 正常)
这到底是怎么回事!在标准测试期间,CPU 使用率从 100% 下降到 20%,总运行时间比正常情况长约 30 倍(130 秒对 4.2 秒)。
当Callgrind 没有发现任何可疑之处时,我的脑袋嗡嗡作响,因为我正处于回滚到最后一次提交的悬崖上,失去了所有错误修复。
气馁地,我在跑步时走进服务器机房并注意到令人讨厌的磨擦声,后来证实是由/proc/PID/fd中的Mysql套接字写入引起的!!!事实证明,Mysql 代码,在第 2 阶段有好几层,导致了问题。
经验教训
- 意外的 I/O 对实时应用程序可能是致命的
- 单元测试还不够:我还需要基准测试
修复我将在 ReadAllowed() 和 WriteAllowed() 上引入 thread-local-storage IOSentinels 和 asserts() 以确保 Stage 2 线程永远不会进行任何 IO。
问题
任何人都可以使用 googletest 附加/编写基准测试框架吗?
不幸的是,这次我所有的 googletests 都通过了。如果我离开了一会儿,然后在没有注意到运行时的情况下回来,这将是一个灾难性的提交,并且可能更难修复。
如果运行时间是上次运行时间的 2 或 3 倍,我希望 googletest 失败:这最后一部分很棘手,因为对于非常快速的运行,系统状态可能会导致某些事情花费两倍的时间,但仍然可以。但对于长时间的模拟运行/测试,我预计运行时间不会有太大变化(>50% 是不寻常的)。
我对这里的建议持开放态度,但最好有一个低维护检查,它可以与自动化测试一起使用,这样如果系统突然变慢,即使所有输出看起来都很好,也会很明显。
【问题讨论】:
标签: c++ benchmarking googletest