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

时间:2013-01-04 13:07:54

标签: javascript html5 events javascript-events touch

我正在构建一个扩充标准JS输入事件的库。

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

我查看了this jsperf,它在我的1.7Ghz Sandy Bridge i5上产生了大约250,000次操作/秒,我将很快在那里测试我的iPhone5和Nexus7。

我的问题是如何快速处理未经审查的事件?

如果我知道没有收听该事件,还有一种方法可以跳过生成事件的处理吗?

1 个答案:

答案 0 :(得分:3)

我认为jsperf在调度和处理事件时会混淆水域,因为事件监听器也会在每次测试循环迭代中添加和删除。听起来您的用例具有高频率的调度和处理事件,但对添加和删除事件处理程序的要求相对较低。

我将a jsperf放在一起,专注于使用自定义事件包装本机事件,然后调度自定义事件。测试场景基于:

  • 是否存在自定义事件的侦听器
  • 与自定义事件关联的数据的立即与延迟初始化
  • 处理“轻”与“重”初始化要求时上述因素的影响

要测试“重”与“轻”初始化需求,每个自定义事件都会创建一个包含10或1000个随机数的数组。

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

  • 当听众出现时,懒惰的init'd事件通常会慢一点。对于“轻”数据,它有时低至立即初始化事件的速度的0.8倍。
  • 没有监听器,懒惰的init'd数据通常对“轻”和“重”数据都更快。对于“重”数据,它通常快2倍-10倍。
  

我的问题是如何快速处理未经审查的事件?

在我看过的所有内容中,一个未显示的事件总是比具有关联处理程序的事件处理得更快。但是,我认为如果事件处理程序本身相当缓慢且代价高昂,那么这只会产生很大的影响。此外,创建自定义事件的成本越高,如果以任一方式创建自定义事件,这就越少。

  

如果我知道没有收听该事件,还有一种方法可以跳过生成事件的处理吗?

我想到了两件事:

  • 了解是否正在监听事件是否正在生成和调度事件的进程,然后让该进程跳过创建事件,如果它知道什么都没有正在侦听。

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