【问题标题】:Fastest way in JS to detect number of leading zerosJS中检测前导零数量的最快方法
【发布时间】:2016-10-09 22:34:07
【问题描述】:

我正在做一个项目,我需要快速检查字符串中是否有一定数量的前导零。我使用正则表达式取得了成功:

var regex = new RegExp('^[0]{' + difficulty + '}.+');
if (regex.test(hash))

还有子串和重复:

if (hash.substring(0, difficulty) === '0'.repeat(difficulty))

就我的特定目的而言,速度是最重要的元素。我必须找到最快的方法来检查前导零的数量是否与难度相匹配。我对这两种方法都进行了基准测试,但结果波动很大,我无法判断哪种方法更好。另外,如果有其他更好的方法,请告诉我。提前致谢。

【问题讨论】:

  • 简单的for循环就可以了
  • 你可以遍历字符串,所以你设置i = 0; i < 4; i++,所以4是你想要检测的前导零的数量
  • w3schools.com/jsref/jsref_charat.asp - 循环使用它。不知道它是否会更有效,但它很简单。
  • 或者只是 if(str.substr(0, 4) == "0000")

标签: javascript node.js string performance hash


【解决方案1】:
if (Number(n).toString() !== n){
    console.log("leading 0 detected")
}

这可能不是最快的,但比写一个函数简单

【讨论】:

    【解决方案2】:
    function detect(hash, difficulty) {
        for (var i = 0, b = hash.length; i < b; i ++) {
            if (hash[i] !== '0') {
                break;
            }
        }
        return i === difficulty;
    }
    

    您的方法的缺点是您构造中间对象并执行繁重的算术运算(尤其是使用正则表达式,但也使用子字符串和完整字符串比较)。这个应该很快。

    【讨论】:

    • 您在参数中声明的变量位于顶部 ^(您应该记住哈希长度以获得更好的性能)。
    • @KlaiderKlai 我已经接受了你的建议,但老实说这并不重要。 .length 在所有现代浏览器中无论如何都会被缓存,并且将 vars 放在循环中会使其可读性降低恕我直言。
    • @freakish 我正在使用最新的 Firefox,但它没有缓存它......那么请解释一下。
    • @KlaiderKlai 那是不可能的。我个人不使用 FF,但我在互联网上看到的性能测试都没有证实这一点。我认为length 缓存甚至是标准的一部分。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-24
    • 1970-01-01
    • 2020-12-03
    • 2019-10-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多