我有一个项目,我创建了几个不同的XML解析器。在每种情况下,我都从XSD开始,使用JAXB生成带注释的类,并使用一些简单的样板来解析XML流,类似于:
JAXBContext context = JAXBContext.newInstance(contextClasses);
Unmarshaller parser = context.createUnmarshaller();
Object object = parser.unmarshal(stream);
contextClasses
的类型为Class[]
,并且包含与根XML标记对应的类,在某些情况下,还包含ObjectFactory
类。
到目前为止,效果非常好。我现在正在为他们的XSD添加针对Oracle的Agile XML的新解析器。这不是一个特别复杂的XSD。但是,由此产生的JABX生成的类数超过350,并且在620K LOC处进入。所以有很多生成的代码。当然比我的其他解析器更多。下一个最复杂的XSD会导致130多个课程。
对于此解析器,我只将根标记AgileData
传递给行:
JAXBContext context = JAXBContext.newInstance(contextClasses);
在运行时完成此行需要一分多钟。 CPU持续时间达到30-40%。这与我的所有其他解析器相比是不利的,其中这一行在众所周知的分裂中完成。
那么,为什么这条线需要很长时间才能完成? (当我查看代码时,它似乎只是简单地读取和加载类和属性,因此我猜测它是生成代码量的函数。)
更重要的是,我能做些什么来让它跑得更快,即。在与我的其他解析器类似的时间?