2012-01-10 66 views
1

我有一些C#代碼,它通過在NUnit測試中通過P/Invoke函數調用將一個委託作爲回調傳遞給非託管方法。Visual Studio 2008非常慢的調試管理到非託管過渡(儘管只有一臺機器)

該代碼很好,並在Relase和Debug模式下都通過了所有測試。它在一臺機器上運行速度快,無論是否在調試器下運行。

但是,在另一臺PC上爲即將開始的新開發人員設置幾乎相同的開發環境後,它將在Release和Debug配置中快速運行。但是當調試器被連接時,速度非常慢。

請注意,我看到在項目中啓用了「調試非託管代碼」的緩慢類型。我已經禁用了,重新編譯了,並且與w/o無關。我嘗試過兩次。

此外,沒有任何中斷點或監視變量集。

順便說一句,這個單元測試實際上調用了一個循環的非託管方法,循環次數爲100萬次,在循環遞增計數器後返回。這是非常簡單的代碼,它只測試跨AppDomain進行非託管調用的性能。

請記住,這是與git commit相同的代碼,只有在其中一臺機器上的調試器下運行時纔會運行緩慢。它們之間沒有任何代碼修改是不同的,所以它看起來確實不是一個「代碼」問題,而是在Visual Studio中與非託管和託管調試相關的一個設置,我會瘋狂地猜測。

在此先感謝您的任何想法。如果你真的認爲看代碼會有所幫助。我將發佈單元C#測試和cpp文件。

編輯:我縮小了調試器中的這種緩慢只發生在調用不同AppDomain的非託管代碼中。所以在這些性能測試中,有主AppDomain和另一個AppDomain。託管到非託管調用被測試從主域到它自己的回調。那些很快!但那些從非託管進入其他AppDomain的回調非常非常緩慢。這意味着從每秒2000萬降低到每秒只有4或5千。

請注意,被調用來測試的方法是void callback() - 所以不是參數或返回值。換句話說,沒有什麼可以組織的。

編輯:我是jiggerng不同的設置,現在我的開發盒也慢。我確定這是「Just My Code」設置,因爲這臺設備速度更快,所以它可以試用。但是現在,即使再次禁用它,它仍然很慢。所以不知道這是否是原因。

+0

暗刺:本地還是漫遊用戶配置文件? – 2012-01-10 03:22:00

+0

感謝您的建議,但這似乎在我的頭上。什麼是「漫遊用戶配置文件」?爲什麼它只會影響非託管轉換的代碼?哦,也許這篇文章非常清楚,所有的代碼性能測試只涉及C#w/o非託管,P/Invoke調用在調試器下工作正常嗎? – Wayne 2012-01-10 03:25:06

回答

2

檢查兩臺機器上的符號文件設置是否相同。加載本地代碼的所有符號可能需要很長時間(工具 - >選項 - >調試 - >符號)。

+0

兩臺計算機上的我的符號文件都是空的。該字段爲空。任何其他想法? – Wayne 2012-01-10 07:27:34