2012-07-05 48 views
1

我需要爲備忘錄中的文本進行數學計算。 [文件大小:〜2mb]劃分工作,將任務分配給線程數組

一個適合的例子是我需要解碼的編碼文本。

我將備忘文本傳遞給一個字符串以解碼它。 我想它會更快地運行我的解碼函數使用線程。 但一些谷歌搜索後,我沒有找到一個很好的例子符合我的目的。

實例功能:

function entr_base_N(my_text:String):String; 
var 
    ts_hamil64:Integer; 
begin 
    For ts_hamil64 := 1 to Length(my_text) do 
    begin 
     Result:= Result + Chr(Ord(my_text[ts_hamil64])+10) 
    end;  
end; 
..... 
..... 
Memo1.Text:=entr_base_N(Memo1.Text) 

我想破工作切成小塊,平分的工作,可以說3..8線程和分配我的解碼功能,這些線程。你能指導我嗎?

處理文本文件的當前時間:約35秒。 謝謝你的熱心幫助。

+0

@Kabamaru請,因爲有效的多線程是非常依賴於數據的操作上。 – 2012-07-05 20:30:45

+3

如果您只有2000行,則啓動線程的開銷可能會大於當前的任務。另外,爲什麼100線程?你有100個處理器嗎? – 2012-07-05 20:44:40

+1

@Kabamaru:如果你的CPU有8個邏輯處理器,你將不會受益於比8多的線程。 – 2012-07-05 20:52:03

回答

5

線程不是問題。您的功能entr_base_N立即運行。嘗試在調試器內部。你會發現它根本沒有時間。在現代計算機上處​​理2MB字符串是微不足道的。也就是說,我總是建議儘可能預先分配一個返回緩衝區。

所有的時間都花在發送結果字符串回備忘錄控制。發生的事情是你將#13和#10字符轉換爲#23和#20。無論出於何種原因,備忘錄控件都不會這樣。在我看來,你發送的是一個沒有換行符的字符串,而備忘錄的換行代碼表現不好。

一個快速和骯髒的方式來看到這是如此是在您的備忘錄上設置WordWrapFalse

這裏重要的一點是,您必須在嘗試優化之前正確識別瓶頸。儘管這是一個容易陷入的陷阱,正如我最初爲解答這個問題所做的努力所證明的那樣。

+0

我只是在觀察這種行爲!你是對的!!它運行速度快20倍。奇怪...非常感謝。 [entr_base_N:這裏的代碼只是一個例子。現在大約需要1.5秒] – 2012-07-05 22:01:37

+0

謝謝大家的幫助。我也會給它多線程的一個鏡頭。 – 2012-07-05 22:02:44

+4

多線程無濟於事。現在1.5s仍然發送文本到備忘錄。修改字符串的代碼實際上是即時的。這是少量的數據。在嘗試提高性能之前,您必須始終確定瓶頸。 – 2012-07-05 22:06:31

1

要分配給Memo1.Text更快,你可以使用以下命令:

memo1.Perform(wm_setredraw, 0, 0); 
try 
    memo1.Text:= entr_base_N(memo1.Text); 
finally 
    memo1.Perform(wm_setredraw, 1, 0); 
    memo1.invalidate; 
end;