Stringtemplate низкая производительность по сравнению с Velocity и Mvel
Я пытаюсь сделать некоторую оценку шаблонов фреймворков.
Для простого теста производительности я использую эти шаблоны
private static String mvelTemplate = "Hello, my name is @{name},"
+ " @foreach{user : group.users} - @{user.id} - @{user.name} "
+ " @end{}";
private static String velocityTemplate = "Hello, my name is ${name},"
+ "#foreach($user in $group.users) - ${user.id} - ${user.name} #end " ;
private static String stringTemplate = "Hello, my name is <name>,"
+ "<group.users:{x| - <x.id> - <x.name>}> ";
// the group has 20 users
// 'Java' uses plain StringBuffer
Часть Stringtemplate является
ST st = new ST(stringTemplate);
for (Map.Entry<String, Object> entry : vars.entrySet()) {
st.add(entry.getKey(),entry.getValue());
}
start = System.currentTimeMillis();
for (int n = 0; n < 10000; n ++) {
st.render();
}
end = System.currentTimeMillis();
И результаты
Mvel.Compiled elapsed:68ms. ~147K per second
Velocity Cache elapsed:183ms. ~54K per second
StringTemplate elapsed:234ms. ~42K per second
Java elapsed:21ms. ~476K per second
Поскольку я понятия не имею о шаблоне строки, вот мой вопрос:
Является ли StringTemplate действительно таким медленным или есть другой (более быстрый) способ визуализации шаблона с ним.
Обновить:
Vars выглядит так:
Map<String,Object> vars = new HashMap<String,Object>();
Group g = new Group("group1");
for (int i = 0; i < 20; i++) {
g.addUser(new User(i, "user" + i));
}
vars.put("group", g);
vars.put("name", "john");
теперь с 1.000.000 итераций на шаблон и циклическим тестированием 10 раз
Mvel.Compiled elapsed:7056ms. ~141K per second
Velocity Cache elapsed:18239ms. ~54K per second
StringTemplate elapsed:22926ms. ~43K per second
Java elapsed:2182ms. ~458K per second
1 ответ
Часть того, что вы наблюдаете, скорее всего, проблема с прогревом компилятора. Когда я запускаю тест, я прилагаю ниже 10000, это занимает 350 мс на моем компьютере. когда я увеличился до 100 000, это заняло 1225 мс, что всего в 3,5 раза больше, а не в 10 раз больше. когда я запускаю его 1 000 000, я получаю 8397 мс, что примерно в 7 раз больше стоимости и времени, когда оно должно быть в 10 раз. Очевидно, что компилятор делает что-то интересное с оптимизацией. Для длительной программы я бы ожидал, что ST будет лучше в ваших тестах. Сборщик мусора тоже может что-то здесь делать. Попробуйте свои примеры с большей длиной цикла.
Во всяком случае, скорость не была моей первоочередной задачей с ST v4, но спасибо за указание на это. Я, вероятно, посмотрю на оптимизацию в какой-то момент. Я не думаю, что у меня даже есть профилировщик.
import org.stringtemplate.v4.*;
import java.util.*;
public class T {
public static class User {
public int id;
public String name;
public User(int id, String name) {
this.id= id;
this.name = name;
}
}
private static String stringTemplate = "Hello, my name is <name>,"
+ "<users:{x| - <x.id> - <x.name>}> ";
public static void main(String[] args) {
ST st = new ST(stringTemplate);
List<User> users = new ArrayList<User>();
for (int i=1; i<=5; i++) {
users.add(new User(i, "bob"+i));
}
st.add("users", users);
st.add("name", "tjp");
long start = System.currentTimeMillis();
for (int n = 0; n < 1000000; n ++) {
st.render();
}
long end = System.currentTimeMillis();
System.out.printf("%d ms\n", end-start);
}
}