我用某种打字稿写了二进制搜索算法,我想针对array.indexOf获得它的性能。我的结果表明打字稿版本较慢。我试图在网络上的可用基准测试中评估性能,结果表明二进制搜索要快得多(应该如此)。这段代码/打字稿/我试图获得功能性能的方式出了什么问题?
我尝试过基准测试,结果看起来完全不同。 http://jsben.ch/VBjt0
下面的我的代码。
function binarySearch(
sortedArray: number[],
seekElement: number,
): number {
let startIndex = 0;
let endIndex: number = sortedArray.length - 1;
while (startIndex <= endIndex) {
const mid = startIndex + Math.floor((endIndex - startIndex) / 2);
const guess = sortedArray[mid];
if (guess === seekElement) {
return mid;
} else if (guess > seekElement) {
endIndex = mid - 1;
} else {
startIndex = mid + 1;
}
}
return -1;
}
const indexOfSearch = function(arr, element) {
return arr.indexOf(element);
};
const testArray = [...Array(100000).keys()].map(x => x + 1);
console.time('binarySearch');
binarySearch(testArray, 4400) // binarySearch: 0.134ms
console.timeEnd('binarySearch');
console.time('indexOfSearch');
indexOfSearch(testArray, 4400) // indexOfSearch: 0.029ms
console.timeEnd('indexOfSearch');
我也尝试通过此util函数使用performance.now
:
import { performance } from 'perf_hooks';
export const getPerformance = (func: Function, ...params) => {
const start = performance.now();
func(params);
const end = performance.now();
console.log(`${func.name} took ${end - start} milliseconds to execute`);
}
但是结果甚至更糟。在相同的测试数组中,使用getPerformance
函数进行二进制搜索需要11毫秒,而indexOf则需要0.003毫秒。它很奇怪,我不知道我在做什么错。感谢您的帮助
indexOf()
用二进制编写,称为“硬编码”函数的调用,该函数具有JavaScript的软接口。
probably it's also binary search
JavaScript开发人员并不愚蠢。您访问变量,通过OP代码和令牌以及所有虚拟沙箱的方式,永远无法达到光速(C)。
JavaScript关于性能的平均值,笔记本电脑尚未配备8GB内存。要做事更多的是要做事的简单性。如今,计算机比人类便宜。
如果您想对基准进行非常好的测试,请在WebAssembly中编写它,或使用C对其进行编译。但是,在花费时间的同时,请考虑以下事项:执行任务的能力远远不止几毫秒。