2013-08-12 1 views
2

왜 내가 RazorEngine이 100 가지 템플릿을 분석하는 데 너무 느린 이유가 무엇이겠습니까? 나는 StringTemplate을 조사해 보았고, 비교할 두 가지 테스트를 수행했다.RazorEngine 3.3 성능을 StringTemplate4와 비교

[Test] 
    public void TestStringTemplate() 
    { 
     CsStopwatch stopwatch = new CsStopwatch(); 
     stopwatch.Start(); 
     StringBuilder sb = new StringBuilder(); 

     for (int i = 0; i < 100; i++) 
     { 
      string template = @"Hello there my name is <Name> <Surname> " + i; 
      TextParseTests.TestModel model = new TextParseTests.TestModel(); 
      model.Name = "Karl"; 
      model.Surname = "Cassar"; 

      Template t = new Template(template); 
      t.Add("Name", model.Name); 
      t.Add("Surname", model.Surname); 

      var result = t.Render(); 
      sb.AppendLine(result); 
     } 
     stopwatch.Stop(); 
     var ms = stopwatch.ElapsedMilliseconds; 
     int k = 5; 
     //109ms 
    } 

    [Test] 
    public void TestRazorEngine() 
    { 
     CsStopwatch stopwatch = new CsStopwatch(); 
     stopwatch.Start(); 
     StringBuilder sb = new StringBuilder(); 

     for (int i = 0; i < 100; i++) 
     { 
      string template = @"Hello there my name is @Model.Name @Model.Surname " + i; 
      TextParseTests.TestModel model = new TextParseTests.TestModel(); 
      model.Name = "Karl"; 
      model.Surname = "Cassar"; 


      var result = Razor.Parse(template, model); 
      sb.AppendLine(result); 
     } 
     stopwatch.Stop(); 
     var ms = stopwatch.ElapsedMilliseconds; 
     int k = 5; 
     //24000~ ms 
    } 

차이점은 엄청납니다.

  • StringTemplatev4에게을 : 109ms
  • RazorEngine 3.3 : 24,131ms

StringTemplate에 비해 200 배 이상 느리다! RazorEngine 형식을 사용하는 많은 콘텐츠가 있고 StringTemplate을 통한 RazorEngine 방식의 구문을 선호합니다. 그러나 이것은 극단적으로 매우 느립니다.

내가 잘못된 일을하고 있다면 어떤 아이디어가 있습니까? 내가 다른 템플릿을 사용하고 있습니다. RazorEngine에 캐싱을 사용하는 것처럼 (300 - 400ms까지) 더 빠르지 만 내 웹 사이트에는 다른 작은 텍스트가 많이 있습니다. 실생활 '테스트를 할 수 있습니다.

+1

을 Razor.Parse하지 비교. (C# 파서도 실행해야합니다.) – SLaks

+1

그래도 StringTemplate은 여전히 ​​조건과 표현식 리터럴을 수행합니다. 훨씬 복잡한 템플릿, 1000 회 반복은 180ms 미만에서 실행됩니다. 인상적 RazorEngine에 비해 –

답변

4

Razor.Parse는 매번 템플릿을 컴파일합니다.

이렇게해서는 안됩니다. 응용 프로그램은 서식 파일을 한 번 컴파일하거나 응용 프로그램이 실행되는 동안 서식 파일이 수정되는 경우 서식 파일이 변경 될 때마다 컴파일해야합니다.

Razor.Compile (template, name);

Razor.Run (이름, 모델)을 사용한다이 응용 프로그램에 따라

;

은 면도기가 훨씬 더 복잡한 언어이기 때문에 Razor.Run에 대한 시간이 아마

+0

이것은 꽤 오래되었고, 불행히도 이후 나는 면도기에서 StringTemplate로 전환했습니다. RazorEngine을 사용해 본 경험이있는 것보다 훨씬 빠릅니다. –

+0

성능 테스트에서 RazorEngine이 제대로 사용되면 StringTemplate이 그렇게 잘 수행되지 않을 수도 있습니다. "Razor.Parse"는 "Razor.Run"을 실행하는 것보다 훨씬 느립니다. "Razor.Parse"는 템플릿을 컴파일하고, 어셈블리를 파일 시스템에 출력하고, 파일 시스템에서 어셈블리를로드하고, 컴파일 된 템플릿의 인스턴스를 인스턴스화 한 다음 "Razor.Run"이 수행하는 작업을 수행합니다. – Mick

+0

나는 이것을 시험해 보았다. 이 답변을 실제로 차이만큼 정확하게 표시했습니다. 그러나 이것은 템플릿을 컴파일해야하는 것과 관련이 있습니다. 필자의 경우 이러한 템플릿은 사용자 지정 CMS에서 수정할 수 있습니다. StringTemplate, 컴파일이 필요없고 이러한 작업을 매우 빠르게 수행합니다. 따라서 유스 케이스의 경우에는 전환 한 것이 실제로 더 좋다고 생각합니다. 조금 더 빠르다는 것은 문제가되지 않습니다. –