2017-11-11 119 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所说,如果我们有一个实际的问题来解决这个问题,会更容易。