OpenEdge级联的性能
问题描述:
我在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
类来解决这个问题。
我对问题的分析是否正确?如果是这样,是否有解决方案?
答
这是一个已知的问题 - 下面的链接还包含一个变通通过缓冲中字符变量并置:
https://blog.abevoelker.com/introducing_bigcharacter/
的进展认可和11.7.2解决:
答
出于好奇,我用你的示例代码做了一个测试,它在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所说,如果我们有一个实际的问题来解决这个问题,会更容易。
是否有一个实际的问题需要解决,或许可以采用不同的方法?但是,我们需要知道这个问题。 – Jensd
我加倍请求了解更多详细信息。基于MEMPTR的实现也可能工作得很好。 –
11.4?没有10.4版本... 10.2是最新的10.x版本。 – Jensd