0
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() ,对吗?

4

2 回答 2

6

我认为您无法从如此小的测试中得出有效的性能结论;它在现实世界的使用中表现如何?

在幕后,StringTemplate 必须做更多的工作,而不仅仅是像您所做的那样天真地使用 StringBuilder(它需要构建抽象语法树、遍历它们、渲染文本等),这可能会增加开销。您没有提及您正在使用的 StringTemplate 版本;据说 StringTemplate 4 比以前的版本快得多,部分原因是它涉及直接转换为 bytecode

一般来说,性能和可维护性、可读性和重用性之间会有一个折衷。如果 StringTemplate 对于您的目的足够快,我认为它的好处远远超过它的问题。

于 2011-04-28T14:49:21.233 回答
1

在 StringTemplate4 中使用 ST 而不是在 anltr3.3 中使用 StringTemplate

于 2011-04-29T01:48:46.630 回答