`
windfishion
  • 浏览: 3873 次
  • 性别: 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这个“重量级”的方法。 

分享到:
评论

相关推荐

    Ext4文件系统

    Ext4文件系统在Ext3的基础之上做了很多改进,引入了大量新功能,这些改进主要是为了提高未来的Linux系统的性能。 虽然Ext4做了很多改进,但依然能够与Ext3实现向后和向前的兼容性,这一点的确很难得。 因为Ext3文件...

    ext4.0学习总结及使用说明

    而 Ext4 和其它现代文件操作系统的策略是尽可能地延迟分配,直到文件在 cache 中写完才开始分配数据块并写入磁盘,这样就能优化整个文件的数据块分配,与前两种特性搭配起来可以显著提升性能。 7. 快速 fsck。 以前...

    Ext2.0 中文教程

    extjs是一套完整的富客户端解决方案,也因为功能完整,造成ext-all.js有400多k,请注意,这还是压缩后的大小,而且因为是基于js和css的功能实现,对客户端机器性能也有一定的要求,比如不支持ie6以下的版本。...

    EXT2.0中文教程

    <br>extjs是一套完整的富客户端解决方案,也因为功能完整,造成ext-all.js有400多k,请注意,这还是压缩后的大小,而且因为是基于js和css的功能实现,对客户端机器性能也有一定的要求,比如不支持ie6以下的版本...

    EXT框架2.0中文教程.rar

    extjs是一套完整的富客户端解决方案,也因为功能完整,造成ext-all.js有400多k,请注意,这还是压缩后的大小,而且因为是基于js和css的功能实现,对客户端机器性能也有一定的要求,比如不支持ie6以下的版本。...

    Ext2和Ext3文件系统

    此外,Ext2在对现代文件系统的高性能支持方面也显示出很多良好的实践性。固然,其他文件系统将包含新而有趣的需要,但它们是为其他操作系统设计的,因此我们在本书中不对各种文件系统和各种平台所具有的特性进行考察...

    ext4文件系统的目录索引节点预留

    :分析Ext4文件系统访问大量目录和小文件的性能瓶颈,指出部分原因是由于文件系统索 引节点的磁盘布局导致额外磁盘I/O操作。提出为目录预留索引节点的方法,在一些重要应用下 显著提高了文件系统读写性能。

    eWOW64Ext v1.2 - 加载任意 32/64 模块|动态调用|64 位汇编|64 位进程读写

    模块原理:。wow64 是在 64 位操作系统上允许 32 位程序(比如易编译的程序)执行的模拟器子系统;...更新:极大优化了 X64Call 的代码,现在的通用调用性能损失几乎可忽略不计,实际上本模块的所有代码都是一句句汇

    EXT2.0中文教程.rar

    extjs是一套完整的富客户端解决方案,也因为功能完整,造成ext-all.js有400多k,请注意,这还是压缩后的大小,而且因为是基于js和css的功能实现,对客户端机器性能也有一定的要求,比如不支持ie6以下的版本。...

    论文研究-基于hash技术的ext3目录索引机制的改进.pdf

    针对当前广泛应用的ext3文件系统对超过一定长度的目录进行索引操作时,其性能明显下降的现象,首先对其原因进行了分析,提出一种基于hash技术的ext3目录索引问题的解决方案,并在此基础上给出了实现代码。...

    jmeter性能监控插件

    jmeter进行性能测试,服务器状态实时监听,例如CPU,内存,磁盘,网络,TPS等等,服务器状态随着请求增加的变化曲线才是我们更加需要看到的。想看到服务器变化的曲线图,我们需要下载JMeterPlugins-Standard和Server...

    第九章Ext2文件系统1

    第九章 Ext 2 文件系统Ext 2(第二扩充文件系统)是一种功能强大、易扩充、性能上进行了全面的优化的文件系统,也是当前 Li nux 文件系统实际上的标准

    高性能Linux服务器构建实战:运维监控、性能调优与集群应用

    其次讲解了开源数据镜像备份工具rsync和umson的使用,并通过两个企业级案例演示了这两个工具在生产环境中的使用过程:最后讲解了如何利用ext3grep工具来恢复误删除的数据文件和MySQL数据库的方法。网络存储应用篇...

    集群好书《高性能Linux服务器构建实战》 试读章节下载

    由国内著名技术社区联合推荐的2012年IT技术力作:《高性能Linux服务器构建实战:运维监控、性能调优与集群应用》,即将上架发行,此书从Web应用、数据备份与恢复、网络存储应用、运维监控与性能优化、集群高级应用等...

    Leevel高性能PHP扩展开发框架 v1.0.0 alpha.2

    Leevel 高性能 PHP 扩展开发框架...如何安装Windows 系统暂未提供 dll.Linux 操作系统下载源代码.git clone git@github.com:hunzhiwange/leevel.gitcd ext编译扩展.$/path/to/phpize$./configure --with-php-config

    linux操作系统培训资料.pptx

    Linux操作系统培训 linux操作系统培训资料全文... Linux文件管理 Linux系统中使用的文件类型 目前linux采用的文件系统有ext3文件系统,但是在嵌入式linux操作系统中更多的使用的是jffs2,yaffs和nfs网络文件系统。 Jffs2

    龙门物流管理系统--Ext+SSH框架.zip

    MyBatis或Hibernate可以简化数据库操作,提供了方便的ORM(对象关系映射)功能,使得数据的持久化变得简单和高效。 通过以上技术选择和框架搭建,该项目可以实现一个高性能、可扩展性强的Web应用程序。开发人员可以...

    易语言-eWOW64Ext v1.2 - 加载任意 32/64 模块|动态调用|64 位汇编|64 位进程读写

    更新:极大优化了 X64Call 的代码,现在的通用调用性能损失几乎可忽略不计,实际上本模块的所有代码都是一句句汇编写出来的,本身比起依赖 VC 编译器自动优化的代码都要效率很多倍; 更新:修正加载本模块后无法使用...

    图书管理系统(struts+hibernate+spring+ext)130221.zip

    MyBatis或Hibernate可以简化数据库操作,提供了方便的ORM(对象关系映射)功能,使得数据的持久化变得简单和高效。 通过以上技术选择和框架搭建,该项目可以实现一个高性能、可扩展性强的Web应用程序。开发人员可以...

Global site tag (gtag.js) - Google Analytics