OpenEdge 级联的性能

Performance of OpenEdge concatenation

我在 Progress (11.4) 中注意到,重复的字符串连接可能会非常慢。例如在下面的代码中。

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 的经验,我认为问题在于每次我们连接时,我们都在复制 c 这是一个 O(n) 操作,所以整个过程是 O(n^2 ). Java提供了StringBuilderclass来解决这个问题。

我对问题的分析是否正确?如果是这样,有解决办法吗?

出于好奇,我用你的示例代码做了一个测试,它在 266 秒内完成,或者不到 4.5 分钟。

据我所知,Progress 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 所提到的,如果我们有一个实际问题要用它来解决,那就更容易了。

这是一个已知问题 - 以下 link 还包含通过缓冲字符变量中的串联来解决的问题:

https://blog.abevoelker.com/introducing_bigcharacter/

Progress 认可并在 11.7.2 中解决:

https://knowledgebase.progress.com/articles/Article/concatenating-to-longchar-takes-exponentially-longer