Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.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
C# 使用Roslyn从字符串创建谓词非常慢_C#_Roslyn - Fatal编程技术网

C# 使用Roslyn从字符串创建谓词非常慢

C# 使用Roslyn从字符串创建谓词非常慢,c#,roslyn,C#,Roslyn,我使用Microsoft.CodeAnalysis.CSharp.Scripting创建了一个将字符串转换为谓词的通用方法: public static Func CreatePredicate(string命令) { var options=ScriptOptions.Default.AddReferences(typeof(T).Assembly); Func predicate=CSharpScript.evaluateSync(命令,选项).Result; 返回谓词; } 问题是,这是

我使用Microsoft.CodeAnalysis.CSharp.Scripting创建了一个将字符串转换为谓词的通用方法:

public static Func CreatePredicate(string命令)
{
var options=ScriptOptions.Default.AddReferences(typeof(T).Assembly);
Func predicate=CSharpScript.evaluateSync(命令,选项).Result;
返回谓词;
}
问题是,这是非常缓慢的。生成谓词需要3-4秒

有没有办法使用Roslyn更快地将字符串转换为谓词?(我知道可以使用expression类手动创建表达式,这个问题专门针对Roslyn)

下面是一个例子:

使用系统;
使用System.Collections.Generic;
使用系统诊断;
使用System.Linq;
使用Microsoft.CodeAnalysis.CSharp.Scripting;
使用Microsoft.CodeAnalysis.Scripting;
命名空间动态clambda
{
班级计划
{
静态void Main(字符串[]参数)
{
var albums=新列表
{
新专辑{Quantity=10,Artist=“Betontod”,Title=“Revolution”},
新专辑{Quantity=50,Artist=“危险的夏天”,Title=“危险的夏天”},
新专辑{Quantity=200,Artist=“depche Mode”,Title=“Spirit”},
};
var albumFilter=“album=>album.Quantity>20&&album.Quantity<200”;
var sw=新秒表();
sw.Start();
var谓词=CreatePredicate(albumFilter);
sw.Stop();
var filteredAlbums=albums.Where(谓词).ToList();
}
公共静态Func CreatePredicate(字符串命令)
{
var options=ScriptOptions.Default.AddReferences(typeof(T).Assembly);
Func predicate=CSharpScript.evaluateSync(命令,选项).Result;
返回谓词;
}
}
公开课相册
{
公共整数数量{get;set;}
公共字符串标题{get;set;}
公共字符串艺术家{get;set;}
}
}

是预热时间(Roslyn发动机正在预热),还是如果你做两次,你会得到3+3秒?每秒做两次会好得多160ms。TBH 160ms仍然是缓慢的,但更容易接受。我打算在Web服务上运行此代码。我如何预热Roslyn以使其更快,因为我不能在请求中添加4秒,这太多了。在网站启动时(或无论它是什么),你可以编译一个表达式,例如,谢谢,我将尝试一下