2011-06-24 53 views
0

由於我的一個項目的結束時間很短,所以我建立了一些討論(如果Rob沒有提供非常詳細的答案:D),我更關注一些飢餓的字符串處理區域的一些內存和循環優化。在我的情況下,我對一些性能測試感興趣,如果有人做過類似的測試,對於兩種情況下的特殊性能差異:面向對象VS線性字符串在面向對象的Pascal中的處理性能 - Delphi

案例1:我使用串行處理字符串,因此我有一條冗長的線,例如,

RichEdit1.SelText := stringfunction1(stringfunction2(stringfunction3(stringfunction4, stringfunction5), stringfunction6, stringfunction7(stringfunction8)))) 

情況2:

我剛分割所有那些所以每個在單獨的線已經執行的功能,因此,我必須聲明,將緩衝的返回可變每個功能。

P.S.我希望我沒有把案例1中的括號弄錯。

那麼,你對這個問題的發現/意見/評論是什麼?

也許這不是簡單的時間來獲得額外的納秒?

+0

爲什麼要將它們拆分到不同的行上有任何不同。它肯定會產生目標代碼。編譯器將在情況1中使用隱式局部變量。 –

+3

這看起來像**過早優化**對我來說:http://c2.com/cgi/wiki?PrematureOptimization – jpfollenius

回答

3

代碼

var 
    s1, s2: string; 
begin 
    s1 := 'This is a very long string...'; 
    s2 := s1; 
end; 

複製字符串s1s2(這可能是在一個緊密的循環性能問題),但它只是指示s2到同一位置內存爲s1。也就是說,一般來說,將字符串分配給變量不是一件非常糟糕的事情。實際上,我不確定哪種方法會產生最高效的彙編代碼(如果它們不相同!)。即使在內聯的情況下,中間結果也必須存儲在某處...

總而言之,我絕對認爲你應該選擇最可讀的方法(對於人類程序員) 。性能的差異甚至不應該被察覺。

4

聲明變量不會有任何區別,我相信。

當你調用這樣的函數時,編譯器需要生成隱式字符串變量來保留函數的結果。你這樣做的主要優點是編譯器可以決定在使用它時重用一個臨時變量,但沒有任何東西阻止編譯器對顯式變量進行同樣的操作。實際上,每次你用一個字符串結果調用函數時,編譯器都需要創建一個temp變量,因爲返回字符串的函數實際上是作爲一個具有附加var參數的過程實現的。

對於爲例:

function GetTempPath : string; 

真的實行這種方式

procedure GetTempPath(var S : string); 

所以,給出以下步驟:

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    Memo1.Lines.Text := GetTempPath; 
end; 

編譯器首先分配一個臨時的字符串變量。用參數中的所述臨時變量調用GetTempPath。一旦它返回,它就會使用這個變量並將其設置爲Memo1.Lines.Text。從本質上講,它確實是這樣的:

procedure TForm1.Button1Click(Sender: TObject); 
var S : string; 
begin 
    GetTempPath(S); 
    Memo1.Lines.Text := S; 
end; 

,如果你真正喜歡聲明下面的函數,編譯器是足夠聰明,不創建其它附加變量。

procedure TForm1.Button1Click(Sender: TObject); 
var S : string; 
begin 
    S := GetTempPath; 
    Memo1.Lines.Text := S; 
end; 
0

好的。

我會盡量把東西放在兩句話之內。 :)

  • 字符串優化 主要是因爲事實上,它是在非常非常非常後部 情況或usecases的性能瓶頸 過早optimmization 。

  • 內聯字符串用法主要優點是使用編譯器功能,允許在進一步的參數調用中重用先前的返回(temp)變量。儘管如此,如果我們打算使用線性操作,我們應該在主要字符串均衡代碼之前添加GetTempPath()過程,以確保我們使用仍然可以在內存中訪問的舊臨時變量。

+0

優化器將重新使用一個保存值的寄存器或者它不會。如果有必要,臨時變量也會存儲在某個地方。整個邏輯內聯的事實並沒有改變這一點。內聯使得事情很難閱讀,國際海事組織,所以我不會推薦它。 GetTempPath毫不猶豫地與重用內存中的臨時變量無關。它將返回Windows用來寫入臨時文件的目錄。 –