StringTemplate insert = new StringTemplate("insert $table$ values($value;separator=\",\"$)");
int testSize = 10000;
for(int i=0;i<testSize;i++) {
insert.setAttribute("table", "aTable");
String[] vs = {"1", "1", "'aaa'", "'bbb'"};
for(int j = 0;j < vs.length;j++){
insert.setAttribute("value", vs[j]);
}
insert.toString();
insert.reset();
}
上面会比普通的StringBuilder大约慢5倍....
int testSize = 10000;
StringBuilder sb= new StringBuilder(100);
for(int i=0; i<testSize; i++) {
sb.append("INSERT ").append("aTable (");
String[] v = {"1", "1", "'aaa'", "'bbb'"};
for(int j=0; j<v.length; j++) {
if(j > 0) {
sb.append(",");
}
sb.append(v[j]);
}
sb.append(")");
sb.toString();
}
关于如何提高StringTemplate效率的任何想法或建议? 谢谢! StringTemplate似乎在每个令牌上调用toString(),对吗?
答案 0 :(得分:6)
我认为你不能从如此小的测试中得出有效的性能结论;它在现实世界中的表现如何?
引擎盖下StringTemplate必须做更多的工作,而不仅仅是像你一样天真地使用StringBuilder(它需要构建抽象语法树,遍历它们,渲染文本等),这可能会导致开销。您还没有提到任何关于您正在使用的StringTemplate版本的信息;据说StringTemplate 4比以前的版本快得多,部分原因是它涉及直接translation to bytecode。
通常,性能和可维护性,可读性和重用之间将存在权衡。如果StringTemplate的速度足够快,我认为它的好处远大于它的问题。
答案 1 :(得分:1)
在StringTemplate4中使用ST而不是在anltr3.3中使用StringTemplate