2

是否有任何原因或我做错了什么,为什么 RazorEngine 仅解析 100 个不同的模板就这么慢?我正在研究 StringTemplate,并执行了两个测试以进行比较,如下所示。

    [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
    }

差异是惊人的。

  • 字符串模板 4:109 毫秒
  • RazorEngine 3.324,131 毫秒

这比 StringTemplate 慢 200 多倍!我有很多使用 RazorEngine 格式的内容,我更喜欢 RazorEngine 的语法而不是 StringTemplate。但是,这是非常非常缓慢的。

如果我做错了什么,有什么想法吗?请注意,我故意使用不同的模板,就像我对 RazorEngine 使用缓存一样,它的速度更快(低至 300 - 400 毫秒),但我的网站有很多不同的小文本,这是最“真实的”我可以做的生活测试。

4

1 回答 1

5

Razor.Parse 每次都会编译模板。

你不应该这样做。您的应用程序应该编译一次模板,或者如果在应用程序运行时修改模板,则在模板更改时编译。

Razor.Compile(模板,名称);

在此之后,您的应用程序应该使用

Razor.Run(名称,型号);

将时间与 Razor.Run 而非 Razor.Parse 进行比较

于 2014-02-14T03:30:23.097 回答