Pet*_*r S 2 c++ linux windows multithreading valgrind
我花了一点时间运行valgrind/callgrind来配置一个使用许多线程进行大量TCP/IP通信的服务器.经过一段时间改善性能后,我意识到在这个特定的测试场景中,该过程不受CPU限制,因此我所看到的性能"改进"没有用.
从理论上讲,CPU应该非常繁忙.我知道它连接的TCP/IP设备不是限制因为服务器在两台机器上运行.一个是PC,另一个是带有Arm处理器的嵌入式设备.即使嵌入式设备的CPU使用率也只有2%左右,但它的交易量却少得多 - 大约十分之一.即使我们尽可能快地获取数据,这两个系统也只能达到2%左右.
我的猜测是一些互斥锁被锁定并且正在阻止一个线程.这是一个纯粹的猜测!系统中有一些线程具有公共数据.也许还有其他可能性,但我该怎么说?
无论如何使用像valgrind/callgrind这样的工具可能会显示系统调用所花费的时间吗?我也可以在Windows上使用Visual Studio 2012运行它,如果那更好的话.
我们可能不得不尝试遍历代码或其他东西,但不确定我们是否有时间.
任何提示赞赏.
谢谢.
Callgrind是一个伟大的探测器,但它确实有一些缺点.特别是,它假定相同的指令总是在相同的时间内执行,并且它假定指令计数是最重要的度量.
这对于获取(大多数)可重现的分析结果以及详细分析执行的指令是很好的,但是Callgrind没有检测到某些类型的性能问题:
sleep()/ usleep()通话会有效地降低您的应用程序速度,但不会出现在Callgrind中)使用统计(或基于样本的)分析器可以很好地检测到这些问题.例如,Sysprof和OProfile,或任何类型的"穷人的采样分析器",如例如.在/sf/answers/26461711/.WhozCraig提到的VS2012内置分析器似乎也是一个采样分析器.
虽然统计分析器非常有用,因为它们提供"真实世界"的结果而不是简单的指令计数,但它们可能存在的缺点是您无法轻松获得可重现的结果(每次运行结果会有所不同),并且您需要收集足够数量的样本以获得详细结果.
| 归档时间: |
|
| 查看次数: |
1508 次 |
| 最近记录: |