2009-12-27 53 views
1

我正在進行一個小剛體模擬。我使用Irrlicht引擎進行顯示,並使用openMesh來處理網格。C++在ntdll中發現性能問題 - 如何擺脫它?

現在我異型使用VerySleepy我的應用程序,發現大部分的時間在下面的函數中花費(不包括時間子函數花):

RtlCompareMemoryUlong 30%模塊中「NTDLL」的資源文件「未知」

KiFastSystemCallRet 21%以內模塊 「NTDLL」 的資源文件 「未知」

RtlFillMemoryUlong 9%模塊內 「NTDLL」 的資源文件 「未知」

這樣的50%的時間在噸廢軟管功能,我不會從我的代碼中的某處調用它們,我不明白他們在做什麼。我懷疑它連接到圖形,因爲我只顯示非常簡單的網格。

有人可以給我一個關於如何弄清楚爲什麼這些函數被調用以及如何擺脫它的提示嗎?

謝謝!

回答

5

ntdll是NT內核的函數。有機會被稱爲內部其他功能做低級別的操作,因此,你看到他們花了很多時間 - 他們是更高級功能的子構建塊。忽略它們並查看其他地方(在調用堆棧中)進行性能調整;你不可能擺脫應用程序的操作系統調用。 ;)

4

性能問題可能是這些函數被調用了很多,而不是這些函數本身。你可以從名字中猜出它們的用途。 KiFastSystemCallRet特別表示您的應用程序進入了內核模式。

忽略配置文件中的ntdll函數,並只關注您編寫/控制的函數。

+0

但爲什麼我的應用程序仍然會進入intno Kernel模式?我認爲上下文切換很昂貴,所以我應該避免它們,不是嗎?我的應用程序是單線程的 – genesys 2009-12-27 02:18:03

+1

內核轉換不是上下文切換 - 上下文切換是線程的量程到期或線程產生時。你應該儘量減少兩者;但是要做系統級的工作,比如繪圖或者任何與硬件有關的事情,這是不可避免的。 – 2009-12-27 05:42:55

+0

你的應用程序進入內核模式,因爲你調用了一個需要它的函數。正如這個答案所說的,忽略ntdll本身,並專注於你自己的功能。出於某種原因,他們發現有必要調用涉及切換到內核模式的系統函數。你不能優化內核,但是你可以*優化你調用這些系統函數的頻率。 – jalf 2009-12-27 16:11:58

3

使用更好的分析器。在OS X上,Xcode附帶的CPU Instruments應用程序提供了出色的診斷信息,可以輕鬆地發現性能問題。

你想看到的是所有這段時間的調用堆棧。這將告訴你哪個庫和函數總是調用該OS函數。一旦你知道了,這只是一個簡單的調用庫函數的問題。

+0

你可以建議一個更好的,免費的分析器? – genesys 2009-12-27 02:17:26

1

RtlCompareMemory/RtlFillMemory聽起來像是它們可能是memcmp()/ memset()的底層實現。

無論如何,您想要更改探查器的設置以顯示調用應用程序/庫函數下的系統調用時間,以便您可以查看調用最終來自哪裏。

0

當你一直陷在系統中時,你應該把它當作更多的症狀而不是實際問題的一部分。

內存碎片和分頁是通常的嫌疑,但它可能是無數的事情。

以我的經驗來看,性能問題很少是明顯的東西,比如你正在專門調用某些東西。像通常所建議的優化通常在很低的水平上無用。它捕獲的東西相當於錯誤,但通常是無意的,像分配一些東西並且一遍又一遍地刪除它,但對於這樣的事情,您通常需要深入瞭解所發生的一切事情,以明確問題出在哪裏(但像我一樣說,令人驚訝的是,如果你被困在系統調用中,這往往與內存管理有關)。