这篇博客文章起源于一个大型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的替代方案? 有多种方法,具体取决于个人喜好。 我将尝试提出一些建议。

  1. 在大型可编辑表中使用标准JSF选择组件。 但是主题是什么? 没问题。 所有现代浏览器(包括IE8和更高版本)都可以设置本机HTML选择元素的样式。 您可以调整边框,背景的颜色,并根据应用的主题让选择看起来或多或少地显得时尚。 当然前提是前提是,您不需要高级功能,例如选定组件中的自定义内容(过滤器功能或其他功能)。
  2. PrimeFaces中的单元格编辑功能可呈现本机选择元素,并且速度很快。
  3. PrimeFaces中的行编辑功能可呈现本机选择元素,而且看起来也很快。
  4. 在一个视图中使用主从方法。 您选择一行并查看要编辑的详细信息。 详细信息可以显示在表格的外部–在右侧或顶部,具体取决于表格的宽度/高度。
  5. 具有不同视图的主从方法。 您选择一行并切换视图。 您可以在PrimeFaces Extensions的MasterDetail组件中看到详细信息,而不是表格。 您可以从详细信息转到其他级别来创建/编辑更多详细信息,然后最后再次跳至概览表。
参考: JSF: JCG合作伙伴 Oleg Varaksin在软件开发博客上的想法中, 在传统组件和时尚性能杀手之间进行选择 。

翻译自: https://www.javacodegeeks.com/2013/05/jsf-choice-between-legacy-components-and-fashionable-performance-killers.html

JSF:在传统组件和时尚性能杀手之间进行选择相关推荐

  1. jsf tree组件_JSF:在传统组件和时尚性能杀手之间进行选择

    jsf tree组件 这篇博客文章起源于一个大型Web应用程序中的性能问题. 每个人都优化Java代码,但似乎没有人尝试优化JavaScript代码. 奇怪,因为在客户端有很多改进的空间. 我会说,甚 ...

  2. 使用RAID增加传统机器硬盘的性能

    下面我们来看如何使用RAID增加传统机器硬盘的性能,首先我们来了解一下什么是RAID,RAID是磁盘冗余队列的简称,简单的来说就是RAID可以把多个容量较小的磁盘组成一组容量更大的磁盘,并且提供数据冗 ...

  3. 外键查询_传统关系型数据库查询性能提高思路

    相信现阶段依然有许多的企业信息化项目依然采用单体架构,其数据存储主要方式依然以关系型数据库为主,比如oracle.mysql.postgresql等.企业初期,各种原因导致研发人员身兼数职,都是全栈的 ...

  4. 伪共享(false sharing),并发编程无声的性能杀手

    在并发编程过程中,我们大部分的焦点都放在如何控制共享变量的访问控制上(代码层面),但是很少人会关注系统硬件及 JVM 底层相关的影响因素.前段时间学习了一个牛X的高性能异步处理框架 Disruptor ...

  5. Web 仿 App 动画竟然引出了“性能杀手”

    本文作者:杨晔 原创声明:本文为阅文前端团队 YFE 成员出品,请尊重原创,转载请联系公众号 ( id: yuewen_YFE ) 获取授权,并注明作者.出处和链接. 背景 在我参与开发的对话小说项目 ...

  6. 使用Maven实施自定义JSF 2.0组件

    前一段时间,我编写了自己的定制JSF组件. 但是在那个时候,JSF 1.0仍然是最新的,并且该项目没有使用maven作为构建系统. 因此,我一直想用maven编写一个自定义JSF2组件. 因此,让我们 ...

  7. vue渲染大量数据如何优化_加速vue组件渲染之性能优化

    背景 平时在用vue开发后台管理系统的时候,应该会用到大量的table这种组件,正常这种组件我们会在项目里做二次封装,然后针对表头title做参数化配置,如下: export default { da ...

  8. 伪共享,并发编程无声的性能杀手

    伪共享,并发编程无声的性能杀手 在并发编程过程中,我们大部分的焦点都放在如何控制共享变量的访问控制上(代码层面),但是很少人会关注系统硬件及 JVM 底层相关的影响因素.前段时间学习了一个牛X的高性能 ...

  9. 传统关系型数据库查询性能提高思路

    相信现阶段依然有许多的企业信息化项目依然采用单体架构,其数据存储主要方式依然以关系型数据库为主,比如oracle.mysql.postgresql等.企业初期,各种原因导致研发人员身兼数职,都是全栈的 ...

最新文章

  1. 四代 DNA 测序技术简述*
  2. LeetCode 215 Kth Largest Element in an Array
  3. LeetCode 891. 子序列宽度之和(数学)
  4. Python标准库base64用法简介
  5. MongoDB 我的学习笔记
  6. flume-sink
  7. Xcode打包后,找不到dSYM文件
  8. 【codeforces 760B】Frodo and pillows
  9. 敬你一杯酒,从此莫回头。往事归零,爱恨随意。我干杯,你随意
  10. (原創) 如何一個字元一個字元的印出字串? (C/C++) (C)
  11. 【转】Java方向如何准备BAT技术面试答案(汇总版)
  12. 实验(五)键盘检测实验
  13. hdu 6194string string string 后缀自动机
  14. ROS1云课→20迷宫不惑之A*大法(一种虽古老但实用全局路径规划算法)
  15. /etc/shells 777权限,vsftp本地用户不能登陆
  16. 手机JAVA编程技术
  17. oracle常用函数使用大全 (Oracle除法)
  18. 双 JK 触发器 74LS112 逻辑功能。真值表_必看好文-MOS管构成的基本门逻辑电路解析...
  19. ifix与AB PLC contrologix 5300系列的通讯
  20. Struts2--控制标签(s:if、s:elseif、s:else、s:iterator)

热门文章

  1. python 高维数据_Python数据分析入门|利用NumPy高效处理高维数据
  2. python scratch unity_Unity3D研究院之2D游戏开发制作原理(二十一)
  3. 本地java【动态监听】zk集群节点变化
  4. java本地创建zk节点
  5. 堆栈溢出 java_堆栈溢出回答了我们所不知道的Java首要问题
  6. xml不利于调试_流利的接口不利于维护
  7. 本地运行flowable_在CockroachDB上运行Flowable
  8. selenium持续集成_使用Selenium进行Spring Boot集成测试
  9. 如何在CircleCI上构建支持Graal的JDK8?
  10. jpa和hibernate_从JPA到Hibernate的旧版和增强型标识符生成器