这是对现有线程(http://stackoverflow.com/questions/12724887/caching-in-a-high-performance-financial-application)的跟进 - 我发现阻碍我的应用程序的不是缓存。长话短说,我有一个应用程序在一个函数中花费了 70% 的运行时间(22 秒中有 15 秒)。因此,我想尽可能地缩短此函数的运行时间,因为该函数的设想用途是用于更大的数据(即 22 秒不是计划的运行时间:)
问题是 VTune 的输出让我感到困惑,代码似乎在绝对意想不到的地方花费了大量时间。我的想法已经用完了,所以我在这里发布了我的项目以及分析器结果。
看看有罪的 evaluateExits() 函数,这些事情让我感到困惑:
1/ 该函数恰好花费 2.2 秒调用一个内联函数,该函数返回 1 而不管参数如何(第 425 行,this->contractManager->contractCount())。注意:无论参数如何,函数返回 1 的版本是可能的情况之一,所以我不能把“contractCount=1”放在那里。来自虚拟表指针的重定向能否占用这 2.2 秒(contractCount() 是一个虚拟方法)?
2/ 该函数在 min(uint1, uint2) (第 432 行)上花费了 3.3 秒,尽管我使用的 wmin 版本应该尽可能对 CPU 友好。
3/函数在第512行花费了1.6s,这是一个非常微不足道的操作,被调用的函数不是虚拟的..
所以问题是:为什么这三行代码要花这么多时间?我在看什么?以及如何优化我的代码以使其运行得更快?我应该用应用于整个数组的 SSE 版本的 min 替换 wmin() 吗?
非常感谢任何输入。丹尼尔
编辑: 查看程序集,我发现在 1/ 情况下,确实是 vfptr 使代码“变慢”。我用 Don Clugston 的 fastdelegate 替换了对虚函数的调用,但性能没有发生任何变化(我不知道为什么)。由于南丁格尔的评论,附件现在应该包含所有必要的文件。但是,该二进制文件无法成功运行,因为它连接到有 100 MB 数据的共享内存。