StringTemplate медленнее, чем простая конкатенация строк?

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() для каждого токена, верно?


person rayeaster    schedule 28.04.2011    source источник
comment
Вам нужно лучше описать вопрос. Вы ожидаете, что мы выполним код, рассчитаем время и предоставим данные, чтобы сказать нам, в чем на самом деле заключается ваш вопрос? Вместо этого расскажите нам, что вы видите в результате этих тестов, чего вы ожидали и, возможно, свою гипотезу о причине разницы.   -  person Lasse V. Karlsen    schedule 28.04.2011
comment
Например, давайте начнем с того, что это за язык/среда выполнения? Что такое StringTemplate (поскольку у вас его вообще нет в коде). Когда вы говорите какие-либо идеи или предложения?, тогда мой вопрос о чем? В основном... какой у вас вопрос?   -  person Lasse V. Karlsen    schedule 28.04.2011
comment
@ Лассе В. Карлсен: вы совершенно правы. Теперь я более четко поднимаю свой вопрос.   -  person rayeaster    schedule 28.04.2011


Ответы (2)


Я не думаю, что вы можете сделать правильные выводы о производительности из такого небольшого теста; как это работает в реальном мире?

Под капотом StringTemplate приходится делать гораздо больше работы, чем просто наивно использовать StringBuilder, как это сделали вы (он должен создавать абстрактные синтаксические деревья, проходить их, отображать текст и т. д.), что, вероятно, способствует накладным расходам. Вы ничего не упомянули о том, какую версию StringTemplate вы используете; предположительно StringTemplate 4 намного быстрее, чем предыдущие версии, отчасти потому, что он включает прямое перевод в байт-код.

В общем, будет компромисс между производительностью и ремонтопригодностью, удобочитаемостью и повторным использованием. Если StringTemplate достаточно быстр для ваших целей, я думаю, что его преимущества намного перевешивают его недостатки.

person I82Much    schedule 28.04.2011
comment
ваши комментарии звучат великолепно! спасибо! - person rayeaster; 28.04.2011
comment
Я повторяю вышеописанный простой тест, используя ST в StringTemplate4, а не StringTemplate в anltr. Это очень быстро! Спасибо! - person rayeaster; 29.04.2011

Используйте ST в StringTemplate4, а не StringTemplate в anltr3.3.

person rayeaster    schedule 29.04.2011