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のバージョンについては何も言及していません。おそらくStringTemplate4は、バイトコードへの直接変換を伴うため、以前のバージョンよりもはるかに高速です。

一般に、パフォーマンスと保守性、読みやすさ、および再利用の間にはトレードオフがあります。StringTemplateが目的に対して十分に高速である場合、その利点は問題をはるかに上回っていると思います。

于 2011-04-28T14:49:21.233 に答える
1

anltr3.3 では StringTemplate ではなく、StringTemplate4 で ST を使用します。

于 2011-04-29T01:48:46.630 に答える