我有一個客戶端/服務器應用程序。服務器組件運行時,以「遠程處理」方式(二進制格式化程序,會話對象)使用WCF。附帶調試器的C#代碼非常慢; MemoryMappedFile的錯?
如果我啓動服務器組件並啓動客戶端,則服務器在第一個任務中將完成0.5秒的<。
如果我使用附加的VS調試器啓動服務器組件,然後啓動客戶端,則任務需要20秒才能完成。
沒有代碼更改 - 沒有條件編譯更改。無論我的服務器組件是以32位,64位,VS託管流程,沒有VS託管流程還是任何這些組合的方式編譯和運行,都會發生同樣的情況。
可能重要:如果我用VS.NET 探查(採樣模式),然後應用程序,就好像沒有附加的調試運行一樣快。所以我不能這樣診斷。剛剛檢查,儀器模式也運行得很快。對於併發性分析模式也是如此,可以快速運行。
主要數據:
- 應用程序使用相當沉重的多線程(在標準的線程池40個線程)。創建線程很快就會發生,而且不是一個慢點。有很多鎖,
WaitHandle
s和Monitor
模式 - 該應用程序根本沒有引發異常。
- 該應用程序不會創建控制檯輸出。
- 該應用程序是完全託管代碼。
- 該應用程序並在磁盤上映射的幾個文件到MemoryMappedFile:1x750MB和12x8MB和一些規模較小的
實測表現:
- CPU使用率在兩種情況下最小;當連接調試器時,CPU位於< 1%
- 在這兩種情況下,內存使用都很少;在這兩種情況下
- 有很多頁面故障發生(參考MMF)的大概有50或60MB,但是當調試器附加
- 如果VS宿主進程不使用,或基本上是「遠程調試它們發生更慢顯示器「進入遊戲,然後,使用一個體面的CPU,並創建了很多頁面錯誤。但這不是發生問題的唯一時間
- 無論客戶端如何運行,都會看到性能差異。唯一被更改的變量是通過「從調試開始」vs從資源管理器啓動的服務器組件。
我的想法:當調試
- WCF慢?
- MemoryMappedFiles調試速度慢嗎?
- 使用40個線程 - 調試速度慢?也許監視器/鎖通知調試器?線程調度變得很奇怪/上下文切換非常罕見?
- 宇宙背景輻射授予的智慧和幽默的殘酷感VS
都顯得愚蠢的可能性不大。
所以,我的問題:
- 這究竟是爲什麼?
- 如果#1未知,我該如何診斷/發現?
是否啓用第一個機會異常收穫?您還可以嘗試啓用.NET服務器源代碼步進,以在調試模式下捕獲最多潛在的「隱藏」異常,特別是(de)服務器異常。另外,痕跡(outputdebugstring或其他)呢? –
是的,根本不會引發任何異常 - 所有類別的異常(包括.NET)都有第一次機會。沒有調試控制檯輸出(這就是我的意思是控制檯輸出 - 我會編輯澄清)。我剛剛啓用.NET框架源步進(無法看到服務器源步進)..發現一些例外。將暫時更新 –
來自WCF的異常:「'字符,十六進制值0x20,不能包含在名稱中。」我不知道*可以用這種方式隱藏異常:不是例外嗎?將看我能做些什麼來解決。也許你可以發表一個答案,這樣你可以得到一些upvotes /一個接受,如果這能解決它? :) –