1

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

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

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

我的问题是是否会快速处理未收听的事件?

如果我知道事件没有被收听,还有没有办法跳过生成事件的处理?

4

1 回答 1

3

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

我整理了一个 jsperf,它专注于用自定义事件包装原生事件,然后分发自定义事件。测试场景基于:

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

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

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

  • 当听众在场时,惰性初始化事件通常会慢一些。对于“轻”数据,它有时低至立即启动事件的速度的 0.8 倍。
  • 如果没有侦听器,对于“轻”和“重”数据,延迟初始化的数据通常更快。对于“重”数据,它通常快 2 到 10 倍。

我的问题是是否会快速处理未收听的事件?

在我所看到的一切中,未侦听事件的处理速度总是比具有关联处理程序的事件快。但是,我认为只有在事件处理程序本身相当缓慢且成本高昂的情况下,这才会产生很大的影响。此外,创建自定义事件的成本越高,如果以任何一种方式创建自定义事件,这将变得越不重要。

如果我知道事件没有被收听,还有没有办法跳过生成事件的处理?

想到两件事:

  • 将事件是否被侦听的知识暴露给生成和调度事件的进程,然后让该进程在它不知道没有侦听的情况下跳过创建事件。

  • 听起来生成自定义事件的代码会在某个时候或另一个地方侦听本机事件,然后根据本机事件创建自定义事件。在这种情况下,您可以在添加自定义事件的事件侦听器之前忽略本机事件,然后在删除自定义事件的所有侦听器后再次忽略本机事件。

于 2013-01-04T19:37:36.357 回答