STAX Parser - Несоответствующая производительность для одного и того же входного файла - PullRequest
0 голосов
/ 13 января 2011

Я использую синтаксический анализатор STAX для обработки каждого текстового узла в формате xhtml. Приложение развернуто в окне Unix. Операция синтаксического анализа занимает больше времени при самом первом выполнении. Когда я запускаю второй раз, это занимает относительно меньше времени, а в последующих вызовах это занимает гораздо меньше времени, чем второй запуск, после чего результаты практически совпадают. Ниже приведен код, который я использую. Не уверен, почему существует несоответствие во времени, необходимом для синтаксического анализа одного и того же ввода. Пожалуйста, помогите.

Однократное создание XmlInputFactory (статический метод на уровне класса)

    static {
    if (xmlInputFactory == null) {
    xmlInputFactory = XMLInputFactory.newInstance();
    xmlInputFactory.setProperty(javax.xml.stream.XMLInputFactory.IS_NAMESPACE_AWARE, false);
    }
    }

Код синтаксического анализа, который выполняет непоследовательно, давая разное время отклика для тот же входной файл,

    private static void parse(String xhtmlInput) throws XMLStreamException {
    ByteArrayInputStream arrayInputStream = new ByteArrayInputStream      (xhtmlInput.getBytes(Charset.forName("UTF-8")));
    XMLStreamReader parser = xmlInputFactory.createXMLStreamReader(arrayInputStream);
    while (true) {
    int currentEvent = parser.next();
    if (currentEvent == XMLStreamConstants.CHARACTERS) {
        // Do operation
    } else if (currentEvent == XMLStreamConstants.END_DOCUMENT) {
    parser.close();
    break;
    }
    }
    }

1 Ответ

3 голосов
/ 13 января 2011

Не зная, какая это реализация, это спекуляция, но есть две распространенные причины, по которым любая библиотека или приложение Java через некоторое время работает быстрее:

  • Сама JVM просто выполняетВремя компиляции байт-кода, оптимизация его на лету.Это называется прогревом JIT и происходит довольно быстро (в течение первых 10 секунд или около того)
  • При чтении файлов базовая операционная система обычно кэширует читаемые блоки диска - если вы снова читаете тот же контент, он не читаетсяс диска, но из дисковых буферов в памяти.

Это также наиболее распространенные причины, по которым наивные тесты java-тестирования дают бесполезные результаты: если вы не учитываете и то, и другое (т.е. прогревает тесты некоторое времяотменить первоначальные результаты и прочитать данные испытаний из памяти, а не с диска), результаты не имеют смысла.

...