2012-03-22 9 views
3

템플릿 프레임 워크를 평가하려고합니다. 간단한 성능 테스트에 대한Velocity 및 Mvel과 비교하여 Stringtemplate의 성능이 낮습니다

나는 이러한 템플릿

private static String mvelTemplate = "Hello, my name is @{name}," 
            + " @foreach{user : group.users} - @{user.id} - @{user.name} " 
            + " @end{}"; 
private static String velocityTemplate = "Hello, my name is ${name}," 
             + "#foreach($user in $group.users) - ${user.id} - ${user.name} #end " ; 

private static String stringTemplate = "Hello, my name is <name>," 
             + "<group.users:{x| - <x.id> - <x.name>}> "; 
// the group has 20 users 
// 'Java' uses plain StringBuffer 

Stringtemplate의 일부가

 ST st = new ST(stringTemplate); 
     for (Map.Entry<String, Object> entry : vars.entrySet()) { 
      st.add(entry.getKey(),entry.getValue()); 
     } 

     start = System.currentTimeMillis(); 
     for (int n = 0; n < 10000; n ++) { 
      st.render(); 
     } 
     end = System.currentTimeMillis(); 

입니다 그리고 난 아무 생각이 없기 때문에 결과가

Mvel.Compiled elapsed:68ms. ~147K per second 
Velocity Cache elapsed:183ms. ~54K per second 
StringTemplate elapsed:234ms. ~42K per second 
Java elapsed:21ms. ~476K per second 

이다를 사용하고 있습니다 문자열 템플릿의 질문은 다음과 같습니다.

StringTemplate이 실제로 그렇게 느리거나 템플릿을 렌더링하는 다른 (더 빠른) 방법이 있습니다.

이 업데이트 :

가 바르은 다음과 같습니다

Map<String,Object> vars = new HashMap<String,Object>(); 
    Group g = new Group("group1"); 
    for (int i = 0; i < 20; i++) { 
     g.addUser(new User(i, "user" + i)); 
    } 

    vars.put("group", g); 
    vars.put("name", "john"); 
템플릿 당 1.000.000 반복과 지금

전체 벤치 마크 루프 10 배

당신이 무엇을
Mvel.Compiled elapsed:7056ms. ~141K per second 
Velocity Cache elapsed:18239ms. ~54K per second 
StringTemplate elapsed:22926ms. ~43K per second 
Java elapsed:2182ms. ~458K per second 
+0

안녕. group.users는 st.add (entry.getKey(), entry.getValue())를 사용하지 않습니다. 그거야? vars가 얼마나 큰가요? –

+0

vars의 크기는 2입니다. 1. 사용자가 20 명인 단일 그룹 "그룹". 및 "이름" "값"쌍 – kromit

답변

3

부분 관찰은 컴파일러 예열 문제 일 가능성이 큽니다. 테스트를 실행할 때 10000 이하를 감싸면 내 컴퓨터에서 350 밀리 초가 걸립니다. 내가 100,000 개로 늘리면 1225ms가 걸리며, 시간이 10 배나 늘어나는 것보다 3.5 배 더 많습니다. 내가 1,000,000을 돌릴 때 나는 837ms를 얻는다. 이것은 비용과 시간이 단지 10 배에 불과할 때의 7 배에 불과하다. 분명히 컴파일러는 최적화를 통해 여기서 흥미로운 것을하고 있습니다. 장기 실행 프로그램의 경우, ST가 테스트에서 더 잘할 것으로 기대합니다. 가비지 컬렉터도 여기에서 뭔가를 할 수 있습니다. 보다 큰 루프 길이로 예제를 시험해보십시오.

어쨌든 ST v4에서는 속도가 최우선 순위가 아니었지만이를 지적 해 주셔서 감사합니다. 아마 어느 시점에서 최적화를 검토 할 것입니다. 나는 프로파일 러를 실행한다고도 생각하지 않는다.

import org.stringtemplate.v4.*; 
import java.util.*; 

public class T { 
    public static class User { 
    public int id; 
    public String name; 
    public User(int id, String name) { 
     this.id= id; 
     this.name = name; 
    } 
    } 
    private static String stringTemplate = "Hello, my name is <name>," 
    + "<users:{x| - <x.id> - <x.name>}> "; 
    public static void main(String[] args) { 
    ST st = new ST(stringTemplate); 
    List<User> users = new ArrayList<User>(); 
     for (int i=1; i<=5; i++) { 
     users.add(new User(i, "bob"+i)); 
     } 
    st.add("users", users); 
    st.add("name", "tjp"); 

     long start = System.currentTimeMillis(); 
     for (int n = 0; n < 1000000; n ++) { 
      st.render(); 
     } 
     long end = System.currentTimeMillis(); 
    System.out.printf("%d ms\n", end-start); 
    } 
} 
+0

전체 main 메서드 주위에 루프를 만들려고합니다. 첫 번째 반복은 컴파일러 예열로 인해 달라질 수 있지만 다음은 항상 동일해야합니다. 템플릿 당 1000000으로 테스트를 업데이트했습니다. – kromit

+0

나는 더 나은 방법이 없을지라도 더 좋은 방법은 없을 것입니다. 당신의 일에 감사드립니다 btw! – kromit

관련 문제