Производительность анализатора 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 ответ

Сначала у меня есть несколько комментариев к вашему коду:

  1. Эта строка преобразует строку в памяти в байтовый массив. Почему бы просто не прочитать его прямо из файла с помощью parseFile ()?

    vg.setDoc (vResultString.getBytes ());

  2. Это утверждение 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.

  3. Следующее утверждение

    venYear = Integer.valueOf(vn.toNormalizedString(vn.getText()));

    может быть переписан как

    venYear = vn.parseInt(vn.getText()));

Кроме этого, я не могу дать вам больше советов о том, как настроить ваш код, не выполнив полный контрольный пример с вашим кодом и данными XML.

Вы запускали профилировщик JDK, чтобы определить узкое место?

Другие вопросы по тегам