如何以10倍速加速Apache Xalan的XPath处理器

一段时间以来, Apache Xalan中存在一个令人尴尬的错误,该错误是XALANJ-2540 。 此错误的后果是Xalan每次XPath表达式求值将内部SPI配置文件加载数千次 ,可以很容易地进行如下测量:

这个:

Element e = (Element)document.getElementsByTagName("SomeElementName").item(0);
String result = ((Element) e).getTextContent();

似乎比这快100倍:

// Accounts for 30%, can be cached
XPathFactory factory = XPathFactory.newInstance();// Negligible
XPath xpath = factory.newXPath();// Negligible
XPathExpression expression =xpath.compile("//SomeElementName");// Accounts for 70%
String result = (String) expression.evaluate(document, XPathConstants.STRING);

可以看出,每10k测试XPath评估中的每一项都导致类加载器试图以某种默认配置查找DTMManager实例。 此配置不会加载到内存中,但每次都会访问。 此外,此访问似乎受到ObjectFactory.class本身上锁的保护。 当访问失败时(默认情况下),将从xalan.jar文件的配置文件中加载配置:

META-INF/service/org.apache.xml.dtm.DTMManager

每次!

关于Xalan的分析会议

关于Xalan的分析会议

幸运的是,可以通过指定以下JVM参数来覆盖此行为:

-Dorg.apache.xml.dtm.DTMManager=org.apache.xml.dtm.ref.DTMManagerDefault

要么

-Dcom.sun.org.apache.xml.internal.dtm.DTMManager=com.sun.org.apache.xml.internal.dtm.ref.DTMManagerDefault

上面的方法可以正常工作,因为如果工厂类名称仍然是默认名称,则这将绕过lookUpFactoryClassName()中的昂贵工作:

