是否可以优化此扑克直接检测功能的JavaScript?

时间:2019-04-04 07:45:08

标签: javascript node.js

希望优化我的代码以提高速度。当前,该代码检测到任何扑克手,大约需要350ms的时间进行32000次迭代。但是,检测直线的功能似乎要占用大约160ms的最大时间,因此需要寻找进一步优化它的方法。

整个代码最初是用php编写的,因为这是我最熟悉的东西,但是尽管php 7的速度有所提高,但它似乎仍然比javascript慢。我在翻译为javascript时发现的是,javascript中不存在许多php的内置函数,这导致了无法预料的速度降低。虽然它总体上仍比原始php代码更快,但是我正在寻找是否可以对其进行更多优化。也许答案是否定的,但我还是想检查一下。

我已经编写了函数rangearrays_equal,因为这些函数要么在javascript中丢失,要么运行不正常。

function straight(handval) {
  if (arrays_equal(handval.slice(0, 4),[2, 3, 4, 5]) && handval[handval.length-1] == 14) {//if is Ace 2345
    return [4,14];
  }
  else {//if normal straight
    for (let i = handval.length - 5; i >= 0; i--) {
     let subhand = handval.slice(i, i + 5);
     if (arrays_equal(subhand, range(subhand[0], subhand[subhand.length-1]))) {
      return [4,subhand[4]];
     }
   } return [0]
  }
}

function arrays_equal(a,b) { return !!a && !!b && !(a<b || b<a); }

function range(start, end) {
    let arr = [];
    for (let i = start; i <= end; i++) {
        arr.push(i);
    }
    return arr;
}

时间间隔是一个简单的数组,由2个数字中的5-7个元素组成,代表卡片,因此例如可以是[6,8,4,11,13,2][8,4,13,8,10]

编辑:使用以下代码同时调用和排序该函数:

straight(handval.slice(0).sort(sortNumber));

function sortNumber(a,b) { return a - b; }

1 个答案:

答案 0 :(得分:1)

您可以从右向左移动并计算连续数字:

 function straight(handval) {
   if([2, 3, 4, 5].every((el, i) => handval[i] === el) && handval[handval.length-1] === 14)
     return [4, 14];

   let count = 1;
   for(let i = handval.length - 1; i >= 1; i -= 1) {
     if(handval[i] === handval[i - 1] + 1) {
       count += 1;
       if(count === 5) return [ 4, handval[i + 3] ];
     } else {
       count = 1;
     }
   }

  return [0];
}

那是更快的方式:

1)不会在每次迭代时都创建中间数组,而您使用rangeslice

2)不会将数组作为字符串进行比较,这需要进行类型转换和字符串比较,这比将两个数字相互比较要慢得多。

3)它不会自行检查所有3个范围(1-5、2-6、3-7),而是一次执行所有操作,因此它仅迭代5个位置而不是3 x5。< / p>