Java: нужна помощь с оптимизацией части кода - PullRequest
1 голос
/ 02 мая 2011

У меня есть простой код для преобразования XML, но он очень трудоемкий (мне приходится повторять это много раз).У кого-нибудь есть рекомендации, как оптимизировать этот код?Спасибо.

РЕДАКТИРОВАТЬ: Это новая версия кода. Я, к сожалению, не могу повторно использовать Transformer, так как XSLTRule в большинстве случаев отличается.Я сейчас снова использую TransformerFactory.Я не читаю из файлов до этого, поэтому я не могу использовать StreamSource.Наибольшее количество времени уходит на инициализацию Transformer.

private static TransformerFactory tFactory = TransformerFactory.newInstance();

public static String transform(String XML, String XSLTRule) throws TransformerException {

    Source xmlInput = new StreamSource(new StringReader(XML));
    Source xslInput = new StreamSource(new StringReader(XSLTRule));

    Transformer transformer = tFactory.newTransformer(xslInput);

    StringWriter resultWriter = new StringWriter();
    Result result = new StreamResult(resultWriter);
    transformer.transform(xmlInput, result);
    return resultWriter.toString();
}

Ответы [ 4 ]

3 голосов
/ 02 мая 2011

Первое, что вы должны сделать, это пропустить ненужное преобразование строки XML в байты (особенно с жестко закодированным, потенциально неправильным кодированием). Вы можете использовать StringReader и передать его конструктору StreamSource. То же самое для результата: используйте StringWriter и избегайте преобразования.

Конечно, если вы вызываете метод после преобразования вашего XML из файла (байты) в String, во-первых (опять-таки с потенциально неправильной кодировкой), было бы еще лучше иметь StreamSource читать из файла напрямую.

1 голос
/ 02 мая 2011

Кажется, вы применяете XSLT к XML-файлу.Чтобы ускорить процесс, вы можете попробовать скомпилировать XSLT, например, с помощью XSLTC .

.
0 голосов
/ 02 мая 2011

Как указано в ответе Майклза, вы могли бы ускорить процесс, не загружая полностью или не входящий или выходной XML в память самостоятельно и не создавая свой поток API.

0 голосов
/ 02 мая 2011

Я могу думать только о нескольких незначительных вещах:

  • TransformerFactory можно использовать повторно.

  • Transformer можно использовать повторно, еслион ограничен потоком, и вход XSL каждый раз одинаков.

  • Если вы можете достаточно точно оценить выходной размер, вы можете создать ByteArrayOutputStream с подсказкой начального размера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...