添加太多事件侦听器会影响性能吗?

Ber*_*ner 38 javascript jquery events actionlistener onclicklistener

我有一个关于javascript(jQuery)事件/监听器的一般问题.点击监听器的数量是否有任何限制而不会出现性能问题?

atm*_*tmd 30

在性能方面,事件绑定的元素数量是您看到任何问题的位置.

这是一个jsperf测试.您将看到绑定到许多元素的速度要慢得多,即使每种情况下只绑定了一个事件.

jsperf中的第3个测试显示了如何将事件绑定到父元素并使用委托来侦听所需的元素.(在这种情况下.many)

nb测试显示第3个选项是最快的,但那是因为它使用的是一个id而不是一个类的元素.

更新:这是另一个性能测试,显示id使用a 绑定到一个vs一个事件的3个事件class

  • jsperf是一年以来的下降,很高兴用现有的性能测试更新答案来说明答案 (5认同)
  • 谢谢你的回答@atmd - [jsperf test](http://jsperf.com/click-perf)很好地证明了这个问题 (3认同)
  • jsperf在这里工作得很好.无需更新答案. (3认同)
  • 我认为您的测量结果与实际问题相关(正如我所读到的那样).您不是测量具有更少/更多绑定的应用程序的性能,而是首先测量设置绑定的成本. (2认同)

Phi*_*ipp 5

虽然这是一个老问题,但我觉得它还没有完全回答。

正如atmd指出的那样:将事件处理程序添加到哪里已经很重要了。但是最初的问题似乎更关心触发这些事件处理程序(例如单击或滚动事件)对性能的影响。

是的,向元素添加额外的事件处理程序确实会降低性能。以下是测试以下情况的性能比较:

https://jsbench.me/ztknuth40j/1

结果

  1. 一个<div>10 个 click处理程序,click事件由jQuery触发。
    ? 72.000 次点击/秒
  2. 一个<div>100 个 click处理程序,click事件由jQuery触发。
    ? 59.000 点击/秒 ~比第一种情况慢 19%
    这表明,额外的事件处理程序可以减慢执行速度
  3. 一个<div>10 个 click处理程序,click事件由普通 JS触发。
    ? 84.000 点击/秒 ~比第一种情况6% 使用普通 JS 比使用 jQuery 快一点
  4. 一个<div>100 个 click处理程序,click事件由普通 JS触发。
    ? 14.000 点击/秒 ~比第二种情况慢 77%
    这很有趣:当使用原生事件时,侦听器的数量似乎比使用 jQuery 更快地降低性能。

(这些结果在每次运行时都会有所不同,并且在很大程度上取决于您的硬件和浏览器)

请记住,这些测试是使用空函数完成的。当添加一个真正的函数来执行一些额外的任务时,性能会进一步降低。

这是在每次单击时更改 div 内容的第二个测试:

https://jsbench.me/ztknuth40j/2

慢吗?

另一方面:即使每秒 100 次操作也非常快(这意味着,每个事件处理程序在一秒钟内执行 100 次)并且没有用户会注意到延迟。

我认为您不会遇到像clickmouseenter处理程序这样的用户操作事件的问题,但在使用快速触发的事件时需要注意,例如scrollmouseover

此外,随着计算机变得更快,浏览器应用越来越多的优化,对于“太多”的事件处理程序的数量没有硬性限制。它不仅取决于调用的函数和观察到的事件,还取决于用户的设备和浏览器。