我注意到进度(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类来解决这个问题。
我对这个问题的分析正确吗?如果是的话,有解决办法吗?
发布于 2017-11-13 07:46:47
这是一个已知的问题--以下链接还包含一个通过缓冲字符变量中的连接来解决的问题:
“进步”承认并在11.7.2中述及:
发布于 2017-11-12 05:03:42
出于好奇,我用你的示例代码做了一个测试,它用了266秒,或不到4.5分钟就完成了。
据我所知,Progress没有提供类似于字符串构建器的任何东西,但我认为我们做盲追加的方式应该是文件。因此,我修改了您的代码如下:
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秒多一点。
我不知道这是否对你的问题有帮助或回答,但正如詹斯所提到的,如果我们有一个实际的问题来解决,那就容易多了。
https://stackoverflow.com/questions/47233081
复制相似问题