代码之家  ›  专栏  ›  技术社区  ›  Ian Stewart

OpenEdge连接的性能

  •  1
  • Ian Stewart  · 技术社区  · 7 年前

    我注意到正在进行(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 类来解决这个问题。

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

    2 回复  |  直到 7 年前
        1
  •  3
  •   bupereira    7 年前

    据我所知,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提到的,如果我们有一个实际问题要解决,这会更容易。

        2
  •  2
  •   Stefan Drissen    7 年前

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

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

    11.7.2中提到的进展:

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