2011-04-28 53 views
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(); 
} 

以上會慢於大約5倍以下普通的StringBuilder ....StringTemplate比純字符串連接慢嗎?

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(),對吧?

+1

您需要更好地描述這個問題。你是否期望我們執行代碼,計時,並提出數據來告訴我們你的問題究竟是什麼?相反,告訴我們你從這些測試中看到了什麼,你期望什麼,以及可能你對於差異原因的假設。 – 2011-04-28 10:06:48

+1

例如,我們先從哪個語言/運行時開始?什麼是StringTemplate(因爲你根本沒有在代碼中)當你說「有任何想法或建議?」時,那麼我的問題是「關於什麼?」基本上...... **你的問題是什麼**? – 2011-04-28 10:07:48

+0

@ Lasse V. Karlsen:你完全正確。現在我更清楚地提出我的問題。 – rayeaster 2011-04-28 11:51:37

回答

6

我不認爲你可以從這麼小的測試中得出有效的性能結論;它如何在現實世界的使用中發揮作用?

底下StringTemplate必須做更多的工作,而不是像你一樣天真地使用StringBuilder(它需要構造抽象語法樹,走它們,渲染文本等),這可能會導致開銷。你沒有提到你正在使用什麼版本的StringTemplate;據推測,StringTemplate 4比以前的版本要快得多,部分原因是它涉及到直接translation to bytecode

一般來說,性能和可維護性,可讀性和重用性之間會有一個折衷。如果StringTemplate足夠滿足您的需求,我認爲它的好處遠大於它的問題。

+0

您的評論聽起來不錯!謝謝! – rayeaster 2011-04-28 15:11:40

+1

我在StringTemplate4中使用ST進行簡單測試,而不是在anltr中使用StringTemplate。它太快了!謝謝! – rayeaster 2011-04-29 01:46:40

1

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