JSF:在传统组件和时尚性能杀手之间进行选择
这篇博客文章起源于一个大型Web应用程序中的性能问题。 每个人都优化Java代码,但似乎没有人尝试优化JavaScript代码。 奇怪,因为在客户端有很多改进的空间。 我会说,甚至比服务器端还要多。 我们将分析可编辑的JSF标准组件(有时称为“旧版”)以及具有丰富JavaScript小部件的现代PrimeFaces组件的性能。 这是中立的分析,不能怪任何图书馆或任何人。 只有事实。
好。 我们要测试什么? 目标是测量PrimeFaces的JS脚本块执行的客户端性能(无后端逻辑)
p:inputText / p:selectOneMenu。 我们想用输入/测试一个可编辑的p:dataTable 选择表单元格中的组件。 该表有25行和16列,表示25 * 16 = 400个单元格。 每个单元格都包含输入或选择组件。 有6个测试用例。 标准的h:inputText和h:selectOneMenu没有JS脚本块,因此有趣的是看看JS小部件有什么影响。
整个测试项目可在GitHub上找到 。 简单克隆或下载它,然后使用内置的Maven Jetty插件运行。 使用新的Navigation Timing JavaScript API测量页面加载速度,以准确地测量Web上的性能。 该API提供了一种获取准确而详细的时序统计信息的简单方法。 比使用JS Date对象更精确。 导航定时JavaScript API在Internet Explorer 9和更高版本(最新版本的Google Chrome和Firefox)中可用。 在GitHub上显示了用于测量从当前响应到达到触发窗口onload事件为止的时间的代码。
JavaScript是单线程的,因此让我们看看顺序脚本块的执行如何会减慢显示网页的速度。 如果我们只测试
h:inputText和p:inputText,区别是微不足道的。 页面加载时间几乎相同。 在Windows 7和Firefox 20.0.1上运行,我只能看到带有p:inputText的表需要ca。 比使用h:inputText的表多200-300 ms。 这是一个很好的结果,这意味着一个p:inputText的JS脚本执行时间不到1毫秒。 真的很好 祝贺PrimeFaces。 使用输入和选择进行的混合测试显示,带有PrimeFaces组件的页面大约需要1.5 sek。 不只是包含标准组件的页面。 添加更多PrimeFaces选择组件会降低页面渲染时间。 极端的情况是只有p:selectOneMenu组件。 这是性能杀手,也是我们的Web应用程序太慢的原因。 Internet Explorer显示众所周知的错误消息“此页面上的脚本导致Internet Explorer运行缓慢”。 看一下页面加载时间本身。
h:selectOneMenu
p:selectOneMenu
如果我们假设组件渲染器花费大约相同的时间来渲染HTML输出,那么我们可以计算单个p:selectOneMenu的JS脚本块执行时间。 这个时间是11.3毫秒。 这太多了。 原因可能是窗口小部件的构造函数中有许多效率低下的jQuery选择器。 我不知道,在这里也没关系。 在装有Ubuntu的笔记本上,我的时差很大。 10瑞典克朗。 具有400个p:selectOneMenu标签的浏览器几乎“冻结”。
h:selectOneMenu
p:selectOneMenu
结论
有人说“ JSF很慢,JSF不是正确的技术”。 错误。 JSF足够快。 这取决于如何使用此框架。 一次编辑所有内容都很好,但是显然不建议使用带有丰富JSF组件的大型可编辑DataTable。 什么是可编辑DataTable的替代方案? 有多种方法,具体取决于个人喜好。 我将尝试提出一些建议。
- 在大型可编辑表中使用标准JSF选择组件。 但是主题是什么? 没问题。 所有现代浏览器(包括IE8和更高版本)都可以设置本机HTML选择元素的样式。 您可以调整边框,背景的颜色,并根据应用的主题让选择看起来或多或少地显得时尚。 当然前提是前提是,您不需要高级功能,例如选定组件中的自定义内容(过滤器功能或其他功能)。
- PrimeFaces中的单元格编辑功能可呈现本机选择元素,并且速度很快。
- PrimeFaces中的行编辑功能可呈现本机选择元素,而且看起来也很快。
- 在一个视图中使用主从方法。 您选择一行并查看要编辑的详细信息。 详细信息可以显示在表格的外部–在右侧或顶部,具体取决于表格的宽度/高度。
- 具有不同视图的主从方法。 您选择一行并切换视图。 您可以在PrimeFaces Extensions的MasterDetail组件中看到详细信息,而不是表格。 您可以从详细信息转到其他级别来创建/编辑更多详细信息,然后最后再次跳至概览表。
翻译自: https://www.javacodegeeks.com/2013/05/jsf-choice-between-legacy-components-and-fashionable-performance-killers.html
JSF:在传统组件和时尚性能杀手之间进行选择相关推荐
- jsf tree组件_JSF:在传统组件和时尚性能杀手之间进行选择
jsf tree组件 这篇博客文章起源于一个大型Web应用程序中的性能问题. 每个人都优化Java代码,但似乎没有人尝试优化JavaScript代码. 奇怪,因为在客户端有很多改进的空间. 我会说,甚 ...
- 使用RAID增加传统机器硬盘的性能
下面我们来看如何使用RAID增加传统机器硬盘的性能,首先我们来了解一下什么是RAID,RAID是磁盘冗余队列的简称,简单的来说就是RAID可以把多个容量较小的磁盘组成一组容量更大的磁盘,并且提供数据冗 ...
- 外键查询_传统关系型数据库查询性能提高思路
相信现阶段依然有许多的企业信息化项目依然采用单体架构,其数据存储主要方式依然以关系型数据库为主,比如oracle.mysql.postgresql等.企业初期,各种原因导致研发人员身兼数职,都是全栈的 ...
- 伪共享(false sharing),并发编程无声的性能杀手
在并发编程过程中,我们大部分的焦点都放在如何控制共享变量的访问控制上(代码层面),但是很少人会关注系统硬件及 JVM 底层相关的影响因素.前段时间学习了一个牛X的高性能异步处理框架 Disruptor ...
- Web 仿 App 动画竟然引出了“性能杀手”
本文作者:杨晔 原创声明:本文为阅文前端团队 YFE 成员出品,请尊重原创,转载请联系公众号 ( id: yuewen_YFE ) 获取授权,并注明作者.出处和链接. 背景 在我参与开发的对话小说项目 ...
- 使用Maven实施自定义JSF 2.0组件
前一段时间,我编写了自己的定制JSF组件. 但是在那个时候,JSF 1.0仍然是最新的,并且该项目没有使用maven作为构建系统. 因此,我一直想用maven编写一个自定义JSF2组件. 因此,让我们 ...
- vue渲染大量数据如何优化_加速vue组件渲染之性能优化
背景 平时在用vue开发后台管理系统的时候,应该会用到大量的table这种组件,正常这种组件我们会在项目里做二次封装,然后针对表头title做参数化配置,如下: export default { da ...
- 伪共享,并发编程无声的性能杀手
伪共享,并发编程无声的性能杀手 在并发编程过程中,我们大部分的焦点都放在如何控制共享变量的访问控制上(代码层面),但是很少人会关注系统硬件及 JVM 底层相关的影响因素.前段时间学习了一个牛X的高性能 ...
- 传统关系型数据库查询性能提高思路
相信现阶段依然有许多的企业信息化项目依然采用单体架构,其数据存储主要方式依然以关系型数据库为主,比如oracle.mysql.postgresql等.企业初期,各种原因导致研发人员身兼数职,都是全栈的 ...
最新文章
- 四代 DNA 测序技术简述*
- LeetCode 215 Kth Largest Element in an Array
- LeetCode 891. 子序列宽度之和(数学)
- Python标准库base64用法简介
- MongoDB 我的学习笔记
- flume-sink
- Xcode打包后,找不到dSYM文件
- 【codeforces 760B】Frodo and pillows
- 敬你一杯酒,从此莫回头。往事归零,爱恨随意。我干杯,你随意
- (原創) 如何一個字元一個字元的印出字串? (C/C++) (C)
- 【转】Java方向如何准备BAT技术面试答案(汇总版)
- 实验(五)键盘检测实验
- hdu 6194string string string 后缀自动机
- ROS1云课→20迷宫不惑之A*大法(一种虽古老但实用全局路径规划算法)
- /etc/shells 777权限,vsftp本地用户不能登陆
- 手机JAVA编程技术
- oracle常用函数使用大全 (Oracle除法)
- 双 JK 触发器 74LS112 逻辑功能。真值表_必看好文-MOS管构成的基本门逻辑电路解析...
- ifix与AB PLC contrologix 5300系列的通讯
- Struts2--控制标签(s:if、s:elseif、s:else、s:iterator)
热门文章
- python 高维数据_Python数据分析入门|利用NumPy高效处理高维数据
- python scratch unity_Unity3D研究院之2D游戏开发制作原理(二十一)
- 本地java【动态监听】zk集群节点变化
- java本地创建zk节点
- 堆栈溢出 java_堆栈溢出回答了我们所不知道的Java首要问题
- xml不利于调试_流利的接口不利于维护
- 本地运行flowable_在CockroachDB上运行Flowable
- selenium持续集成_使用Selenium进行Spring Boot集成测试
- 如何在CircleCI上构建支持Graal的JDK8?
- jpa和hibernate_从JPA到Hibernate的旧版和增强型标识符生成器