Javascript Javscript竞赛问题中对象与地图的性能

Javascript Javscript竞赛问题中对象与地图的性能,javascript,performance,dictionary,object,Javascript,Performance,Dictionary,Object,我使用memoization来尝试提高递归算法的性能。我希望Javascript中的对象和映射具有相同的性能(读写为O(1)) 看看其他StackOverflow帖子,他们说根据实现/浏览器的不同,性能可能会有2倍或3倍的差异,但是,我发现对象与映射实现算法之间的性能差异约为40倍 在LeetCode上,对象实现的性能约为8000ms(比仅5%的js解决方案快,比不使用Memonization慢) 而map在LeetCode上的实现性能约为184ms(比70%的js解决方案快) 下面是我的代码。

我使用memoization来尝试提高递归算法的性能。我希望Javascript中的对象和映射具有相同的性能(读写为O(1))

看看其他StackOverflow帖子,他们说根据实现/浏览器的不同,性能可能会有2倍或3倍的差异,但是,我发现对象与映射实现算法之间的性能差异约为40倍

在LeetCode上,对象实现的性能约为8000ms(比仅5%的js解决方案快,比不使用Memonization慢)

而map在LeetCode上的实现性能约为184ms(比70%的js解决方案快)

下面是我的代码。完全相同的解决方案,对象解决方案未注释,而映射解决方案被注释掉

我的代码在对象记忆实现方面是否犯了一个很大的错误,这会使它慢得多?或者这是LeetCode映射与对象实现的区别


/**
 * @param {number[]} nums
 * @param {number} S
 * @return {number}
 */


var findTargetSumWays = function(nums, S) {
    //let memo=new Map(); 
    let memo={};
    return helper(0,S);

    function helper(numsPointer,S){
        let numWays=0;
        if(numsPointer==nums.length&&S===0){return 1;} //base case. All nums in array used and Sum matches
        if(numsPointer==nums.length){return 0;} //all nums in array used
        //if(memo.has(numsPointer+":"+S)){return memo.get(numsPointer+":"+S);}
        if(memo[numsPointer+":"+S]){return memo[numsPointer+":"+S];}

        let curr=nums[numsPointer];

        numWays+=helper(numsPointer+1,S+curr);
        numWays+=helper(numsPointer+1,S-curr);
        //memo.set(numsPointer+":"+S,numWays); //store results
        memo[numsPointer+":"+S]=numWays;
        return numWays;
    }//helper


};

LeetCode的问题是:

给您一个非负整数列表,a1、a2、…、an和目标S。现在您有2个符号+和-。对于每个整数,您应该从+和-中选择一个作为其新符号。 了解分配符号使整数和等于目标S的方法

当同时使用贴图和对象进行记忆时,解决方案是正确的,但性能差异巨大。使用对象进行记忆实际上会导致性能损失


谢谢大家!

对于CodeReview来说,这可能是一个更好的问题,而不是StackOverflow。它是否有效???映射解决方案和对象解决方案都有效。虽然映射解决方案比对象解决方案快40倍左右,但我希望有类似的性能。IIRC映射针对添加/删除对象进行了显式优化,而对象为继承和键映射做了额外的工作。一段时间以来,地图的速度一直比物体快。