gpt4 book ai didi

Javascript 代理 : detect recursions

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:54:50 26 4
gpt4 key购买 nike

我想创建一个简单的性能记录器:

function makePerformanceMeasured(target) {
return new Proxy(target, {
apply: (target, thisArg, args) => {
if(!target.name) {
throw 'The function must have a name'
}
console.time(target.name);
const result = target.apply(thisArg, args);
console.timeEnd(target.name);
return result;
}
})
}

对于非递归函数——一切正常:

function isPrime(n) {
if(n < 2) {
return false;
}
for(var i = 0; i < n; i++) {
if(n % i === 0) {
return false;
}
}

return true;
}
isPrime = makePerformanceMeasured(isPrime);
isPrime(100); // 0.001ms false

但是对于递归函数:

function fact(n) {
if(n < 2) {
return 1;
}
return n * fact(n - 1);
}
fact = makePerformanceMeasured(fact);
fact(4);
// 0.025ms
// 0ms
// 0ms
// 24

我想在 Proxy apply 陷阱中检测 - 如果函数已被递归调用 - 仅对堆栈中的第一个函数调用进行时间测量。谢谢!

最佳答案

你可以设置一个标志来记住你是否已经在通话中:

function makePerformanceMeasured(target) {
var isCalled = false;
return new Proxy(target, {
apply: (target, thisArg, args) => {
if (!isCalled) {
console.time(target.name);
isCalled = true;
const result = Reflect.apply(target, thisArg, args);
isCalled = false;
console.timeEnd(target.name);
return result;
} else {
return Reflect.apply(target, thisArg, args);
}
}
})
}

关于Javascript 代理 : detect recursions,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47155618/

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