希望优化我的代码以提高速度。当前,该代码检测到任何扑克手,大约需要350ms的时间进行32000次迭代。但是,检测直线的功能似乎要占用大约160ms的最大时间,因此需要寻找进一步优化它的方法。
整个代码最初是用php编写的,因为这是我最熟悉的东西,但是尽管php 7的速度有所提高,但它似乎仍然比javascript慢。我在翻译为javascript时发现的是,javascript中不存在许多php的内置函数,这导致了无法预料的速度降低。虽然它总体上仍比原始php代码更快,但是我正在寻找是否可以对其进行更多优化。也许答案是否定的,但我还是想检查一下。
我已经编写了函数range
和arrays_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; }
答案 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)不会在每次迭代时都创建中间数组,而您使用range
和slice
2)不会将数组作为字符串进行比较,这需要进行类型转换和字符串比较,这比将两个数字相互比较要慢得多。
3)它不会自行检查所有3个范围(1-5、2-6、3-7),而是一次执行所有操作,因此它仅迭代5个位置而不是3 x5。< / p>