【问题标题】:what is the efficiency of an assign statement in progress-4gl进行中的分配语句的效率是多少-4gl
【发布时间】:2013-06-11 03:15:37
【问题描述】:

为什么分配语句比不使用分配更有效?

同事说:

assign
  a=3
  v=7
  w=8.

比以下更有效:

a=3.
v=7.
w=8.

为什么?

【问题讨论】:

    标签: progress-4gl openedge


    【解决方案1】:

    您总是可以自己测试并查看...但是,是的,它的效率稍高一些。或者这是我最后一次测试它。原因是编译器将语句组合在一起,生成的 r-code 有点小。

    但效率几乎总是一个糟糕的理由。在这里和那里节省一微秒与避免磁盘 IO 或选择更有效的算法相比显得相形见绌。充分的理由:

    1. 在黑暗时代,每个程序的 r 代码限制为 63k。将语句与 ASSIGN 相结合是一种减少 r 代码大小并保持在该限制以下的方法(好吧,这可能不是一个“好”的理由)。另一个有帮助的方法是,您还可以经常避免 DO ... END 对并进一步减少 r 代码大小。

    2. 创建或更新记录时,作为索引一部分的字段将在分配时写回数据库(而不是在事务结束时)——将所有分配分组到单个语句中有助于避免不一致脏读。将索引字段分组为单个 ASSIGN 可避免多次写入索引条目。 (这可能是使用 ASSIGN 的最佳理由。)

    3. 可读性——您可以争辩说,将连续作业分组更清楚地表明了您的意图,因此更具可读性。 (我喜欢这个理由,但不是每个人都同意。)

    【讨论】:

    • 关于 1):AFAIK 索引在任何时候写入其字段之一时都会更新。如果将分配索引字段拆分为单独的分配语句,则索引将多次更新,这对性能不利。脏读是一个有效的考虑因素,但更重要的是,如果索引字段的中间状态已经存在于表中,您可能会违反唯一索引。
    【解决方案2】:

    基本上在做:

    a=3.
    v=7.
    w=8.
    

    等同于:

    assign a=3.
    assign v=7.
    assign w=8.
    

    这是 3 个单独的语句,因此开销更大。因此效率较低。

    无论有 1 个或多个变量被赋值,Progress 都会作为一个语句赋值。如果您不说 Assign,则假定您将执行 3 条语句而不是 1 条。使用一条分配语句时,R 代码减少了 20% - 40%,性能提高了 15% - 20%。为什么这是只能推测,因为我找不到任何关于为什么会这样的信息的来源。对于数据库字段,尤其是键/索引字段,它非常有意义。对于变量,我只能假设它与进度如何管理其缓冲区以及将数据复制到缓冲区和从缓冲区复制数据有关。

    【讨论】:

    • 为什么开销更大?编译器是否不必分别计算所有 3 个语句(即使只使用一个“分配”)?
    • 无论有 1 个或多个变量被赋值,Progress 都会作为一个语句赋值。如果您不说 Assign,则假定您将执行 3 条语句而不是 1 条。使用一条分配语句时,R 代码减少了 20% - 40%,性能提高了 15% - 20%。为什么这是只能推测,因为我找不到任何关于为什么会这样的信息的来源。对于数据库字段,尤其是键/索引字段,它非常有意义。对于变量,我只能假设它与进度如何管理其缓冲区以及将数据复制到缓冲区和从缓冲区复制数据有关。
    【解决方案3】:

    ASSIGN 会将多个语句合并为一个。如果 a、v 和 w 是数据库中的字段,这意味着它将执行类似 INSERT INTO (a,v,w)...

    而不是 插入 (a)... 插入 (v)

    等等

    【讨论】:

    • 这对于数据库分配是有意义的,但是在程序中加载变量呢?这种情况下效率更高?
    • 是的,它也更有效。它与 Progress 处理内存访问的方式有关。
    猜你喜欢
    • 1970-01-01
    • 2018-12-15
    • 1970-01-01
    • 2018-08-04
    • 2020-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-18
    相关资源
    最近更新 更多