4

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

同事说:

assign
  a=3
  v=7
  w=8.

比:

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

为什么?

4

3 回答 3

7

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

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

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

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

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

于 2013-06-14T14:21:30.640 回答
1

基本上在做:

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

是相同的:

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

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

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

于 2013-06-18T06:50:37.273 回答
0

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

而不是 INSERT INTO (a)... INSERT INTO (v)

等等

于 2013-06-14T13:09:20.950 回答