2009-07-28 70 views
1

我們有一個「打印引擎」,它基本上選擇預先定義的任務來針對文件運行,而這些「任務」是.NET 2.0-3.5(在C#中)命令行應用程序。基於.NET的應用程序可以以這種方式執行嗎?

它所做的只是一個接一個地運行,而對於我們還沒有在內部開發的應用程序,它們運行得非常快,通常爲10-30毫秒。但是,我們的.NET應用程序通常需要1-3秒,而當您處理每個文件和幾個文件的多個可執行文件時,所有文件都會同步執行,所以我們最終會等待很長的等待時間。

通常這些應用程序正在做一些數據庫工作和一些非常基本的文件修改(純文本的東西)。我們甚至已經剝離下來,爲了某些應用中,看它是否只是已經看着它這是拖慢一切.NET Framework和每個人的開銷剛剛得出的結論是

」。NET就是慢並不是以這種方式執行 。「

我在想,如果這是真的,我可以用什麼技術來追蹤問題或減緩滯後。我試過使用探查器,但到目前爲止,我還沒有看到一個會重複執行命令行.NET應用程序,這就是我們所做的。大多數只是想運行一次可執行文件並附加到它來分析它。

理想情況下,我們希望完全不使用打印引擎並開發自己的更高效的引擎,但這不會發生。

+0

只是一個fyi(不想編輯帖子並造成碰撞),我將對此進行性能測試,並在獲得時間時用實數和片段更新問題。我沒有忘記:) – 2009-08-27 13:30:33

回答

7

通常,這些應用程序在做數據庫的工作

有一點點你走。打包的本地應用程序可能不會與數據庫交談。即使只是一個短的查詢,單單就可以輕鬆地花費10-30毫秒。

此外,.NET確實需要一些額外的開銷來建立應用程序域。如果可以將一些小應用程序分組爲較少的應用程序,或者使用命令行參數將其配置爲一次運行多個任務,則可能會發現效果更好。

3

大多數(所有?).NET減速都與程序集加載和JIT編譯有關。

如果您可以將多個任務組合到命令行中,這將使其運行速度更快。請記住,當您一次又一次地執行一個命令行應用程序時,您會每次動態加載並編譯每個程序集及其所有資源。

此外,如果您使用NGEN編譯程序集/程序集的預編譯映像,這將顯着縮短啓動時間。

+1

jit只在每臺機器上發生一次。由於這些經常運行,我懷疑ngen會提供幫助,甚至可能會減慢速度,因爲他們不再使用機器特定的優化。 – 2009-07-28 18:32:04

+0

感謝您的信息喬爾! – 2009-07-28 18:37:54

+0

除非程序集爲NGEN,否則每次首次調用某個方法時都會發生JIT。如果你重新啓動同一個應用程序,同樣的方法會再次被打印。 – 2009-11-26 22:31:09

3

本質上,它並不慢,但任何操作都只有最慢的一步。啓動對象初始化等,但不是很慢。那麼,空程序的性能數據如何?如果這需要幾秒鐘,我真的很想知道發生了什麼。

1

很難做出像「.net應用程序很慢」這樣的一攬子聲明。你可能會遇到一些JIT問題,但是預編譯它們可以解決這個問題。看看應用程序在做什麼。如果他們正在與一個數據庫交談,那麼希望有一兩個人建立連接,執行查詢,做一些事情,退出。當你開始真正微調一個應用程序,而不是數據庫連接和查詢延遲時,那麼一個本地編譯的應用程序往往會比.net應用程序或一個Java應用程序或腳本運行得更快......這是假設本機編譯的應用程序已經進行了有效編碼&優化。

1

我會改變從打印引擎中調用這些任務的方式。這聽起來像你從命令行/創建過程中運行它們?如果是這種情況,您可以在打印引擎中將它們加載到您的應用程序域中,然後使用相關參數調用它們的Main方法。這將大大減少JIT和加載時間。

相關問題