Javascript 添加太多事件侦听器是否会影响性能?
我有一个关于javascript(jQuery)事件/侦听器的一般性问题。Javascript 添加太多事件侦听器是否会影响性能?,javascript,jquery,events,actionlistener,onclicklistener,Javascript,Jquery,Events,Actionlistener,Onclicklistener,我有一个关于javascript(jQuery)事件/侦听器的一般性问题。 没有性能问题的单击侦听器的数量有限制吗?就性能而言,事件绑定到的元素的数量是您看到任何问题的地方 这是一本书。您将看到绑定到许多元素的速度要慢得多,即使在每种情况下只绑定一个事件 jsperf中的第三个测试展示了如何将事件绑定到父元素,并使用委托来侦听所需的元素。(在本例中为.many) n、 b.测试表明第三个选项是最快的,但这是因为它的目标元素是id,而不是类 更新:下面是另一个显示绑定到id的3个事件与使用类绑定的
没有性能问题的单击侦听器的数量有限制吗?就性能而言,事件绑定到的元素的数量是您看到任何问题的地方 这是一本书。您将看到绑定到许多元素的速度要慢得多,即使在每种情况下只绑定一个事件 jsperf中的第三个测试展示了如何将事件绑定到父元素,并使用委托来侦听所需的元素。(在本例中为
.many
)
n、 b.测试表明第三个选项是最快的,但这是因为它的目标元素是id
,而不是类
更新:下面是另一个显示绑定到
id
的3个事件与使用类绑定的一个事件的对比。虽然这是一个老问题,但我觉得还没有完全回答
正如所指出的:在哪里添加事件处理程序已经很重要了。
但最初的问题似乎更关心触发这些事件处理程序(例如单击或滚动事件)对性能的影响
是的,向元素添加额外的事件处理程序会降低性能。
下面是测试以下情况的性能比较:
结果
一个
具有10个
处理程序,而click
事件由jQuery触发
→ 每秒72.000次点击
一个
具有100单击
处理程序,而单击
事件由jQuery触发
→ 59.000次点击/秒—比第一种情况慢19%
这表明,额外的事件处理程序会降低执行速度
一个
具有10个
处理程序,而click
事件由普通JS触发
→ 每秒点击84.000次,比第一种情况快6%
使用普通JS比使用jQuery快一点
一个
有100个
处理程序,而click
事件由普通JS触发
→ 每秒点击14.000次,比第二种情况慢77%
这很有趣:当使用本机事件时,侦听器的数量似乎比使用jQuery更快地降低性能
(每次跑步的结果都会有所不同,这在很大程度上取决于您的硬件和浏览器)
请记住,这些测试是使用空函数完成的。当添加执行一些额外任务的实函数时,性能将进一步降低
下面是第二个测试,它会在每次单击时更改div的内容:
慢吗?
另一方面,即使每秒执行100次操作也非常快(这意味着每个事件处理程序在一秒钟内执行100次),并且没有用户会注意到延迟
我认为您不会遇到用户操作事件(如单击或鼠标指针处理程序)的问题,但在使用快速触发的事件(如滚动
或鼠标指针
)时需要小心
此外,随着计算机速度的提高和浏览器应用越来越多的优化,事件处理程序的数量“太多”并没有硬性限制。它不仅取决于调用的函数和观察到的事件,还取决于用户的设备和浏览器。确实需要更多的内容。单击处理程序不会给您带来性能问题,单击时采取的操作“可能”会导致问题。而且,一次点击可以绑定到1个元素,或者20000个元素,所以需要更多的信息。这就是我的意思。整个应用程序都必须听它。我说的是5-20点击监听器。我不知道这是否是一个问题,这就是为什么我要问:)这里是对绑定到一个或多个元素的click事件的测试,您将看到,即使只绑定了一个事件,但与该选择匹配的元素数的影响更大。因此,这将对性能的影响远远超过事件的数量。测试(刚刚更新)还显示了如何绑定到父级,以提高绑定到许多元素的性能。(在这里计算最快,因为它是一个id
我正在检查我是否理解你。因此,如果我将10个侦听器放在10个不同的元素上,比将一个侦听器放在具有相同类的10个元素上要少一些性能问题?更多的是关于元素的数量和如何选择它们,而不是添加事件本身。也就是说,这表明adding 3使用id
将事件单独添加到元素中的速度与使用class
添加一个事件的速度差不多,因此添加事件不会真正影响性能,而是影响获取元素的方式(以及元素的数量)这很有效谢谢你的答案@atmd-这个问题也很好地证明了我的答案。一般来说,如果你使用jQuery,在使用$(元素)时,尝试支持委托的额外参数。on()
…因此代替$('ul li')。on('click',callback)`使用$('ul')。on('click',li',callback
。我认为您的测量值与实际问题(正如我所读到的)是相切的与其测量绑定较少/较多的应用程序的性能,不如首先测量设置绑定的成本。jsperf自一年以来一直在下降,最好使用现有的性能测试更新答案,以说明answerjsperf在此处工作良好。无需更新答案。