Performance OpenEdge连接的性能

Performance OpenEdge连接的性能,performance,string-concatenation,openedge,progress-4gl,Performance,String Concatenation,Openedge,Progress 4gl,我已经注意到在进行中(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提供了StringBuilder类来解决这个问题 我

我已经注意到在进行中(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提供了
StringBuilder
类来解决这个问题


我对这个问题的分析正确吗?如果是这样,有解决方案吗?

出于好奇,我用您的示例代码做了一个测试,它在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提到的,如果我们有实际问题要解决,这会更容易。

出于好奇,我用您的示例代码进行了测试,测试在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所提到的,如果我们有一个实际问题来解决这一问题会更容易。

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

在第11.7.2条中得到确认和解决:


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

在第11.7.2条中得到确认和解决:


是否有实际问题需要解决?或者可以采用不同的方法?但是我们需要知道这个问题。我加倍要求更多细节。基于MEMPTR的实现也可以很好地工作。11.4?没有10.4版本。。。10.2是最后一个10.x版本。@Jensd该问题已经出现过几次。例如,我们有一个电子邮件地址临时表,我们希望将它们连接成一个以分号分隔的字符串。您对版本的看法是正确的,经过编辑。是否有实际问题需要解决?也许可以应用另一种方法?但是我们需要知道这个问题。我加倍要求更多细节。基于MEMPTR的实现也可以很好地工作。11.4?没有10.4版本。。。10.2是最后一个10.x版本。@Jensd该问题已经出现过几次。例如,我们有一个电子邮件地址临时表,我们希望将它们连接成一个用分号分隔的字符串。您对版本的看法是正确的,已编辑。