簡體   English   中英

通過嵌套對象 JavaScript 為遞歸迭代計時

[英]Timing a recursive iteration through a nested object JavaScript

我有一個具有以下結構的對象。

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"的屬性,其值為一維元素數組,要么具有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函數來獲取maxminexecTime因為我不知道什么時候遞歸搜索功能停止執行。

@VLAZ 的評論證明非常有用:我已經決定使用以下內容來運行基准測試(仍然沒有找到 *in-code 解決方案,但這完成了工作)

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

這是一個工作演示

您可以讓您的搜索函數返回總執行時間,您可以將其添加到初始search調用中。

當搜索函數命中return ,這將是您最后一次遞歸調用。 例如,在最后一次調用時, cLength將為零,這意味着不需要進一步搜索, else將在之后執行點擊return這將一直發生到初始search調用。

您可以在瀏覽器中使用 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();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM