2014-01-14 36 views
2

我在C#中有一個應用程序,它連接到數據庫並生成一些Excel報告。從Visual Studio運行應用程序的性能惡化

當我以調試模式在Visual Studio中運行應用程序時,此操作大約需要幾分鐘。 101736毫秒。

當我打開bin \ Debug文件夾並從那裏運行可執行文件時,同一進程(相同的數據庫,相同的參數)需要33135毫秒。

但我正在運行相同的程序。

什麼能夠造成如此巨大的性能差異?

我已經完成了好幾次,從Visual Studio運行應用程序總是比從Windows資源管理器運行可執行文件慢得多。

我正在使用Visual Studio 2008 C#Express Edition。

+1

這是一個調試器,跟蹤你的應用程序 – Alberto

+1

它可能是VS中附加的調試器。 – thumbmunkeys

+1

以'Ctrl + F5'運行時會發生什麼? – V4Vendetta

回答

0

從visual studio運行導致大量的調試過程與它一起運行。這使您能夠在某些點中斷並檢查局部變量(以及其他許多事情)。如果您編譯發行版本,則隨着visual studio在啓用優化程序標誌的情況下進行編譯,改進可能會更加明顯。

0

它可能是VS中附加的調試器。

如果您有很多控制檯輸出或第一次機會異常,您會得到相當大的減速。

0

調試可能會減慢執行速度。如果選擇「無需調試即可開始」,則性能應與在Visual Studio外執行文件時相同。

一些事情,以避免更相比直接執行文件調試期間減慢執行向下:

  • 斷點是有條件的(它們會導致待評估的條件)
  • 例外
  • 指定要加載的外部符號
  • 僅在調試器連接時運行的代碼(使用if (Debugger.IsAttached) { ... }

一些事情,以避免相比,釋放建設(不論​​您是否運行在Visual Studio中或直接執行文件)減緩執行下來的調試版本:

  • 使用編譯器指令來有條件地包括代碼通過,如果條件編譯符號DEBUG定義檢查(使用#if DEBUG ... #endif
  • 使用在System.Diagnostics.Debug類成員(如使用WriteLine -method很多或使具有所述的緩慢覆蓋對象-method)。
  • 即使沒有以上應用,調試版本比較慢,因爲:

請注意,我的回答假設默認配置都在使用。(例如,可以禁用用於發佈版本的代碼優化,併爲調試版本啓用代碼優化)。

3

在Visual Studio調試器增速放緩的主要原因有以下幾點:

  1. P的大批/ Invoke調用。當P/Invoke MDA啓用時(即使沒有設置斷點,連接調試器時也是如此),速度大約慢100倍。開銷是每個P/Invoke方法調用的固定金額,因此如果單個P/Invoke執行速度很慢,那麼您將不會注意到其中的差異,但是如果您的方法執行的操作類似return a+b;並且調用了數十萬次,你會受到重創。
  2. 跟蹤點和/或條件斷點。這些只有在實際受到撞擊時纔會變得緩慢。跟蹤點很難「隱藏」,因爲你可以看到它們的輸出,但是我已經看到了條件斷點被執行了數百萬次的情況,導致調試器中的執行非常緩慢。
    • 注意:常規(無條件)斷點非常快,調試器中幾乎沒有開銷。
  3. 已啓用IntelliTrace呼叫跟蹤模式(適用於Visual Studio 2010及更新的Ultimate Edition)。 IntelliTrace有兩個設置:事件模式很快,但呼叫跟蹤模式可能會造成很大的開銷。
  4. 大量異常被拋出。如果您的應用程序拋出了數千個異常,那麼您可能會看到調試器出現減速。
  5. 跟蹤和/或調試輸出。如果您的應用程序調用Debug.WriteLineTrace.WriteLine許多(讀取:數千次),它可能會在連接到調試器時減慢應用程序的速度。
相關問題