2012-09-10 69 views
2

我們正在開發一個控制檯軟件,用Delphi 7微軟Windows 7和Windows Server 2008 R2的:在運行時顯著上升

爲了簡化,這個軟件是使用嵌入式TCP服務器響應從CGI外部請求。這些答案包含使用DbExpress生成的帶Teechart圖形的HTML頁面和從數據庫提取的數據。

在Windows 7和Windows 2008 R2服務器上,我們注意到我們的軟件運行時間顯着增加 - 在Windows XP或Windows Server 2003上的原始處理時間的2或3倍 - 在標準執行環境中:軟件啓動作爲系統用戶帳戶的服務。

但是,當我們的軟件以簡單用戶的身份從命令提示符或直接從IDE(調試模式)啓動時,問題就會消失。

我的第一個問題是:有沒有人已經注意到這個問題?

使用ProcessExplorer,我們也注意到,當軟件作爲服務啓動時,沒有創建GDI句柄,也沒有用戶句柄。但是,當使用用戶帳戶啓動軟件時,會創建一些這些句柄。在Windows XP和Windows Server 2003中,無論是作爲服務啓動的軟件還是簡單的用戶帳戶,都會創建這些句柄。

這個觀察結果能否與我們的問題聯繫起來?

如果您已經注意到這些行爲,您是如何解決這個問題的?

+2

向進程添加一些跟蹤日誌記錄,並計算出它花費的時間。可能是一百萬個原因。 –

+2

顯然,從XP/2003到Vista/7/2008/2008R2的服務的重大變化是會話0隔離。這可能是其根源。它如何影響你的過程很難讓我們去猜測。 –

+0

你好 謝謝你的意見。 我正在考慮詳細的跟蹤日誌,但我擔心它們不會很重要,因爲它們不是在同一臺計算機上執行的。 但是,時間比例的比較應該提供線索,我會試試。 關於「會話0隔離」確實是一個有趣的想法,我會挖掘。但從我看到的第一次閱讀 我也應該有Server 2008的問題,或者我只有服務器2008 R2的問題(未在Vista上測試過) – Floverdoz

回答

0

我想我們發現了我們問題的根源。因此,對於那些正在尋找解決方案的用戶,以下是我們所做的:

延遲是由於使用本地人使用Win32 API函數造成的。現在不推薦使用區域設置標識符功能來支持使用區域設置名稱功能(請參閱http://msdn.microsoft.com/en-us/library/windows/desktop/dd319091%28v=vs.85%29.aspx)。

我們的開發大量使用「CompareString」(http://msdn.microsoft.com/en-us/library/windows/desktop/dd317759%28v=vs.85%29.aspx),包括使用TStringList的indexOf方法。在用戶上下文System(在Session 0中)運行時,此方法(kernell32的CompareStringA)的執行速度變慢。

爲了解決這個問題,我們用CompareStr而不是CompareString重載了TStringList。這種解決方法適用於我們的上下文,但CompareStr逐位進行比較,與CompareString不區分大小寫。 (更不用說這個方法大約快10倍... http://www.gefvert.org/blog/archives/651

另一種解決方案是切換到更新版本的IDE,但我們都知道這是另一個故事...

2

由於我們依賴於Windows API CompareString函數的許多地方,我們無法將其替換爲非Windows版本。 但是,我們發現,通過使用LOCALE_INVARIANT($ 07)而不是使用LOCAL_USER_DEFAULT,API工作正常。 所以,我們決定砍恆定值的Windows中定義並在它無處不在寫它被用於比較具有這樣的條件編譯:

{$IFDEF OVERLOAD_LUD} 
const 
    LOCALE_INVARIANT = $7; 
    LOCALE_USER_DEFAULT = LOCALE_INVARIANT; 
{$ENDIF} 

這解決了這個問題。

相關問題