Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Razor 与StringTemplate4相比,RazoEngine 3.3的性能令人震惊_Razor_Stringtemplate_Stringtemplate 4 - Fatal编程技术网

Razor 与StringTemplate4相比,RazoEngine 3.3的性能令人震惊

Razor 与StringTemplate4相比,RazoEngine 3.3的性能令人震惊,razor,stringtemplate,stringtemplate-4,Razor,Stringtemplate,Stringtemplate 4,有什么原因或者我做错了什么,为什么RazorEngine在解析100个不同的模板时那么慢?我正在查看StringTemplate,并执行了两个测试进行比较,如下所示 [Test] public void TestStringTemplate() { CsStopwatch stopwatch = new CsStopwatch(); stopwatch.Start(); StringBuilder sb = new Stri

有什么原因或者我做错了什么,为什么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
    }
[测试]
公共void TestStringTemplate()
{
CsStopwatch秒表=新CsStopwatch();
秒表。开始();
StringBuilder sb=新的StringBuilder();
对于(int i=0;i<100;i++)
{
字符串模板=@“你好,我的名字是”+i;
TextParseTests.TestModel=新建TextParseTests.TestModel();
model.Name=“卡尔”;
model.name=“Cassar”;
模板t=新模板(模板);
t、 添加(“名称”,型号名称);
t、 添加(“姓氏”,型号。姓氏);
var result=t.Render();
(结果);
}
秒表;
var ms=秒表。延时百万秒;
int k=5;
//109ms
}
[测试]
公共无效测试Razorengine()
{
CsStopwatch秒表=新CsStopwatch();
秒表。开始();
StringBuilder sb=新的StringBuilder();
对于(int i=0;i<100;i++)
{
字符串模板=@“您好,我的名字是@Model.name@Model.name”+i;
TextParseTests.TestModel=新建TextParseTests.TestModel();
model.Name=“卡尔”;
model.name=“Cassar”;
var result=Razor.Parse(模板、模型);
(结果);
}
秒表;
var ms=秒表。延时百万秒;
int k=5;
//24000~ms
}
差别是惊人的

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


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

Razor.Parse每次都会编译模板

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

编译(模板、名称)

接下来,您的应用程序应该使用

Razor.Run(名称、型号)


将时间与Razor进行比较。不要运行Razor.Parse

Razor.Parse每次都会编译模板

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

编译(模板、名称)

接下来,您的应用程序应该使用

Razor.Run(名称、型号)


将时间与Razor.Run not Razor.Parse进行比较可能是因为Razor是一种复杂得多的语言。(它也必须运行C#解析器)是的,但StringTemplate仍然执行条件和表达式文本。一个非常复杂的模板,在不到180ms的时间内运行1000次迭代。与Razore相比,Razor令人印象深刻,因为Razor是一种复杂得多的语言。(它也必须运行C#解析器)是的,但StringTemplate仍然执行条件和表达式文本。一个非常复杂的模板,在不到180ms的时间内运行1000次迭代。与RazorEngineThis相比令人印象深刻这是相当古老的,不幸的是,我已经从Razor切换到StringTemplate。它比我在RazorEngine上体验过的任何东西都要快。我想在性能测试中,你可能会发现StringTemplate在正确使用的情况下与RazorEngine相比并没有那么好的表现。“Razor.Parse”比运行“Razor.Run”慢一个数量级。“Razor.Parse”编译模板,将程序集输出到文件系统,从文件系统加载程序集,实例化已编译模板的实例,然后执行“Razor.Run”所做的操作。我已经尝试过了。我认为这个答案是正确的,因为它确实起了作用。但是,这需要编译模板。在我的例子中,这些模板可以从自定义CMS修改。StringTemplate,不需要编译,执行此类任务的速度仍然非常快。所以对于我的用例,我仍然认为现在我已经切换了,它实际上更好了。速度稍微快一点并不是问题——速度确实慢了很多。这已经很老了,不幸的是,我从Razor切换到了StringTemplate。它比我在RazorEngine上体验过的任何东西都要快。我想在性能测试中,你可能会发现StringTemplate在正确使用的情况下与RazorEngine相比并没有那么好的表现。“Razor.Parse”比运行“Razor.Run”慢一个数量级。“Razor.Parse”编译模板,将程序集输出到文件系统,从文件系统加载程序集,实例化已编译模板的实例,然后执行“Razor.Run”所做的操作。我已经尝试过了。我认为这个答案是正确的,因为它确实起了作用。但是,这需要编译模板。在我的例子中,这些模板可以从自定义CMS修改。StringTemplate,不需要编译,执行此类任务的速度仍然非常快。所以对于我的用例,我仍然认为现在我已经切换了,它实际上更好了。速度稍微快一点并不是问题——速度确实慢了很多。