kro*_*mit 5 java velocity template-engine stringtemplate 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
Run Code Online (Sandbox Code Playgroud)
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();
Run Code Online (Sandbox Code Playgroud)
结果是
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
Run Code Online (Sandbox Code Playgroud)
由于我不知道字符串模板,这是我的问题:
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");
Run Code Online (Sandbox Code Playgroud)
现在每个模板有 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
Run Code Online (Sandbox Code Playgroud)
您观察到的部分情况可能是编译器预热问题。当我运行低于 10000 的测试时,在我的计算机上需要 350 毫秒。当我增加到 100,000 时,需要 1225 毫秒,这只是 3.5 倍的时间,而不是 10 倍的时间。当我运行 1,000,000 次时,我得到 8397ms,这大约是成本和时间的 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);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4305 次 |
| 最近记录: |