Мы используем Apache Velocity для динамических шаблонов. На данный момент Velocity имеет следующие методы оценки / замены:
public static boolean evaluate(Context context, Writer writer, String logTag, Reader reader)
public static boolean evaluate(Context context, Writer out, String logTag, String instring)
Мы используем эти методы, предоставляя StringWriter
для записи результатов оценки. Наши входящие данные поступают в формате StringBuilder
, поэтому мы используем StringBuilder.toString
и передаем их как instring
.
Проблема в том, что наши шаблоны довольно велики (в редких случаях они могут быть мегабайтами, десятками мс), замены происходят очень часто, и каждая операция замены утраивает объем необходимой памяти (входящие данные + StringBuilder.toString()
, которая создает новую копию + исходящие данные).
Мне было интересно, есть ли способ улучшить это. Например. если бы я мог найти способ предоставить Reader
и Writer
поверх того же экземпляра StringBuilder
, который использует только дополнительную память для различий ввода / вывода, это был бы хороший подход? Кто-нибудь делал что-нибудь подобное и мог бы поделиться источником для такого класса? Или, может быть, есть более эффективные решения данной проблемы?