【问题标题】:Timing a recursive iteration through a nested object JavaScript通过嵌套对象 JavaScript 计时递归迭代
【发布时间】:2020-04-24 10:13:56
【问题描述】:

我有一个具有以下结构的对象。

var obj = {
        "a":{"content": [/*elements*/]},
        "b":{
            "d":{
                "g":{"content":[/*elements*/]},
                "h":{
                    "j":{"content":[/*elements*/]},
                    "k":{"content":[/*elements*/]}
                },
                "i":{
                    "l":{"content":[/*elements*/]}
                }
            },
            "e":{"content":[/*elements*/]},
            "f":{"content":[/*elements*/]}
        },
        "c":{"content":[/*elements*/]},
        /* Object goes on with different levels of nesting*/
    };

嵌套对象的格式表现出一种独特的行为—— 每个嵌套对象都具有 1. 一个名为 "content" 的属性,其 value 是一维元素数组,或 2. 不同级别的嵌套对象 其属性最终缩小到上述 (1)。

我有一个递归函数来搜索整个obj的content数组如下:

function search(index) {
    for(var key in index) {
            var current = index[key];
            var cLength = Object.keys(current).length;

            if(cLength > 1 ) {
                search(current);
            } else {
             if (index[key]["content"] == undefined) {
                    search(current);
                } else { 
                    contentsArray = index[key]["content"];
                    // Search Contents Array
                }
            }
    }
}

search(obj);

实际的 obj 是一个深度嵌套的对象,具有相当多的数据条目。 我想运行基准测试以获得平均时间 采取在"contents" 数组中的任何嵌套对象中搜索元素。我的问题是 - 我如何识别 父对象obj 的最后一个for...in 循环同时递归循环它? (记录完成时间)有没有更好的计时方法 执行这样的功能?

我尝试将for loop 完成循环遍历"contents" 数组(对于每个嵌套对象)的时间推到全局execTime 数组,然后在搜索函数之外使用setTimeout 函数得到execTimemaxmin 值之间的差异,因为我不确定递归搜索函数何时停止执行。

【问题讨论】:

  • 除非我遗漏了什么,否则为什么不直接使用console.time("recursion"); search(obj); console.timeEnd("recursion");?您可以将console.time 换成其他方法来获取时间,如果您愿意,但基本上,只需测量对search 的初始调用何时开始和结束。
  • @vlaz - 好建议。这是一个工作示例的链接:leetcode.com/playground/dFD5Dgec

标签: javascript object recursion iteration for-in-loop


【解决方案1】:

您可以让您的搜索函数返回总执行时间,您可以一直添加到初始 search 调用。

当搜索函数命中return 时,这将是您最后一次递归调用。例如,在最后一次调用中,cLength 将为零,这意味着不需要进一步搜索,else 将在点击return 之后执行。这将一直发生到最初的search 调用。

【讨论】:

  • 请注意,每个递归调用都有自己的返回语句。此外,由于所有嵌套对象都至少具有一个属性,因此 cLength 不会等于 0(始终为 1>1)。
【解决方案2】:

@VLAZ 的评论被证明非常有用:我已经决定使用以下内容来运行基准测试(仍然没有弄清楚 *in-code 解决方案,但这可以完成工作)

console.time("recursion"); 
search(obj); 
console.timeEnd("recursion");

这是一个有效的demo

【讨论】:

    【解决方案3】:

    您可以在浏览器中使用 User Timing API

    function doStuff() {
      // long running
    }
    
    performance.mark('start-token');
    doStuff();
    performance.mark('end-token');
    performance.measure('time', 'start-token', 'end-token');
    
    console.log('time: ', performance.getEntriesByType("measure")[0].duration);
    performance.clearMarks();
    performance.clearMeasures();

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-28
      • 1970-01-01
      • 2012-02-12
      相关资源
      最近更新 更多