Производительность анализатора VTD и анализатора DOM
Хорошего дня,
Я пытался использовать синтаксический анализатор VTD для повышения производительности моего текущего кода DOM, однако я все еще вижу, что DOM выполняет более быстрый анализ, пожалуйста, сообщите, где я иду не так.
Вот мой пример кода вместе с примером XML
Образец XML -
<account-detail-result><status><status-code>0</status-code><status-message></status-message></status><result>
<line><entrydate><entryyear>2016</entryyear><entrymonth>02</entrymonth><entryday>16</entryday></entrydate><date><year>2016</year><month>02</month><day>15</day></date><merchant></merchant><description>DESCRIPTION1184076</description><transcode>246</transcode><rollingbalance>96.76</rollingbalance><indicator>DR</indicator><indicator>DR</indicator><txnseqno>366951</txnseqno><entrytime>50221</entrytime><isolbpendingtransaction>false</isolbpendingtransaction><valuedate>2016-02-15</valuedate><amount type='DR'>1000.00</amount><cardnumber></cardnumber></line>
Код VTD -
VTDGen vg = new VTDGen();
vg.setDoc(vResultString.getBytes());
vg.parse(false);
VTDNav vn = vg.getNav();
AutoPilot ap = new AutoPilot(vn);
ap.selectXPath("/account-detail-result/status");
while (ap.evalXPath() != -1) {
if (vn.toElement(VTDNav.FIRST_CHILD, "status-code")) {
if (vn.getText() != -1) {
vStatusCode = vn.toNormalizedString(vn.getText());
vn.toElement(VTDNav.PARENT);
}
}
if (vn.toElement(VTDNav.FIRST_CHILD, "status-description")) {
if (vn.getText() != -1) {
vStatusDescription = vn.toNormalizedString(vn.getText());
vn.toElement(VTDNav.PARENT);
}
}
}
ap.resetXPath();
ap.selectXPath("/account-detail-result/result/line");
while (ap.evalXPath() != -1) {
do {
int venYear = 0;
int venMonth = 0;
int venDay = 0;
if (vn.toElement(VTDNav.FIRST_CHILD, "entrydate")) {
if (vn.toElement(VTDNav.FIRST_CHILD, "entryyear")) {
if (vn.getText() != -1) {
venYear = Integer.valueOf(vn.toNormalizedString(vn.getText()));
vn.toElement(VTDNav.PARENT);
}
}
if (vn.toElement(VTDNav.FIRST_CHILD, "entrymonth")) {
if (vn.getText() != -1) {
venMonth = Integer.valueOf(vn.toNormalizedString(vn.getText()));
vn.toElement(VTDNav.PARENT);
}
}
if (vn.toElement(VTDNav.FIRST_CHILD, "entryday")) {
if (vn.getText() != -1) {
venDay = Integer.valueOf(vn.toNormalizedString(vn.getText()));
vn.toElement(VTDNav.PARENT);
}
}
vn.toElement(VTDNav.PARENT);
vPostedDateCol = new DateTime(venYear, venMonth, venDay, 0, 0, 0).toDate();
}
if (vn.toElement(VTDNav.FIRST_CHILD, "date")) {
if (vn.toElement(VTDNav.FIRST_CHILD, "year")) {
if (vn.getText() != -1) {
vYear = Integer.valueOf(vn.toNormalizedString(vn.getText()));
vn.toElement(VTDNav.PARENT);
}
}
if (vn.toElement(VTDNav.FIRST_CHILD, "month")) {
if (vn.getText() != -1) {
vMonth = Integer.valueOf(vn.toNormalizedString(vn.getText()));
vn.toElement(VTDNav.PARENT);
}
}
if (vn.toElement(VTDNav.FIRST_CHILD, "day")) {
if (vn.getText() != -1) {
vDay = Integer.valueOf(vn.toNormalizedString(vn.getText()));
vn.toElement(VTDNav.PARENT);
}
}
vn.toElement(VTDNav.PARENT);
}
if (vn.toElement(VTDNav.FIRST_CHILD, "description")) {
if (vn.getText() != -1) {
vDescription = vn.toNormalizedString(vn.getText());
}
}
if (vn.toElement(VTDNav.NEXT_SIBLING, "transcode")) {
if (vn.getText() != -1) {
vTransactionCode = vn.toNormalizedString(vn.getText());
}
}
if (vn.toElement(VTDNav.NEXT_SIBLING, "rollingbalance")) {
if (vn.getText() != -1) {
vRollingBalance = vn.toNormalizedString(vn.getText());
}
}
if (vn.toElement(VTDNav.NEXT_SIBLING, "indicator")) {
if (vn.getText() != -1) {
System.out.println(vn.toNormalizedString(vn.getText()));
vIndicator = vn.toNormalizedString(vn.getText());
}
}
if (vn.toElement(VTDNav.NEXT_SIBLING, "txnseqno")) {
if (vn.getText() != -1) {
vTxnSeqNo = vn.toNormalizedString(vn.getText());
}
}
if (vn.toElement(VTDNav.NEXT_SIBLING, "entrytime")) {
if (vn.getText() != -1) {
vEntryTime = vn.toNormalizedString(vn.getText());
}
}
if (vn.toElement(VTDNav.NEXT_SIBLING, "isolbpendingtransaction")) {
if (vn.getText() != -1) {
isOLBPendingTransaction = vn.toNormalizedString(vn.getText());
}
}
if (vn.toElement(VTDNav.NEXT_SIBLING, "valuedate")) {
if (vn.getText() != -1) {
valueDate = vn.toNormalizedString(vn.getText());
}
}
if (vn.toElement(VTDNav.NEXT_SIBLING, "status")) {
if (vn.getText() != -1) {
vStatus = vn.toNormalizedString(vn.getText());
}
}
if (vn.toElement(VTDNav.NEXT_SIBLING, "amount")) {
if (vn.getText() != -1 && vn.getAttrVal("type") != -1) {
vAmount = vn.toNormalizedString(vn.getText());
vAmountType = vn.toNormalizedString(vn.getAttrVal("type"));
}
}
if (vn.toElement(VTDNav.NEXT_SIBLING, "cardnumber")) {
if (vn.getText() != -1) {
cardNumber = vn.toNormalizedString(vn.getText());
}
}
vn.toElement(VTDNav.PARENT);
} while (vn.toElement(VTDNav.NEXT_SIBLING, "line"));
}
ap.resetXPath();
1 ответ
Сначала у меня есть несколько комментариев к вашему коду:
Эта строка преобразует строку в памяти в байтовый массив. Почему бы просто не прочитать его прямо из файла с помощью parseFile ()?
vg.setDoc (vResultString.getBytes ());
Это утверждение if (vn.getText ()! = -1) {
vStatusCode = vn.toNormalizedString (vn.getText ()); vn.toElement (VTDNav.PARENT); }должно было
if (vn.getText ()! = -1) {vStatusCode = vn.toNormalizedString (vn.getText ());
} vn.toElement (VTDNav.PARENT);Обратите внимание, что в случае, если getText () возвращает -1, курсор не вернется к своему родительскому узлу, что приведет к ошибке в логике xpath.
Следующее утверждение
venYear = Integer.valueOf(vn.toNormalizedString(vn.getText()));
может быть переписан как
venYear = vn.parseInt(vn.getText()));
Кроме этого, я не могу дать вам больше советов о том, как настроить ваш код, не выполнив полный контрольный пример с вашим кодом и данными XML.
Вы запускали профилировщик JDK, чтобы определить узкое место?