// Code from c.s.o.a.xml.internal.dtm.ObjectFactory
static String lookUpFactoryClassName(String factoryId,String propertiesFilename,String fallbackClassName) {SecuritySupport ss = SecuritySupport.getInstance();try {String systemProp = ss.getSystemProperty(factoryId);if (systemProp != null) { // Return early from the methodreturn systemProp;}} catch (SecurityException se) {}// [...] "Heavy" operations later

资源资源

上面的文字摘录自我不久前向公众提供的堆栈溢出问题和答案 。 我将其再次发布在我的博客上,以便可以提高社区对于这个相当严重的错误的认识。 请随意在这张票上投票,因为地球上的每个Sun / Oracle JDK都会受到影响: https : //issues.apache.org/jira/browse/XALANJ-2540

当然,向Apache贡献修复程序会更好。

参考: 如何通过我们的JCG合作伙伴 Lukas Eder在JAVA,SQL和JOOQ博客上以因子10倍速提高Apache Xalan的XPath处理器 。

翻译自: https://www.javacodegeeks.com/2013/09/how-to-speed-up-apache-xalans-xpath-processor-by-factor-10x.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/367245.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

反射例子(配置文件)

配置文件 className fanshe.Student1 showInfo show1 类student1 public class Student1 {public Student1() {System.out.println("调用了Student1 无参构造函数");}public void show1(){System.out.println("调用了show1()方法");} } 测试类 public cl…

503 Next Greater Element II 下一个更大元素 II

给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素。数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更…

mysql update nowait_mysql innodb之select for update nowait

作者: 弦乐之花 | 可以转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明mysql innodb之select for update nowait习惯了oracle数据库的select for update nowait的同学,如果转在mysql环境开发的话,也许会不太适应——目前builtin版本的inn…

使用ant design Pro开发项目的小结

一、关于上手。 1. 关于ant design Pro的介绍,自己看官网,大致上可以理解为ant design(组件库) ant design Pro (完整的项目) dva(路由 数据流管理)的组合拳。总之这个Pro是一个已经…

Activiti中的高级脚本:自定义配置注入

脚本任务可能是Activiti代码库中“最古老的”类之一,但我认为它仍然未被许多人使用。 (可以理解的?)缺点当然是性能(解释还是编译),并且从IDE角度来看支持较少。 但是,好处&#xf…

帆软决策报表嵌入html,在决策报表中使用网页框控件

假设决策报表里有一个网页框控件,控件名为rHIframe0;同时有三个按钮控件,分别给按钮控件添加下面的点击事件:3.1 setValue(String)设置并刷新网页框控件的地址(保留原参数)1)模板路径var Widget this.options.form.getWidgetByNa…

CentOS7.4搭建ftp服务

1.使用yum安装vsftpd yum install vsftpd -y 2.安装完成后,启动 FTP 服务: service vsftpd start 3.配置ftp权限 目前 FTP 服务登陆允许匿名登陆,也无法区分用户访问,为了安全,我们需要设置一下ftp权限 vsftpd 的配置目…

mysql binlog redo_mysql的binlog与redo log

binlogMysql Binlog是二进制格式的日志文件,用来记录Mysql内部对数据库的改动(只记录对数据的修改操作),主要用于数据库的主从复制以及增量恢复。获取binlog日志列表MariaDB [examples]> show master logs;----------------------| Log_name | File_s…

如何把网址配置为http和https可以同时访问

1.打开iis7 ,找到具体站点 2.点击站点后右侧有个绑定按钮 3.点击绑定,增加https,设置端口,ssl选择 iis证书 4.找到ssl设置,要求证书不勾选,客户证书,忽略 5.如果右侧不显示浏览站点https,点击站点高级设置-已启用协议&…

【前端轶事】Chrome 小恐龙背后的故事

本文转自 FEPulse 公众号(微信搜索 FEPulse,精选国内外最新前端资讯,为你把握前端脉搏)。 如果你是 Chrome 用户,一定对那萌萌哒的小恐龙不陌生,每当互联网连接断开时,你便能看到那只小恐龙&am…

高起专计算机专业答案,Windows知识题(高起专)答案

WORD格式可编辑.第2章Windows操作系统及其应用(单选题)1.Windows操作系统的主要功能是___B___。A.实现软、硬件转换B.管理计算机系统所有的软、硬件C.把源程序转换为目标程序D.进行数据处理提示:操作系统属于系统软件,它的主要功能是:管理系统…

深浅copy

深浅copy对比 列表赋值 例如:列表a[‘a’, b, c, d, 1, 2, 3],当执行代码ba,可以得到b[‘a’, b, c, d, 1, 2, 3],具体实现如下: >>> a[a, b, c, d, 1, 2, 3] >>> ba >>> id(a),id(b) (280…

mysql5 varchar_MYSQL 5.7 VARCHAR 类型实验

MYSQL 的VARCHAR 类型字段的最多能存储多少字符?模糊记得 VARCHAR 最多能存65535个字符,真的吗?理论上,一个字符类型能存的字符数量跟选取的编码字符集和存储长度限制肯定是有关系的,字符编码长度越小,长度…

《React源码解析》系列完结!

前言 距离第一篇《React源码解析(一)》已经过去将近4个月的时间,由于是我第一次进行源码解析相关的写作,思路和文笔还不够成熟。一百多天以来,我基于读者反馈反思这几篇文章中的不足,同时也在不断学习借鉴其他优秀作者的写作方法…

优化Java序列化– Java,XML,JSON,Kryo,POF

也许我很天真,但是我一直认为Java序列化肯定是将Java对象序列化为二进制形式的最快,最有效的方法。 毕竟Java是第7个主要发行版,所以这不是新技术,并且由于每个JDK似乎都比上一个快,因此我错误地认为序列化现在必须非常…

html5 css 字体加粗,HTML和CSS实现字体加粗的三种方法

大家在浏览网站时有没有注意到,页面中有些文字或字体加粗了,正在学习HTML和CSS的小伙伴,你知道HTML如何给文字加粗吗?CSS怎么设置字体加粗呢?这篇文章给大家总结了给字体和文字加粗的三种方法,包括HTML中的…

浅谈模拟退火

核心思想 模拟退火十分好写,它的核心思想就是: 每一次降温都可以从当前状态转移到另一种相近状态(没有严格定义,可以自己想产生相近解的方法) 如果那个相近状态的答案更优,当然转移到那种状态! …

如何应用前端技术唤起app及判断用户来源及与原生交互的原理

做唤起时需要native端进行配合, h5唤起app这种需求是常见的。在移动为王的时代,h5在app导流上发挥着重要的作用。 目前我们采用的唤起方式是url scheme(iOS,Android平台都支持),只需原生APP开发时注册scheme, 那么用户…

mysql 设置client char_mysql编码问题:show variables like “%char%”

mysql编码设置mysql> SHOW VARIABLES LIKE character_set_%;------------------------------------------------------| Variable_name | Value |------------------------------------------------------| character_set_client | latin1 || character_set_connection | la…

虾扯蛋之函数防抖和节流

背景 今天在coding的时候,做了一个搜索框,也正是这个搜索框,让我和后台小伙伴直接由铁磁变为塑料兄弟。那到底发生啥了呢?其实很简单,其实很无奈,就是我用王者的手速把他的接口访问崩了! 我们在…