0

我有我的 reduce 方法,我想计算需要多少时间,所以我基本上想做类似的事情:

function(key, values, rereduce) {
  var start_time = new Date();

  // my calcs here.

  var totallength = 0; // this is wrong... any global variables or closure?
  var totaltime = 0; // this is wrong... any global variables or closure?

  time_calc_took = new Date() - start_time;
  totallength += values.length;
  totaltime += time_calc_took;
  return([totallength, totaltime, someother_results]);
}

然而,由于总长度和总时间不是全局变量,我无法真正衡量我的视图性能,我想知道它在不同的行数上运行需要多少时间。

4

1 回答 1

1
  1. 函数内部没有全局变量。它只有局部变量。全局变量只能在全局范围内(函数外)定义。但是在 couchbase 中,您不能在 reduce 函数之外定义任何变量。

  2. 如果你想测量视图性能,你的代码是完全错误的,因为你只测量它的一部分,因为这个函数可以被多次调用。阅读关于 reduce 函数的 couchbase 文档(参见下面的链接)。

  3. 最后,您编写的代码不会测量视图性能,因为它只能测量视图索引性能。并且视图性能不等于索引性能,主要是因为索引进程在大多数情况下是在后台运行的,并不影响视图性能。

我建议您阅读有关视图及其工作原理的文档。还要注意关于减少功能的段落。

UPD:全局变量不能存在于 reduce 函数的上下文中。如果您仔细阅读有关视图及其reduce函数的文档,您应该了解reduce函数可以在集群中的不同服务器上多次调用。所以你不能定义任何在集群中的多台服务器上都是全局的变量。您只能对返回的变量进行操作。您还需要rereduce在 reduce 函数中处理,如果不这样做,您将计算最新 reduce 的 rereduce 时间并忽略所有以前的值。

衡量视图性能的更好方法是生成负载测试并以最大操作/秒操作,而不是视图索引过程的绝对时间。如果您需要测量索引速度 - 使用stale=false参数查询您的视图,这将强制 couchbase 在返回结果之前更新索引,因此该查询的时间将代表映射和减少结果所花费的时间(即您甚至可以使用 curl 或 Web 浏览器) . 但在实际应用中,您需要避免使用stale=false.

要调整你的 reduce 代码,你可以在浏览器中测量它的性能,或者在 nodejs 中更好。只需复制您的 reduce 函数并使用您的地图数据调用它。如果您在浏览器中优化您的代码,您的代码在 CB 中会更快。你甚至可以找到在线 jsvascript map-reduce 模拟器。

于 2013-10-01T19:56:47.520 回答