RazorEngine性能研究(反射的延深)
先说下结论
1)RazorEngine 确实很慢,编译过程特别慢,编译过后仍不适合大量重复调用的情况(一次调用可以接受)。
2 ) RazorEngine 和 asp.net mvc 里的Razor 的关系目前不清楚,所以这里的结论不代表asp.net mvc慢。
3).net 4.6里的反射性能较.net 2.0 略有提升,大概反射赋值的性能由原生赋值的1/5 提升到1/4。
这里测试RazorEngine时,实现了一个对象属性赋值器:
using System.Diagnostics;
using RazorEngine;
using RazorEngine.Templating;
//脚本化的C#想写对还是有点麻烦的,还好Razor能给出有用的错误信息。
public class RazorPropertySetter<TEntity> where TEntity :class
{
string PropertyName;
bool Inited = false;
private RazorPropertySetter(){ }
public static RazorPropertySetter<TEntity> Create( string propertyName)
{
RazorPropertySetter<TEntity> rs = new RazorPropertySetter<TEntity>();
rs.PropertyName = propertyName;
return rs;
}
public void Set(TEntity entity , object value)
{
string cacheKey = entity.GetType().FullName + "--" + this.PropertyName;
DynamicViewBag viewBag = new DynamicViewBag();
viewBag.AddValue("PropertyValue", value);
if (Inited == false)
{
string template = "@{Model."+PropertyName+ "= ViewBag.PropertyValue;}";
Engine.Razor.RunCompile(template, cacheKey, typeof(TEntity), entity,viewBag);
Inited = true;
}
else
{
Engine.Razor.Run(cacheKey, typeof(TEntity), entity, viewBag);
}
}
}
//测试用类
public class TestData
{
public string Title { get; set; }
}
//测试代码
TestData data = new TestData();
data.Title = "V1";
RazorPropertySetter<TestData> setTitle = RazorPropertySetter<TestData>.Create("Title");
Stopwatch watch = new Stopwatch();
watch.Start();
setTitle.Set(data, "V00");
watch.Stop();
性能测试结果:
有时间的时候再研究下Script.net的性能。