在Javascript中调度大量额外事件的效率如何?

在Javascript中调度大量额外事件的效率如何?,javascript,html,events,touch,dom-events,Javascript,Html,Events,Touch,Dom Events,我正在构建一个库,它扩展了标准JS输入事件 这意味着在ARM设备的浏览器中,以输入采样率(60Hz)触发大量多点触碰事件 我已经看过了,它在我的1.7Ghz Sandy Bridge i5上产生了大约250000次每秒的操作,我将很快在那里测试我的iPhone5和Nexus7 我的问题是,是否会快速处理未侦听的事件 如果我知道事件没有被监听,是否有一种方法可以跳过生成事件的过程?我认为jsperf在调度和处理事件时会弄脏事情,因为每次测试循环迭代都会添加和删除事件侦听器。听起来您的用例调度和处理

我正在构建一个库,它扩展了标准JS输入事件

这意味着在ARM设备的浏览器中,以输入采样率(60Hz)触发大量多点触碰事件

我已经看过了,它在我的1.7Ghz Sandy Bridge i5上产生了大约250000次每秒的操作,我将很快在那里测试我的iPhone5和Nexus7

我的问题是,是否会快速处理未侦听的事件


如果我知道事件没有被监听,是否有一种方法可以跳过生成事件的过程?

我认为jsperf在调度和处理事件时会弄脏事情,因为每次测试循环迭代都会添加和删除事件侦听器。听起来您的用例调度和处理事件的频率很高,但添加和删除事件处理程序的要求相对较低

我把重点放在用自定义事件包装本机事件上,然后取消自定义事件。测试场景基于:

  • 是否存在自定义事件的侦听器
  • 与自定义事件关联的数据的即时初始化与延迟初始化
  • 处理“轻”与“重”初始化需求时上述因素的影响
为了测试“重”与“轻”初始化需求,每个自定义事件都会创建一个包含10或1000个随机数的数组

关于自定义事件数据的延迟初始化:

  • 当侦听器存在时,lazyly init'd事件通常会稍微慢一点。对于“光”数据,它有时低至立即初始化事件速度的0.8倍
  • 如果没有侦听器,对于“轻”和“重”数据,延迟初始化的数据通常更快。对于“重”数据,通常要快2-10倍
我的问题是,是否会快速处理未侦听的事件

在我所看到的一切中,未侦听的事件总是比具有关联处理程序的事件处理得更快。但是,我认为只有当事件处理程序本身相当缓慢且成本高昂时,这才会产生很大的影响。此外,创建自定义事件的成本越高,无论以哪种方式创建自定义事件,这一点就越不重要

如果我知道事件没有被监听,是否有方法跳过生成事件的处理

我想到两件事:

  • 将是否正在侦听事件的知识公开给生成和分派事件的进程,然后让该进程在不知道正在侦听任何内容的情况下跳过创建事件

  • 听起来生成自定义事件的代码会在某个时刻侦听本机事件,然后基于本机事件创建自定义事件。在这种情况下,您可以忽略本机事件,直到添加了自定义事件的事件侦听器,然后在删除了自定义事件的所有侦听器后再次忽略本机事件


Nexus7每秒产生10000次以上的操作:每次输入更新100微秒时,我应该能够发出几次(可能大约100次)。回答得很好。我想给你买杯啤酒。你认为你的测试与另一个测试相比如何?另一个测试是重复分配和删除侦听器,并发送一个未受伤害的侦听器?看起来您的测试更加真实,但运行时间也更长。在任何情况下,我似乎有很多选择,当谈到发布我的新活动的时候。如果你对我的项目感兴趣,请点击这里:谢谢链接!我想知道你的项目。。。我编写的所有测试都比较慢(即使没有处理程序),因为每个测试循环都会创建一个新的事件对象。我做的不是所有的添加/删除,等等,每个测试循环。在我看来,这对于比较处理程序很有用(顺便说一句,对这个切换感到惊讶)。在每个测试循环中创建一个新的鼠标事件。在我的iPhone上,创建事件的需求将最快的每秒操作数从~31K减少到~4.5k。遗憾的是,创建事件比创建和删除侦听器更昂贵。尽管如此,每秒能发出几千次仍然给了我很大的空间。很明显,交换机和其他许多语言一样,能够提高性能。我不得不说,我仍然不知道jsperf上的一些测试是如何工作的。你的5个测试怎么都有相同的测试代码?他们显然做了不同的事情。更不用说数组和循环都只增加到4。这有点神秘。我显然错过了一些明显的东西。