2017-11-11 102 views
1

我在Progress(11.4)中已經注意到重複的字符串連接可能非常慢。例如在下面的代碼中。OpenEdge級聯的性能

DEF VAR i AS INT NO-UNDO. 
DEF VAR c AS LONGCHAR NO-UNDO. 

DO i = 1 TO 1000000: 
    c = c + STRING(i MOD 10). 
END. 

從我在Java中的經驗,我認爲這個問題是每個我們串接的時候,我們要複製ç這是一個O(n)的操作,所以整個過程是O(n^2)。 Java提供了StringBuilder類來解決這個問題。

我對問題的分析是否正確?如果是這樣,是否有解決方案?

+0

是否有一個實際的問題需要解決,或許可以採用不同的方法?但是,我們需要知道這個問題。 – Jensd

+0

我加倍請求瞭解更多詳細信息。基於MEMPTR的實現也可能工作得很好。 –

+0

11.4?沒有10.4版本... 10.2是最新的10.x版本。 – Jensd

回答

3

出於好奇,我用你的示例代碼做了一個測試,它在266秒內完成,或者在4.5分鐘內完成。

進度OpenEdge不提供任何類似於stringbuilder的東西,據我所知,但我認爲我們做盲目追加的方法是將文件。所以我修改您的代碼如下:

etime(true). 
DEF VAR I AS INT NO-UNDO. 
DEF VAR c AS LONGCHAR NO-UNDO. 
output to value(session:temp-directory + 'test.txt'). 
DO i = 1 TO 1000000: 
    put unformatted i mod 10. 
END. 
output close. 
COPY-LOB FROM FILE SESSION:TEMP-DIRECTORY + 'test.txt' TO c. 
disp c VIEW-AS EDITOR LARGE SIZE 70 BY 15. 
MESSAGE etime 
     VIEW-AS ALERT-BOX INFO BUTTONS OK. 

通過這種方法,輸出時間急劇下降,到一點點大於0.8秒。

我不知道這是否有幫助或回答你的問題,但正如Jensd所說,如果我們有一個實際的問題來解決這個問題,會更容易。