Mojarra与MyFaces多复合组件大页面性能差异及配置优化咨询
MyFaces与Mojarra的性能差异:配置复用性与实现本质分析
一、MyFaces开发/生产阶段性能差异的核心配置
MyFaces在生产模式下默认开启了一系列针对性优化,这是其开发与生产耗时差距巨大的关键:
- 视图与复合组件缓存:生产模式下预编译Facelets视图、缓存复合组件的TagHandler树和组件结构,彻底避免每次请求都调用
CompositeComponentTagHandler.applyCompositeComponent重新解析构建;开发模式为了热重载,强制禁用所有缓存,每次请求都重新解析模板。 - 状态管理优化:生产模式默认启用视图状态序列化压缩存储,减少内存占用同时提升序列化/反序列化效率;开发模式采用内存存储且无压缩,状态处理开销更高。
- 调试特性禁用:关闭开发阶段的EL表达式严格检查、组件状态验证、调试日志等额外开销项。
二、这些优化配置在Mojarra中的可复用性
Mojarra也支持类似的生产优化,但部分配置需要手动开启或存在行为差异:
- 基础生产模式切换:通过设置
javax.faces.PROJECT_STAGE=Production,Mojarra会自动关闭调试特性、启用视图编译缓存。如果你的项目之前未正确设置该参数,会导致开发与生产性能差异不明显。 - 复合组件缓存:Mojarra 2.3+支持通过
com.sun.faces.compositeComponent.cache.enabled=true开启复合组件定义缓存,可直接降低applyCompositeComponent方法的调用耗时,这是针对你场景的关键优化项。 - 状态管理优化:开启
com.sun.faces.compressViewState=true(默认已开启)和com.sun.faces.serializeServerState=true,优化视图状态的序列化与存储效率。 - 视图缓存增强:确保
com.sun.faces.disableFaceletsCache=false(生产模式默认),避免视图模板重复解析。
三、二者性能差异的本质实现原因
即使配置完全对齐,Mojarra仍可能比MyFaces慢,核心源于实现逻辑的差异:
- 复合组件处理机制:MyFaces对复合组件的元数据采用全局缓存策略,生产模式下复合组件的结构只需解析一次即可全局复用;而Mojarra的复合组件缓存更偏向视图级,局部Ajax更新时可能需要重新解析组件上下文,导致额外开销。
- 视图构建逻辑:MyFaces在生产模式下对视图树的构建做了大量预优化,比如提前解析标签库、缓存组件类型映射;Mojarra的视图构建更偏向动态解析,即使在生产模式下,局部更新场景仍会触发部分视图树的重新构建。
- 优化侧重点:MyFaces社区长期聚焦大型页面、复合组件的性能调优;Mojarra作为JSF规范的官方实现,更注重兼容性与规范严格性,性能优化相对保守。
针对你的Mojarra应用的优化建议
- 确认
javax.faces.PROJECT_STAGE已设置为Production,开启基础生产优化。 - 添加
com.sun.faces.compositeComponent.cache.enabled=true配置,针对性优化复合组件的解析开销。 - 验证
com.sun.faces.compressViewState和com.sun.faces.serializeServerState已启用,优化状态处理。 - 关闭开发阶段遗留的调试配置,比如
com.sun.faces.validateXml、com.sun.faces.verifyObjects。
内容的提问来源于stack exchange,提问作者Fergun
相关产品推荐
相关产品推荐

