`

转Ext性能优化

ext 
阅读更多

 前一阶段由于页面上的性能出了问题,于是进行了一次性能上的优化,时间也过了一阵了,想总结出一些东西来,可是一直没有时间,今天下班早一些,赶紧整理一下思路,以免以后忘记了。

    我们的框架配置:Struts2+Spring+Ext2.1

    页面布局:主页面=menu+toolbar+tabPanel ,每一个模块一个TAB页的形式展现出来。(很传统)

     我们经历的三次重构:

    1. 从普通的JSP+HTML+自定义TAG --》 EXT

     2. 多个JSP的TAB页面嵌套--》One Page One Application

     3. JS全部一次性加载--》JS依赖关系懒加载+JS压缩

    这三次重构的方案实际上是我们在EXT开发过程中的不断的犯错误中的教训总结。

   下面我就从这三次重构中总结一下每一次的出发点及动机,经历的磨难,最后的成效。

    第一次,从JSP+HTML+TAG --》 EXT2.1

     这一次的重构在我们项目来看是一次历史性的变革。项目在进行过程中,前期大量的需求调研,并与客户进行拍板定需求,可是客户都是打太极的高手,他们不会告诉你他要什么,他也不会拍些板来说这个就这么做了,所以我们对于需求上的定义始终是模糊的。他们对系统的要求也是相当的高,会要求在BS上的架构上进行数据实体的连线,会要求多种多样的表现形式。

    我们先从静态页面进行了初期的规划,画了一版静态页面,然后客户对些不发表任何意见,要求一个能连贯起来的系统。于是我们以最快的速度在短时间内使用JSP+一些自定义的TAG+HTML+CSS画出了一些有较多功能性的模块,在这过程中,客户对页面不断的提出要求,要更多的用户体验,对我们所画出来的列表,表格,树以及布局都提出了较高的要求,并一再的埋怨我们的页面过于死板。在客户的不断压力下,领导提出了一个相当有风险的提议。使用当前国内界内用户量并不是很大,使用也不是很成熟的EXT

    我在以前的项目使用过一段时间,只有少量的经验,这个决定很超出我的想像。在这一点上,我有很多东西需要向领导们学习。领导给我们的预研时间是一个星期。由于成手很缺少,于是项目内组织几个以前有过页面开发经验的一年的员工进行技术预研。这一周时间里,我们的预研人员数量还是不错,将EXT的版本定义在2.1这个相对较新的版本,将各个类型的控件分配到下面的每一个人手里,一周的时间里,大家对各自的控件都有了一定的了解。

    其实这里差一点忘了一个更大的风险,我们的框架也是在这个时间里诞生的,之前公司内推的技术框架被领导贬的一文不值,于是我们有了搭建新的框架的想法。我们在这两周里,将框架的层次,各个层次的交互,异常的处理,事务的控制以及数据库的操作都定义出来了。其他的设计机制我们是在接下来的时间里完成的,但是前面所说的这几样最基本的模型是在这段时间里产生的。

    经历了这两周的时间的预研过程,我们在新的框架上建立了一个相对较完整的DEMO,将各个层次之间也一起串联起来了。

    时间很短,这里面领导的开发经验和天赋很让我佩服,我主要的工作是在前后台的交互,异常的处理和DEMO的开发上,并主要负责指导其他开发人员使用EXT的预研。

    总结一下这一阶段的主要开发思路,其实这一阶段主要将EXT的使用进行普及,使所有的开发人员可以基本熟练的使用EXT进行业务模型的实现,并解决处理业务中的一些问题。所以这一次重构基本谈不上优化,只是一次功能与业务在新框架上的迁移。

    第二次,将多页面的EXT模块开发转为one page one application

    我们新搭建的框架在根本上还是以JSP和JAVA做为开发语言,虽然前台使用了EXT,大量的使用了AJAX的调用,但是JSP在服务端的编译还是避免不了。

    同时,由于我们系统的特殊性,我们的业务的复杂性,我们在整个系统中,嵌套了多个页面,拥有多个JSP的嵌套。我们在第一阶段的时候,所有的模块的嵌入方式就是以iframe来进行嵌套。因此在这里,由于系统的复杂性,在最复杂的一个页面上,竟然嵌套了六层iframe。加上JSP的编译时间,再加上每一个页面上都引入了ext-all.js 和ext-base.js ,以及一些公共的JS文件,怎么可能不慢。我们粗略的计算了一下。最慢的页面打开要超过两分钟,客户端的硬件配置如果糟一点就更慢了。

    在这种环境下,我们不得不进行第二次的页面重构,进行性能的调优。

    分析一下这一次的重构,其实我们主要的问题在于业务的复杂性,数据量大,以及开发人员开发过程中的经验不足。

    从框架的设计上来说也是有着严重的不足,其中大量的使用iframe就是一个问题,经过一些专业的测试软件测试,发现很多的iframe关闭后 ,该页面所持有的DOM节点并未释放,后来做了特殊的处理,也同样是无法全完释放页面上的内存占用。每一个页面上都引了ext-all.js,就单单这一个JS的基础类库文件,就足足有近500K,虽然多个页面引用后下载只下载一次,从缓存文件中读取,但是每一个页面要想正确的加裁EXT的控件,是需要对这个基础类库进行编译的。这样的话,多个页面进行嵌套的时候,就面临着这巨大的性能问题。

    结合上述的问题所在,我们进行第二次的重构。主要的方案就是将过多的iframe进行合并处理,大量的iframe进行整合,减少ext-all.js的加载次数,并精减掉iframe。这样就从很大程度上减少了js文件的编译时间,重复JS编译时间。

    最后我们精减后的页面框架是主页面上有一个JSP,上面加载了所有的JS,以前用iframe来框起来的页面都用Ext的panel来代替,从页面的编译时间上来看,是大大的减少了这方面的消耗。同时在副页面上,原来的多层的JSP也都使用panel来代替,其中将activeX控件也放在了panel中。

    经过了重构后的系统,在JS下载及编译的时间上大大的减少了,jSP的引用数量少了,编译时间也缩短了。于是在性能上有了一个飞越。

    可是好景不长,我们在重构基本完成的时候,性能问题再度暴露。

    第三次,从首次完全加载,到动态加载JS。

     由于使用了one page one application的思想,我们的页面减少了,可是JS并没有减少,一个页面上引用了大量的JS,其中算上基础的ext-all.js等文件,我们在一个页面上加载了170+个JS文件,其数量真是可观,其性能也足以想像得到了。

    由于这个企业应用的复杂性,我们的JS想减少是不太可能了,我们现在就是按功能点进行划分JS对象的。其中很多JS也都进行了合并。但是数量依然不减。

    分析一下这次重构的原因,JS的数量过多,第一次加载页面的时候,会非常慢,但是加载过后,操作会较快,这个其实也是当初预料到的一个风险,但是没有想到会这么严重。有些低估了。同时,由于都在一个页面上,这个页面加载的DOM节点超级多,用监控软件可以看到节点的递增,并有部分节点不能正常释放,这个也是EXT官方论坛上公认的一个问题。要想从根本上去把这个问题解决了我们没有这个精力,也没有这个能力和时间。

     后来,我们为此特意组织了一个性能优化小组,单凭我一个人是解决不了了,毕竟人多力量大。经过几次会议和几种方案的验证,我们做了如下的计划和方案。

     1. 将JS进行合并压缩。

        使用yahoo的yui-compress.jar进行压缩JS,去掉过多的空格和注释,并合并,减少IO的支出。

     2. 将前后台传输的数据进行GZIP压缩。

        大数据量的数据传输,通过GZIP的压缩方案,可以减少到25%,有些数据可能会更多。

    3. 对大量的JS分析依赖关系,进行动态加载。

         这个是关键,通过分析所有的JS中的依赖关系,减少了JS加载的数量。从很大程度上提高了性能

    4. 另外对部分页面进行缓存,而非真正的关闭。

         对于Ext的消毁不能完全释放节点,那我们就不消毁他,进行对象的缓存,并在重新打开该功能的时候进行数据的重新加载和重置功能,对象重用。

      经过上述的四种方案后,我们的页面性能有了大幅度的提升,由原来的35+秒,提升到首页面加载只需要3秒之内。

     其中将依赖关系进行分析后,我们定义了依赖关系映射文件,将首页面上首先要加载的JS进行压缩合并,分块显示,同时将不需要一进入页面就要显示的模块进行懒加载,在使用的时候再从服务端DOWN下来进行编译,同时使用了数据的GZIP压缩,页面也进行了缓存。

      还有一个外部的因素,由于系统使用的客户机环境上的复杂,我们在多个浏览器上进行了测试,只有IE是最慢的,尤其是IE6,后来发现不是IE6要比IE7慢,是因为发现MS发布了脚本引擎cscript 5.7, 而大部分的ie6系统都装的是5.6, 这个版本上的升级,不仅仅是修改了BUG,在JS的执行速度上也有了较大的提升,于是我们在环境因素上又加上了一条,要求客户安装cscript5.7,也大大的提升了页面的打开时间。

     经过了上述的三次页面重构,我们的系统基本上在页面的性能上趋于稳定,基本上满足了客户对于性能及用户体验度上的要求。为此特定总结如下,感兴趣的朋友可以参见一下,有不明白的地方我们多交流,随着时间的推移,我会将这次项目中的很多经验都写出来,与大家分享。

分享到:
评论

相关推荐

    Ext性能优化总结

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

    Linux性能优化大师.pdf

    《Linux性能优化大师》这本书是Linux系统管理员和开发者的重要参考资料,它深入探讨了如何通过各种技术手段提升Linux系统的运行效率和稳定性。以下是一些关键的知识点: 1. **监控工具**:书中会介绍一系列用于系统...

    Linux性能优化_linux性能优化_linux_

    在IT领域,Linux系统的性能优化是一项至关重要的任务,尤其对于那些依赖高性能计算或者需要高效运行服务的项目。本文将深入探讨Linux性能优化的关键方面,帮助你理解如何通过一系列策略和工具提升系统的整体效能。 ...

    Linux性能优化大师(监控工具,分析性能,调优)

    然而,随着系统复杂性的增加,性能优化变得至关重要。本文将深入探讨Linux性能优化大师所涵盖的监控工具、性能分析以及调优策略。 一、监控工具 1. **top**:实时查看系统资源利用率,包括CPU、内存、进程状态等。...

    Linux下Ext2文件系统的精剪与优化设计.pdf

    "Linux下Ext2文件系统的精剪与优化设计" 本文主要介绍了 Linux 下 Ext2 文件系统的精剪与优化设计。Ext2 文件系统是 GNU/Linux 系统中的标准文件系统,采用簇块取层的优良设计,存取文件的性能好。Ext2 文件系统的...

    面试必问之jvm与性能优化.docx

    ### jvm性能优化相关知识点详解 #### 一、JVM加载Class文件的原理机制 **1.1 类加载概述** Java虚拟机(JVM)在执行Java程序时,并不会一次性加载所有的类,而是采取按需加载的方式。这种方式可以有效减少内存消耗...

    ext3.jar ext使用非常多

    在EXT3中,一个显著的变化是EXT3.0的发布,这个版本带来了许多性能优化和稳定性提升。例如,对AJAX请求进行了优化,增强了数据存储和模型的处理能力,同时扩展了布局选项,使得开发者能更灵活地设计用户界面。EXT3.0...

    ext4.0中文文档

    EXT4.0的中文文档详细阐述了这些特性的实现原理和配置方法,包括如何创建、挂载、检查和调整EXT4文件系统,以及如何利用这些特性优化系统性能。文档还可能涵盖错误处理、故障排查和维护技巧等内容。 对于开发者而言...

    ext3.0.rar

    - **性能优化**:文档可能包含关于如何调整EXT3参数以优化系统性能的信息。 - **开发实践**:示例代码可以提供如何在用户空间应用程序中利用EXT3特性的实例。 EXT3虽然后来被EXT4取代,但至今仍然在许多Linux发行版...

    EXT安装包4.2.1-1

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

    Windows读取Ext4分区的工具 Ext2Read

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

    最新ext3.0资源包 ext3.0

    此外,随着固态硬盘(SSD)的普及,EXT3的写入优化不如专为SSD设计的文件系统如EXT4和XFS。 EXT3.0 alpha 版本可能是指EXT3的一个早期开发版本,通常alpha版本是软件开发过程中的第一个公开测试版本,可能存在较多...

    ext相关资料-ext3.1

    10. **EXT3的局限性**:尽管EXT3在当时是先进的文件系统,但它在面对大数据和高性能需求时,如SSD优化和在线调整文件系统大小等方面,已经显得有些力不从心。后来出现了EXT4,它解决了许多EXT3的限制,并提供了更多...

    EXT3.3学习文档

    EXT3.3作为其一个更新版本,可能包含了一些性能优化、错误修复或者新功能的添加。 EXT3文件系统的特点包括: 1. **日志式文件系统**:EXT3引入了日志记录机制,可以在系统崩溃或非正常关机后快速恢复文件系统的状态...

    ext4_utils

    3. **tune2fs**:调整ext4文件系统的参数,如预分配、日志大小、inode比例等,以优化性能或适应特定工作负载。 4. **fsck.ext4**:检查和修复ext4文件系统的错误,确保数据的完整性和一致性。 5. **dumpe2fs**:显示...

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

    EXT3.4与EXT3.1.0之间的差异可能体现在性能优化、错误修复、兼容性改进等方面,具体细节通常会在发行说明或变更日志中详细列出。随着版本的更新,EXT3可能会增加新的功能或改进现有功能,以应对不断发展的硬件和软件...

    EXT2.3+EXT2.0教程

    EXT2.3作为后续版本,主要在于性能优化和功能完善。这个版本修复了大量已知问题,增强了组件的稳定性和兼容性。EXT2.3添加了一些新的组件,比如树形网格(TreeGrid),将树结构和表格结合,提供了更丰富的数据展现...

    EXT IDE,方便的EXT开发工具

    10. **性能优化**:对于EXT应用,性能是关键。EXT IDE可能提供性能分析工具,帮助开发者找出性能瓶颈并进行优化。 EXT IDE的使用不仅限于新手,经验丰富的EXT开发者也能从中受益。通过提供一个统一的工作环境,EXT ...

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

    4. **EXT学习文档**:这份文档可能提供了EXT的进阶学习路径,包括性能优化、无障碍访问性(Accessibility)以及EXT与其他技术(如PHP、Java等后端框架)的集成。 5. **EXT技术程序文档大全**和**ext_教程(入门到...

Global site tag (gtag.js) - Google Analytics