- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我寻找有关使用委托(delegate)机制提高性能的线程。我说的是简单的 javascript,没有 jQuery 或其他工具/库。
每个元素都会在 DOM 树中生成事件,并通过冒泡机制在整个树中传播。
委派避免为每个元素创建事件处理程序,而是在单个处理程序中捕获更多事件。此外,停止冒泡,处理程序可以避免事件进一步传播,如果已经正确处理的话。因此,它将减少页面的资源消耗。
但是,如果不停止冒泡,事件会在整个 DOM 树中产生和传播,因此页面中使用委托(delegate)和不使用委托(delegate)的资源消耗是相同的。而且,如果委托(delegate)的处理程序必须对事件的来源执行检查,它也会更加消耗...
那么,除了编程变得更容易、简单、干净之外,使用委派的性能提升在哪里?
有一种方法可以完全避免生成某些事件,或者完全避免某些元素生成某些事件,从而节省大量资源使用?例如,鼠标悬停在一个简单的文本上时,会在普通页面中生成许多无用的消息;如果不处理该消息,是否可以在源头阻止生成该消息?
最佳答案
But, if bubbling is not stopped, events spawn and propagate through all the DOM tree, so there is the same resource consumption in the page using delegation or not. And, if the delegated handler has to perform check on the source of the event, it would be also more consuming...
在没有任何事件监听器关联的情况下通过 DOM 树传播的事件不一定请求浏览器内存使用。不要求采取行动的可能根本不会受到监控。现代浏览器针对更好的 UI 性能进行了高度优化,这种类型的内存浪费将是任何基本客户端首先要避免的问题。
问题不在于通过 DOM 树传播的 UI 生成的大量事件,而在于浏览器必须为每个具有关联事件处理程序的元素保存在内存中的所有事件监听器。
想象一个基于 Web 的文件浏览器,其 DOM 树包含表示文件的元素:即使异步加载,当用户展开大量节点时,它最终也可能同时显示数百个元素。
每个元素肯定会有更多的事件监听器,例如一个用于展开/折叠,一个用于拦截右键单击以显示上下文菜单,一个用于左键单击以启用拖放,一个用于双击以执行一些操作等等...
每个元素有 5 个事件监听器,在一个包含 100 个文件的简单文件树中,您将招致 500 个事件监听器由浏览器管理,这就是发生大量内存使用的地方。
So, where is the performance gain in using delegation, beyond programming being more easy, simple, clean?
在上面的示例中,当您在父元素(例如树容器)上捕获 5 个事件而不是 500 个时,您请求的操作减少了 99%,因此浏览器中的内存分配也减少了。
然后,每次触发所监视的事件之一时,选择性激活与正确目标相关的正确操作意味着只需运行一个函数来查找和应用正确的处理程序。
在网络上你可以找到关于浏览器低级内存管理和增益事件委托(delegate)带来的其他解释,但如果你认为不依赖这些来源,最好的方法是自己做一个测试,例如一个要求很高的小部件,它监听许多事件并使用动画,在 DOM 中多次复制它并查看 UI 的动态行为。
关于Javascript 委托(delegate)性能注意事项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16990440/
我有一个加载 View 的 View ,需要将 View 推送到主导航 Controller 。 我已经为每个 View 设置了一个委托(delegate),并且基本上使我的调用沿着“链”返回到主导航
我通过 NSURLConnction 从服务器获取数据,并希望从获取的数组中填充表格 View 。数据出现在 NSURLConnection 委托(delegate)方法的日志中,但我意识到 numb
我已经将我用作标题 View 的 View 子类化,它里面有一些按钮委托(delegate),它工作得很好。 但是,我在 viewController 上方展示了一个 modalViewControl
我希望这听起来像是一个显而易见的问题,但是委托(delegate)返回类型是否也必须与其委托(delegate)的方法的返回类型相匹配? EG,像这样: public static void Save
我想使用 Kotlin 委托(delegate),但我不想在委托(delegate)人之外创建委托(delegate)。委托(delegate)的所有示例都如下所示: interface Worker
我有一个问题: - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInf
伙计们。我正在寻求帮助。这似乎是一个非常简单的任务,但我可以解决一整天。我正在尝试使用容器 View 创建侧面菜单。当用户按下“更多”按钮(barButtonItem)时,整个 View 向右滑动并出
我正在努力将 UIWebView 迁移到 WKWebView。我已经更改了所有委托(delegate)方法。我需要 WKWebView 委托(delegate)方法等于下面的 UIWebView 委托
我正在学习 VB.NET 中的委托(delegate),但对委托(delegate)类型感到困惑。在阅读有关委托(delegate)的内容时,我了解到委托(delegate)是一种数据类型,可以引用具
我有一个用 Objetive-C 构建的框架。该框架用于连接蓝牙设备并与之交互。 在演示代码中,Objetive-C 委托(delegate)函数如下所示。演示代码由框架创建者提供。 -(void)b
//NewCharts.h #import @interface NewCharts : UIViewController @property(nonatomic,retain)IBOutlet U
我正在努力了解 async/await 并认为我确实了解有关用法的一些事情。但仍然不太清楚在下面的场景中实际好处是什么。 查看 Task.Run 用法。第一种方法使用普通委托(delegate)并使用
我已经尝试了在我的网站上使用 openID 委托(delegate)的所有可能选项,但没有一个方法对我有用。 我的 HTML 文件的 head 部分有“link rel”标签。 我在 HTML 文件的
如何快速创建一个委托(delegate),即 NSUserNotificationCenterDelegate? 最佳答案 这里有一些关于两个 View Controller 之间委托(delegat
我有一个带有数据源的 NSComboBox,当您单击三角形并通过单击它选择其中一个项目时,它可以完美运行。但是,我还希望它允许用户在框中键入以使用自动完成来选择名称。目前,当用户键入时,我希望选择的项
我在代码中定义了以下类和委托(delegate)(为简洁起见,剪掉了许多其他行)。 Public Delegate Sub TimerCallback(canceled As Boolean) Pub
我使用 ansible 2.1 并且我想使用 delegate_to 向一组主机运行命令。我使用 localhost 作为主机参数,并且我想将“touch”命令委托(delegate)给两个 cls
我想通过重载为我的类实现几个构造函数。据我了解,遵循 DRY 原则的惯用方式是使用一种称为委托(delegate)构造函数的功能。我也看到了关于在任何地方使用引用参数并不惜一切代价避免使用指针的想法,
代表们会导致内存泄漏吗? 我的意思是,例如如果一个类A包含一个ADelegate,并且后者指向BMethod(属于B类),这可以防止GC收集A类或B类吗? 如果是这样,我们如何“释放”代表(设置ADe
委托(delegate)命令和路由命令有什么区别? 我读了一些文章说在 MVVM 上使用委托(delegate)命令而不是路由命令。 那么当我们使用 MVVM 时,Delegate Command 相
我是一名优秀的程序员,十分优秀!