`
windfishion
  • 浏览: 4053 次
  • 性别: Icon_minigender_1
  • 来自: 河南
文章分类
社区版块
存档分类
最新评论

Ext 操作性能

阅读更多

 

Ext.get()与Ext.fly()之区别

从一开始接触Ext就看到有Ext.fly这个函数,当时觉得这个跟Ext.get没什么区别,加之当时对JS性能相关问题认识肤浅,也一直没有在意其区别,今日看learning extjs一书,看到了有专门对Ext.fly特别强调的一处:

This isn't exactly a speed tip, but is more about conserving memory by using 
something called a "flyweight" to perform simple tasks, which results in higher speed 
by not clogging up the browser's memory

大概意思也就是Ext.Fly采用flyweight模式使所有fly出来的元素共享内存,可以提高程序执行速度,减少内存占用。

这段话激起了我对这个函数的兴趣,毕竟近段时间一直在搞JS性能优化相关问题,对“内存”这个字眼非常敏感。大概看了下Ext源码对get和fly实现的部分,然后在网上查看了一些资料,终于对他们之间的异同有了个比较深入的认识。 Ext的官方开发人员给出了如下的解释:

Ext.Element wraps a lot of functionality around DOM element/node, for example functions like hide, show, all animation stuff, dimensions getting and setting function and a lot more. 

Ext.Element keeps reference to DOM element it is wrapped around in dom property. Once you have an Ext.Element (e.g. you call Ext.get('some-id') it is an instance of Element class and you can work with it as such. 

Now, imagine that you need to hide 1000 DOM nodes, you call 1000 times Ext.get('some-one-of-1000-id').hide() so you create 1000 instances of Element just to call one function: hide. 

Ext.fly is one instance of Ext.Element with "replaceable" DOM node it is wrapped around. If you call 1000 times Ext.fly('some-one-of-1000-id').hide() you 1000 times replace dom property of one instance of Ext.Element. 

Result: higher performance, lower memory usage. 

You only need to keep in mind that you cannot keep Element returned by Ext.fly for later use as it's dom will sooner or later gets replaced by another one.

这段话中,大致的意思如下:

Ext.Element是Ext对Dom元素的一个强有力封装,它封装了很多方便对dom操作的接口(并通过Element的dom属性引用对应的 dom元素),因此每创建一个Element元素都将消耗不少的内存(主要是大量的操作接口消耗),因此如果创建过多的Element元素必然导致内存占 用的剧增和系统性能的下降。

Ext.get和Ext.fly返回的都是一个Element对象,但是Ext.get返回的是一个独立的Element,拥有自己独立的操作接口 封装,可以将其返回值保存到变量中,以便以后调用操作等,这样为重用带来了方便。但是它的一个很大缺点就是内存消耗问题,假如调用 Ext.get(id)1000次,则会在内存中创建1000个独立Element,其内存占用可想而知。但是很多时候我们可能仅仅只是对该dom元素执 行一次很简单的操作,如隐藏(hide),这样如果每次都创建一个独立Element放在内存中,实在是对内存的巨大浪费,因此当我们在只需要执行一次操 作或者一个很简单的操作时,采用Ext.get就显得很不合理。Ext.fly正是为了解决这个问题而出现,它通过使每次创建的Element共享内存中 的一套操作接口来达到节省内存的效果。

下面来看Ext.fly的实现代码(我简单加了一些注释):

 

var flyFn = function(){}; 
    flyFn.prototype = El.prototype; 
    var _cls = new flyFn(); //将Element的所有操作接口放在_cls中 
    // dom is optional 
    El.Flyweight = function(dom){ this.dom = dom; }; 
    //仅包含一个dom属性的 
    Object El.Flyweight.prototype = _cls; //将操作接口复制给Element实例对象
    El.Flyweight.prototype.isFlyweight = true; //标志该Element是flyweight对象 
    El._flyweights = {}; //flyweight对象缓存容器 
    El.fly = function(el, named){ 
               named = named || '_global'; 
                el = Ext.getDom(el); //取得dom对象 
            if(!el){ 
                     return null; 
                 } 
              if(!El._flyweights[named]){
                El._flyweights[named] = new El.Flyweight(); 
                //仅在第一次调用Ext.fly时创建一个Flyweight对象并缓存
             } 
                El._flyweights[named].dom = el; 
               //将flyweight对象的dom属性指向该el 
      return El._flyweights[named]; 
   };

 

从上面的代码不难看出,仅在第一次调用Ext.fly时创建一个Flyweight对象(该对象包含了Element的所有操作接口)并将其缓存, 之后的所有fly操作都只是修改该flyweight对象的dom属性,每次fly返回的结果都是共享的同一个flyweight对象。这样每次fly返 回的Element相比Ext.get而言,减少了每次创建Element时对大量的操作接口的创建。所有fly的对象都共享一套Element操作接 口,内存占用自然少了很多,而且执行速度也得到了提升。在大量的创建操作中效果会更加明显。

由于fly的操作原理,我们不能将fly的返回结果保存在变量中以便重用,因为每次fly操作都将可能改变该变量的dom指向。如下面的代码就是不正确的:

var my_id = Ext.fly('my_id'); 
Ext.fly('another_id'); //此时my_id的dom引用已经变为another_id 
my_id.highlight('FF0000',{ //此处的操作将是对another_id元素的操作 
endColor:'0000FF', duration: 3 });

  

在以后使用中,一定要合理的利用Ext.get和Ext.fly,避免滥用Ext.get这个“重量级”的方法。 

分享到:
评论

相关推荐

    Ext性能优化总结

    ### Ext性能优化总结 在多年的Ext项目开发过程中,积累了丰富的经验与技巧,下面将这些关键的知识点进行详细的阐述,希望能为同行提供有价值的参考。 #### 一、架构优化:One Page One Application模式 在传统的...

    ext操作数据库实例DBExplorer

    "EXT操作数据库实例DBExplorer"是一个利用EXT库开发的数据库管理系统的示例,它提供了对多种数据库的访问和管理功能,并且能够将数据导出为Excel文件。下面我们将深入探讨EXT库以及如何与数据库交互,以及如何实现...

    Windows读取Ext4分区的工具 Ext2Read

    4. **EXT4 extent支持**: EXT4引入了extent的概念,以优化大文件的存储,提高性能。Ext2Read能够正确解析EXT4分区中的extent,确保文件访问的准确性。 5. **递归拷贝**: 在需要备份或迁移数据时,用户可以使用Ext2...

    ext3.4 ext3.1.0以及ext3.0API

    EXT3,全称为“Third Extended File System”,是Linux操作系统中广泛使用的一种日志式文件系统。它是EXT2的升级版,引入了日志记录功能,增强了数据一致性与系统的稳定性。EXT3.4和EXT3.1.0是EXT3文件系统在不同...

    ext3.jar ext使用非常多

    在网站开发中,EXT框架的使用可以提供强大的用户界面,例如,通过EXT的数据网格组件,可以方便地展示和操作大量数据;通过EXT的表单组件,可以构建复杂的表单输入和验证机制;通过EXT的图表组件,可以直观地展示数据...

    ext下载包,ext,ext包,ext下载

    适配器帮助EXT与不同的DOM操作和事件处理机制进行交互,使得在已有项目中集成EXT变得简单。 EXT还提供了一个强大的数据包,支持数据绑定和远程数据源的交互。这使得EXT组件能够动态地显示和操作来自服务器的数据,...

    ext2fsd ext文件系统解析

    EXT2文件系统不支持日志记录,这可能导致在系统崩溃或非正常关机时数据丢失,但在正常操作下,它的性能非常优秀。 EXT3,即Extended File System 3,是在EXT2基础上增加日志功能的文件系统。它的日志记录能力使得在...

    Ext4研究与性能分析

    Ext4(第四扩展文件系统)是Linux操作系统中广泛使用的一种高性能文件系统,它是Ext3的改进版本,旨在提供更好的性能、可靠性和扩展性。Ext4支持更大的文件大小、更大的卷大小,并引入了日志功能来提高文件系统的...

    最新ext3.0资源包 ext3.0

    EXT3,全称为“Extended File System 3”,是Linux操作系统中的一个日志文件系统,它在1998年由Stephen Tweedie开发并引入Linux内核。EXT3是EXT2的扩展,增加了日志功能,提高了系统的可靠性和数据一致性。在Linux...

    Ext2IFS windows

    标题中的"Ext2IFS windows"表明我们正在讨论一个与Windows操作系统相关的软件,该软件的主要功能是支持挂载Linux的ext文件系统。在Windows环境中,通常无法直接读取或写入Linux系统的ext2、ext3或ext4分区,而Ext2...

    ext4文件系统源码

    EXT4,全称为Fourth Extended File System,是Linux操作系统中广泛使用的日志文件系统之一,它在2008年被引入Linux内核。EXT4在EXT3的基础上进行了多项改进,以提升性能、可靠性和可扩展性。这个源码包包含了EXT4...

    ext4_utils

    这个工具集专注于处理ext4文件系统,一种广泛用于Linux内核的高性能日志文件系统。本文将详细探讨ext4_utils的原理、功能及在三星线刷ROM制作过程中的应用。 一、ext4文件系统概述 ext4是Linux系统的第四代扩展...

    ext相关资料-ext3.1

    EXT是Linux操作系统中广泛使用的文件系统之一,EXT3.1是EXT3的增强版本,它在EXT3的基础上进行了一些改进和优化,以提供更稳定、更高效的数据存储和管理。EXT系列文件系统由Linux内核开发者为了满足对性能、可靠性和...

    ext4.0中文文档

    对于开发者而言,EXT4的中文API文档则提供了与EXT4交互的编程接口,帮助程序员编写直接操作EXT4文件系统的应用程序。EXTJS文档则是关于EXT JavaScript库的相关资料,它是一个用于构建桌面级Web应用的富客户端框架,...

    Ext GridPanel 中实现加链接操作

    ### Ext GridPanel 中实现加链接操作 在前端开发领域中,Ext JS 是一款非常流行的 JavaScript 框架,用于构建企业级的 Web 应用程序。Ext GridPanel 是该框架中的一个重要组件,常用于展示表格数据。本文将详细介绍...

    EXT安装包4.2.1-1

    10. **性能优化**:EXT通过延迟加载、按需渲染和组件缓存等策略,提升了大型应用的性能和加载速度。 压缩包中的"extJS安装包-4.2.1"可能包含了以下文件和目录: - `ext-all.js`:EXT的核心库文件,包含了所有组件和...

    Ext.get与Ext.fly的区别

    - **性能优势**:当需要对同一个DOM元素进行多次操作时,`Ext.get`比`Ext.fly`更高效,因为它只需要查找一次DOM元素。 **缺点**: - **内存占用**:由于`Ext.get`会将DOM元素封装成`Ext.Element`对象并缓存起来,...

    EXT3.3学习文档

    2. **高性能**:EXT3设计时考虑了性能,尤其是在大型文件操作和大量小文件操作上表现良好。 3. **稳定性**:由于EXT3已经经过了长时间的使用和测试,因此它的稳定性相当高,适合在关键业务环境中使用。 4. **兼容性*...

    EXT江湖(全)

    EXT,全称为Extended File System,是Linux操作系统中最常见的文件系统之一,由Linus Torvalds在开发最初的Linux内核时创建。EXT江湖(全)可能包含了EXT文件系统从EXT1到EXT4各个版本的详细介绍,以及与之相关的...

    ext PPT,EXT 教程,EXT 中文帮助手册,EXT 中文手册,ext_教程(入门到精通),Ext技术程序文档大全.

    3. **EXT 中文帮助手册**:这是一份详细的辅助学习材料,可能包含EXT框架的高级特性,如AJAX通信、图表组件、拖放操作、以及自定义组件的开发等内容。它能帮助开发者解决在实际项目中遇到的问题。 4. **EXT学习文档...

Global site tag (gtag.js) - Google Analytics