我有我的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]);
}
但是由于totallength和totaltime不是全局变量,我无法真正衡量我的视图性能,我想知道它在不同的行数上运行需要多长时间。
答案 0 :(得分:1)
函数内部没有全局变量。它只有局部变量。全局变量只能在全局范围内定义(在函数之外)。但是在couchbase中,你不能在reduce函数之外定义任何变量。
如果你想测量视图性能你的代码完全错误,因为你只是测量它的一部分,因为这个函数可以多次调用。阅读有关reduce函数的couchbase文档(参见下面的链接)。
最后,您编写的代码不会测量视图性能,因为它只能测量视图索引性能。并且查看性能不等于索引性能,主要是因为大多数情况下索引过程在后台运行,并且不会影响视图性能。
我建议您阅读此document有关视图的信息以及它们的工作原理。另请注意关于减少功能的paragraph。
UPD:
全局变量不能存在于reduce函数的上下文中。如果仔细阅读有关视图的文档及其reduce函数,您应该了解reduce函数可以在集群中的不同服务器上多次调用。因此,您无法定义在群集中的多个服务器上将是全局的任何变量。您只能使用返回的变量进行操作。您还需要在reduce函数中处理rereduce
,否则,您将计算最新reduce的rereduce时间并忽略之前的所有值。
衡量视图性能的更好方法是生成负载测试并以最大操作/秒操作,而不是绝对时间的视图索引过程。如果您需要测量索引速度 - 使用stale=false
参数查询您的视图将强制couchbase在返回结果之前更新索引,因此该查询的时间将表示映射和减少结果所花费的时间(即您甚至可以使用卷曲或网络浏览器)。但在实际应用中,您需要避免使用stale=false
进行查询。
要调整缩减代码,您只需在浏览器中测量它的性能,或者在nodejs中更好。只需复制reduce函数并将其与地图数据一起调用即可。如果您在浏览器中优化代码,您的代码在CB中会更快。你甚至可以找到在线jsvascript map-reduce模拟器。