根本原因が実際にわからないという問題があります。transformerFactory.newTransformerがテスト中に遅くなる
私ははjavax.xml.transform.TransformerFactoryのインスタンスを作成し、直接、その後、私はxsltSourceを解析:
protected synchronized Transformer getTransformer(Source xsltSource)
throws TransformerConfigurationException {
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer(xsltSource);
return transformer;
}
今私はテストスイートの一部であり、テストを持っています。このテストをスタンドアロンで実行すると、上記のコードは常に約1msかかります。
このテストをテストスイートの一部として実行すると時間がかかります。これは、gradleと同じように日食でも起こります。 継続時間は、前に実行されたテストの量に比例して増加します。
その特定のテストの前にどれだけ多くのテストを実行するかによって、その規模は10倍から1000倍のように遅くなります。
TransfomerFactoryのキャッシュされたインスタンスを使用すると、テストにかかる時間が半減します。しかし、症状は変わりません。
私はそれをプロファイリングしていますが、テストに時間がかかりますが、疑わしいものは表示されません。
何が原因である可能性がありますか?
編集私はcom.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImplを使用しています クラス。
JDKが提供するものはどれですか?
Edit2私は、ロードされたクラスの数と関係があると仮定しました(これは、テスト実行中に変更されるものです)。したがって、単一のテストのために任意にクラスをロードしましたが、タイミングは変更されませんでした。したがって、読み込まれたクラスの数はここでは誤りではないようです。
EDIT3私は私のクラスパスにサクソンパーサを追加し、特にその1を参照さ:
TransformerFactory transformerFactory = TransformerFactory.newInstance("net.sf.saxon.TransformerFactoryImpl", null);
TransformerImpl transformer = (TransformerImpl) transformerFactory.newTransformer(xsltSource);
行動はまだ同じで、テストスタンドアロンが速く実行されますが、テストスイートの一部としてそれがありますはるかに遅い。
Edit4私はこのコード行と同じ動作を持っている:
SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
それが遅くなり、より多くのテストは、特定のテストの前に実行されますが、それはスタンドアロンで実行された場合しません。
実際のXMLトランスフォーマはどのようなものを使用していますか?組み込みのもの? xalan?サクソン? – MeBigFatGuy