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提供了StringBuilder
class来解决这个问题。
我对问题的分析是否正确?如果是这样,有解决办法吗?
出于好奇,我用你的示例代码做了一个测试,它在 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 中解决:
我在 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提供了StringBuilder
class来解决这个问题。
我对问题的分析是否正确?如果是这样,有解决办法吗?
出于好奇,我用你的示例代码做了一个测试,它在 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 中解决: