我的编程空间,编程开发者的网络收藏夹
学习永远不晚

什么是EventLoop?怎么测试Node或页面的性能

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

什么是EventLoop?怎么测试Node或页面的性能

const fns = []
window.addEventListener("message", () => {
    const currentFns = [...fns]
    fns.length = 0
    currentFns.forEach(fn => fn())
}, true);
function messageChannelMacroTaskDispatcher(fn) {
    fns.push(fn)
    window.postMessage(1)
}

可以看到和 node.js setImmediate 量级是一致的。

time: 78769.70 avg: 51759.83
time: 78975.60 avg: 48614.49
meaninglessRun: 921.143 ms
time: 80111.50 avg: 8805.14
time: 80327.00 avg: 46425.26
time: 80539.10 avg: 47169.81

MessageChannel

browser

理论上 browser 使用 MessageChannel 应该也是可以的,还避免了无效的消息被其他 window.addEventListener("message", handler) 接收:

const { port1, port2 } = new MessageChannel();
const fns = []
port1.onmessage = () => {
    const currentFns = [...fns]
    fns.length = 0
    currentFns.forEach(fn => fn())
};
function messageChannelMacroTaskDispatcher(fn) {
    fns.push(fn)
    port2.postMessage(1)
}

不是很懂为啥会比 window.postMessage 频繁一点,同时启动两个 checker 的话可以看到 log 是成对出现的,也就是说一个loop内大家都只执行了一次。我猜测是 window.postMessage 的实现方式消耗会大一些。

time: 54974.80 avg: 68823.12
time: 55121.00 avg: 68493.15
meaninglessRun: 925.160888671875 ms
time: 56204.60 avg: 9229.35
time: 56353.00 avg: 67430.88
time: 56503.10 avg: 66666.67
// 一起执行 wp=window.postMessage mc=MessageChannel
wp time: 43307.90 avg: 25169.90
mc time: 43678.40 avg: 27005.13
wp time: 43678.60 avg: 26990.55
mc time: 44065.80 avg: 25833.12
wp time: 44066.00 avg: 25819.78
mc time: 44458.40 avg: 25484.20

node

在 node.js 上也有 MessageChannel ,是否也可以用来测量loop次数呢?

mc time: 460.99 avg: 353930.80
mc time: 489.52 avg: 355088.11
mc time: 520.30 avg: 326384.64
mc time: 551.78 avg: 320427.29

量级很不正常。理论上不应该超过 setImmediate 的。如果同时启动 setImmediatesetTimeout 的 checker:

...
(messagechannel) time: 1231.10 avg: 355569.31
(messagechannel) time: 1260.14 avg: 345825.77
(setImmediate) time: 1269.95 avg: 339.27
(setTimeout) time: 1270.09 avg: 339.13
(messagechannel) time: 1293.80 avg: 298141.74
(messagechannel) time: 1322.50 avg: 349939.04
...

很明显跟不是宏任务了。我猜测 MessageChannel 在 node.js 被归入到跟 socket 等同级别了,就是超出阈值之后的任务会移动到下一个loop中。

总结

使用这种方式去检测性能还挺有趣的,正式使用的话这个指标感觉过于不稳定(即使什么都没做都会有20%-30%的振动)。推荐和其他正经的办法(比如 performance 等)结合。

同时这种方式非常有可能影响正常的 Event Loop,比如 Node.js 中会有一个 pull 的阶段,在执行完全部微任务后,没有任何 timer 的话是会停留在这个阶段,准备马上执行下一个出现的微任务。

顺便复习了下 Event Loop。没想到的是 MessageChannel 在两边的差距居然有这么大。

以上就是什么是EventLoop?怎么测试Node或页面的性能的详细内容,更多请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

什么是EventLoop?怎么测试Node或页面的性能

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

什么是EventLoop?怎么测试Node或页面的性能

Event Loop 机制大家应该都有了解。本文利用 EventLoop 去做一个有趣的检测node或页面性能的代码,顺便介绍了一下EventLoop,希望对大家有所帮助!
2023-05-14

EventLoop如何测试Node或页面的性能

这篇文章主要介绍“EventLoop如何测试Node或页面的性能”,在日常操作中,相信很多人在EventLoop如何测试Node或页面的性能问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”EventLoop如何
2023-07-05

Java NIO性能测试的方法是什么

这篇文章主要介绍“Java NIO性能测试的方法是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Java NIO性能测试的方法是什么”文章能帮助大家解决问题。时间(ms)文件大小(byte)Bu
2023-06-17

云主机性能测试的方法是什么

云主机性能测试方法准备阶段:确定测试目标、选择测试工具、准备测试脚本、配置云主机。执行阶段:基准测试、负载测试、压力测试、监控指标。分析阶段:分析结果、确定性能基准、制定优化计划。具体测试方法:响应时间测试吞吐量测试资源利用率测试可靠性测试并发用户测试持续性能监控对于确保云主机性能至关重要。定期测试可识别问题并确保用户体验不受影响。
云主机性能测试的方法是什么
2024-04-12

redis集群性能测试的方法是什么

Redis集群性能测试方法Redis集群性能测试旨在评估集群吞吐量、延迟、资源消耗和故障恢复能力。使用基准测试工具模拟预期负载,逐步增加负载,监控资源消耗,并模拟节点故障以测试故障恢复机制。通过数据收集和分析,可以识别性能瓶颈,优化集群配置和预测容量需求,确保Redis集群平稳高效运行。
redis集群性能测试的方法是什么
2024-04-10

云主机性能测试的方法是什么

云主机性能测试常用的方法有以下几种:1. 压力测试:通过模拟大量用户及请求发送到云主机,测试其在高负载情况下的性能表现。可以使用工具如Apache JMeter、LoadRunner等进行测试,评估云主机在不同负载下的响应时间、吞吐量和并发
2023-09-17

golang中iris性能测试的方法是什么

要对iris进行性能测试,可以使用go的内置工具go test结合第三方的性能测试工具go tool pprof。首先,在项目中创建一个性能测试文件(如performance_test.go),编写性能测试用例,并使用testing.B来
golang中iris性能测试的方法是什么
2024-04-03

redis集群性能测试的方法是什么

进行Redis集群性能测试的一种常用方法是使用基准测试工具,如redis-benchmark。以下是一些步骤,可以用来进行Redis集群性能测试:安装并配置Redis集群:首先需要搭建一个Redis集群,可以使用Redis官方提供的工具re
redis集群性能测试的方法是什么
2024-04-09

windows下硬件性能测试的方法是什么

在Windows下,可以使用以下方法进行硬件性能测试:1. 使用Windows自带的工具:- Windows系统自带的性能评估与工具(Windows Performance Toolkit)可以测试CPU、内存、硬盘和网络等硬件性能。可以通
2023-09-12

Apache下分析ab性能测试的结果是什么

这篇文章给大家介绍Apache下分析ab性能测试的结果是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一直以来我都是用Loadrunner去做性能测试。Loadrunner实际上是一个很重的性能测试工具。他的功能很
2023-06-22

MongoDB的性能基准测试与调优方法是什么

MongoDB的性能基准测试与调优方法如下:性能基准测试:使用工具如YCSB(Yahoo! Cloud Serving Benchmark)或者Sysbench进行基准测试,以评估MongoDB的读写性能、并发处理能力等。在测试过程中,可
MongoDB的性能基准测试与调优方法是什么
2024-05-07

轻量应用服务器性能测试方法是什么样的

轻量应用服务器性能测试方法通常是利用应用程序的内存使用情况和CPU使用情况进行测试。这些测试将在应用程序服务器上执行,利用应用程序服务器的缓存数据和日志记录进行性能分析,以找出应用程序服务器的性能瓶颈。测试方法的具体步骤包括以下几个方面:定义性能指标:首先需要制定一份性能指标列表,其中包含应用程序服务器内存使用率、CPU使用率、内存使用量等指标。这些指标应该与应用程序服务器的特定要求相匹配。
2023-10-26

SAP CRM WebClient UI订单搜索的各种条件的实现原理和性能测试是什么

SAP CRM WebClient UI订单搜索的各种条件的实现原理和性能测试是什么,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。CRMS4_SERVHSRCH
2023-06-04

在这个数组访问微基准测试中(相对于 GCC),Go 的性能损失了 4 倍,是什么原因造成的?

在这个数组访问微基准测试中(相对于GCC),Go的性能损失了4倍,是什么原因造成的?这个问题涉及到Go语言的运行时机制和编译器优化等多个方面。首先,Go语言在数组访问时使用了边界检查机制,即在每次访问数组元素时都会进行边界检查,这会带来一定
在这个数组访问微基准测试中(相对于 GCC),Go 的性能损失了 4 倍,是什么原因造成的?
2024-02-10

编程热搜

目录