Node.js已实施了一段时间来实现W3C性能API。最近,我发现node.js还提供了方便的直方图API,可以获得平均值,最小值,最大值,中值或指定百分比,标准偏差,标准偏差,标准偏差。对于通用功能执行时间的统计需求,您可以:
(node.js v16+)生成一个包装函数。每个呼叫将是FN的定时(纳秒)(纳秒)(单元为纳秒),并将时间消耗写入历史记录。看起来此API用于进行微问题。
但是,当我使用它时,我遇到了错误的返回值 - 如果它是原始值,则包装函数的返回值将变成一个空的对象。自然而然地挂了程序。
研究之后,我发现如果它是正常功能(即),它将始终以某种方式称呼它。
我在Node.js仓库中找到了它,有些人已将问题#40623发出。也有PR#40625试图维修,但由于其维修方法不合理,因此尚未关闭。
从讨论中可以看出,原始作者的意图是,如果它是构造函数,那么它是新的,所以我写了类似的逻辑,但是我忘记了普通函数也是构造函数。
[因此,有一个解决箭头函数的解决方法 - 箭头函数不是构造函数。
PR更改为类似。但是这导致传统的非类别构造函数。尽管ES6已经使用了类,尽管大多数新代码都已使用,但总有旧的代码。其他情况是代码本身是在类中写的,但可能是数据包仍将其编译到ES5中。
[此外,通过这样的黑客,PR的判断是不可靠的。例如,根据当前的Stage 3 Decorator建议,装饰员修改的类的结果将包括装饰器(即开始);将来,其他修饰符(还可能包括其他修饰符(例如... ,,,等)。
实际上,合理的逻辑不是要检查FN是否是构造函数,而是语义的原始传输 - 包装函数应该在这里是代理。
如果实现了,则非常简单,如下所示:
但是我们可能不想使用代理。(例如,担心代理的性能吗?
如何直接编写包装函数?
从逻辑上讲,iSnew表示当前的执行函数是由新调用的,但是如何编写它?
传统上,我们可以使用它来确定:
但是现在您可以牺牲更准确的元属性:
[请注意,第三个参数未在当前实现中传递。这意味着在子类继承的情况下,当前实现无法正确处理。
此外,最好与构造函数相同,并且包装函数不是构造函数。
[要返回非构造函数,您可以使用部分门提示-Brebreviated Form,方法不是构造函数,因此您可以写下:..
PS。在研究此错误时,我检查了源代码并找到了其他两个错误,所以我去打开它。
第一个问题是performance.Timerify(fn,options)始终返回相同的计时函数·问题#42742·nodejs/node。
目前,蛇绘画已被缓存,即多个结果的结果返回相同的功能。但是,我们可能需要为同一功能生成多个包装功能,例如生成不同的统计功能以供使用在不同的情况下具有相同的功能:
结果,呼叫的时间数据未编写,也没有编写。
第二个问题是性能。Timerify(FN)对于同步/异步函数的行为不一致·问题#42743·Nodejs/node。
对异步功能进行特殊处理(或返回的所有功能)。时机不是在函数调用结束时(返回的承诺),而是在承诺完成后。这与大多数用户的直觉一致。但是当前实现不使用呼叫,但是再次使用呼叫。将确保无论取得成功或失败,它似乎总是更加“安全”,但实际上,它会在异步函数和非hetercomes的调用之间引起不一致。如果投掷,它将无法完成此通话的时间。
为了确保一致性不需要或不需要。它 ...
所以应该使用它吗?不应该使用。由于我们要测量测量功能的运行时间,投掷或拒绝表明该函数的正常计算逻辑无法完成该函数的功能,不符合我们的统计目标,不应定时。
[即使您使用它,当前实现中的逻辑也是一个问题。由于承诺或so值符号的徽标是一种方法,而不是一种方法。依赖关系方法与上面提到的依赖关系一样严格。
摘要:编写代码要严格并不容易。即使是node.js这样的明星项目,也来自詹姆斯·M·斯内尔(James M Snell)等高级程序员的手,即使是不太复杂的API,只有100行代码...它可能会隐藏各种问题。
[当然,我们可以在没有错误的情况下喷射Node.js的代码质量;实际上,即使使用了JS引擎代码,也经常出现错误(例如https://github.com/hax/hax.github.com/issues/51);js标准规格,也有许多错误。例如,前面提到的方法,存在与行为和行为方法不一致的错误。委员会尚未就如何修复此错误达成协议...简而言之,它是人类的产物。与复杂的人类系统中的各种错误相比,战争,像集体购买一样小,最容易处理该程序的错误,并且可以清楚地写一篇文章。
[“浏览器和node.js中的“测量执行时间”的标题是一个很好的条目。
[本文首先在我的Zhihu专栏中发行:https://zhuanlan.zhihu.com/p/498708739]
原始:https://juejin.cn/post/7096387106297085988