gpt4 book ai didi

javascript - 尝试对 JavaScript 函数进行计时时出现错误

转载 作者:行者123 更新时间:2023-11-28 05:49:11 28 4
gpt4 key购买 nike

我面临的挑战本质上是:给定一个数字数组作为输入,在 j < i 且 input[i] > input[j] 的情况下,找到任意两个数字之间的最大差异。

我写了两个解决方案,一个是强力双嵌套循环,另一个是我尝试优化它。它们如下:

// Brute Force Method
function findGreatestDiffV1(nums) {
let start = new Date().getTime();
let greatestDiff = 0;
for (let i = 1; i < nums.length; i++) {
for (let j = 0; j < i; j++) {
let diff = nums[i] - nums[j];
if (diff > greatestDiff) greatestDiff = diff;
}
}
console.log(((new Date().getTime() - start) / 1000.0) + " Seconds");
return greatestDiff;
}

// Optimized method
function findGreatestDiffV2(nums) {
let start = new Date().getTime();
let smallestNum = nums[0];
let greatestDiff = 0;
for (let i = 1; i < nums.length; i++) {
if (nums[i] < smallestNum) smallestNum = nums[i];
if ((nums[i] - smallestNum) < greatestDiff) continue;
for (let j = 0; j < i; j++) {
let diff = nums[i] - nums[j];
if (diff > greatestDiff) greatestDiff = diff;
}
}
console.log(((new Date().getTime() - start) / 1000.0) + " Seconds");
return greatestDiff;
}

这些工作正常,并输出正确的结果和预期的运行时间,即对于较大的数据集,V2 的运行时间明显较低。

然后我修改它们以仅返回运行时:

function findGreatestDiffV1Time(nums) {
let start = new Date().getTime();
let greatestDiff = 0;
for (let i = 1; i < nums.length; i++) {
for (let j = 0; j < i; j++) {
let diff = nums[i] - nums[j];
if (diff > greatestDiff) greatestDiff = diff;
}
}
return ((new Date().getTime() - start) / 1000.0);
}

function findGreatestDiffV2Time(nums) {
let start = new Date().getTime();
let smallestNum = nums[0];
let greatestDiff = 0;
for (let i = 1; i < nums.length; i++) {
if (nums[i] < smallestNum) smallestNum = nums[i];
if ((nums[i] - smallestNum) < greatestDiff) continue;
for (let j = 0; j < i; j++) {
let diff = nums[i] - nums[j];
if (diff > greatestDiff) greatestDiff = diff;
}
}
return ((new Date().getTime() - start) / 1000.0);
}

我创建了这个辅助函数,它生成长度 numOfDiffs 和最大个体数 maxDiff 的输入:

function generateDiffs(numOfDiffs, maxDiff) {
let diffs = [];
for (let i = 0; i < numOfDiffs; i++) {
diffs.push(Math.floor(Math.random() * maxDiff));
}
return diffs;
}

然而,事情就在此时出现了问题,我不明白为什么。

当使用仅返回运行时的版本时,无论输入的大小如何,我得到的 V1 时间均为 0。 V2 为任何大小集返回正确的时间,但 V1 几乎立即继续转义并返回 0。

最可能的问题是我在某个地方有一个明显的错误,但我想知道这是否可能是对 JavaScript 如何执行某些功能的一些误解,甚至是某个地方的范围出血。但无论如何,我找不到它,这让我发疯。

最佳答案

所以,@Barmar 就是这里的人。 Chrome 绝对是在尝试通过跳过它看到的函数从未返回的所有内容来优化我的代码。一旦我将返回值更改为

return [((new Date().getTime() - start) / 1000.0), greatestDiff];

我开始得到预期的结果。

很有趣的是我没有在 V2 中得到这个;正如 Barmar 所说,更复杂的指令很可能导致 Chrome 过于谨慎。

此外,作为记录,这是我编写的用于计算运行时间的函数。

function runTimes(numOfDiffs, maxDiff) {
let runTimeDiffs = generateDiffs(numOfDiffs, maxDiff)
let timesV1 = 0;
let timesV2 = 0;
for (let x = 0; x < 10; x++) {
timesV1 += findGreatestDiffV1Time(runTimeDiffs)[0];
timesV2 += findGreatestDiffV2Time(runTimeDiffs)[0];
}
console.log(`V1 times for numOfDiffs = ${numOfDiffs} and maxDiff = ${maxDiff} was: ${timesV1 / 10} seconds.`)
console.log(`V2 times for numOfDiffs = ${numOfDiffs} and maxDiff = ${maxDiff} was: ${timesV2 / 10} seconds.`)
}

至于@gcampbell关于使用performance.now的建议,我会研究一下;我不熟悉该功能。很高兴知道这些事情:)

关于javascript - 尝试对 JavaScript 函数进行计时时出现错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38229392/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com