1

我正在做一个小刚体模拟。我使用 Irrlicht 引擎进行显示,使用 openMesh 处理网格。

现在,我使用 VerySleepy 分析了我的应用程序,并注意到大部分时间都花在了以下函数中(不包括在子函数中花费的时间):

模块“ntdll”源文件“未知”中的 RtlCompareMemoryUlong 30%

KiFastSystemCallRet 模块“ntdll”源文件“未知”中的 21%

模块“ntdll”源文件“未知”中的 RtlFillMemoryUlong 9%

所以 50% 的时间都花在了这些函数上,我不会从代码中的某个地方调用它们,我也不明白它们在做什么。我怀疑它与图形有关,因为我只显示非常简单的网格。

有人可以告诉我如何弄清楚为什么调用这些函数以及如何摆脱它吗?

谢谢!

4

6 回答 6

5

ntdll 是 NT 内核函数。可能是那些被其他函数内部调用来执行低级操作的函数,因此您会看到在它们上花费了大量时间 - 它们是高级功能的子构建块。忽略它们并在其他地方(调用堆栈上)寻找性能调整;您不太可能摆脱应用程序中的操作系统调用。;)

于 2009-12-27T01:39:52.813 回答
4

性能问题可能是这些函数被大量调用,而不是这些函数本身。您可以从名称中猜出它们的用途。KiFastSystemCallRet 尤其表明您的应用程序进入了内核模式。

忽略您配置文件中的 ntdll 函数,只关注您编写/控制的函数。

于 2009-12-27T01:41:09.910 回答
3

使用更好的分析器。在 OS X 上,Xcode 附带的CPU Instruments应用程序提供了出色的诊断信息,可以轻松发现性能问题。

您想看到的是这段时间内的调用堆栈。这将向您显示哪个库和函数一直在调用该 OS 函数。一旦您知道了这一点,只需减少调用该库函数的频率即可。

于 2009-12-27T01:42:44.960 回答
1

RtlCompareMemory / RtlFillMemory 听起来可能是 memcmp() / memset() 的底层实现。

无论如何,您都希望更改分析器的设置以在调用应用程序/库函数下显示系统调用时间,以便您可以看到调用的最终来源。

于 2009-12-27T06:02:52.560 回答
0

弗兰克克鲁格是对的。您需要在程序运行时深入了解调用堆栈。这是为什么会这样的简单解释。 您可能会惊讶于您不需要特殊工具或大量样品。

于 2009-12-27T03:59:42.703 回答
0

当您一直卡在系统中时,您应该将其视为症状而不是实际问题的一部分。

内存碎片和分页是常见的嫌疑,但它可能是无数的事情。

以我的经验,性能问题很少是显而易见的,就像您正在专门调用某些东西一样。通常建议的优化通常在非常低的级别上是无用的。它会捕捉到错误的东西,这些错误通常是正确的,但通常是无意的,例如分配某些东西并一遍又一遍地删除它,但是对于这样的事情,您通常需要对发生的所有事情有深刻的理解,以找出问题的确切位置(但就像我说,令人惊讶的是,如果您经常陷入系统调用,则通常与内存管理相关)。

于 2009-12-27T09:52:32.363 回答