c# - 带参数调用类时的C#反射性能比较
问题描述
我听说过很多关于 Linq Expression 性能的信息。但自己无法检查。请查看下一个 .NET Core 应用示例:
class Program
{
static void Main(string[] args)
{
var classType = Type.GetType("ConsoleApp1.TestClass");
var classConstructor = classType.GetConstructor(new[] { typeof(string) });
//var param = Expression.Parameter(typeof(string));
//var newExpression = Expression.New(classConstructor, param);
//LambdaExpression lambda = Expression.Lambda(newExpression, param);
//var compiled = lambda.Compile();
//var instance = compiled.DynamicInvoke("test");
//var instance = Activator.CreateInstance(classType, "test");
//var instance = classConstructor.Invoke(new object[] { "test" });
Console.ReadLine();
}
}
class TestClass
{
public TestClass(string param)
{
}
}
当我在未注释 Expression 版本的情况下运行此代码时,代码的运行速度会慢 10 倍。请告知可能出现的问题或符合预期。
解决方案
一个简单的基准测试显示了有趣的结果。持续时间以毫秒为单位。
我只是想分享我得到的结果。似乎 DynamicInvoke 确实有很大的开销(正如@ivan-stoev 指出的那样)
我将为.Invoke
具有强类型 lambda 的解决方案和 Roslyn 编译的具体类添加结果,该类实现一个简单的实例化接口。
ConstructorInfo
被缓存,编译的 lambda 表达式也是如此。
每次 1000 万次迭代:(每个方法 1 亿次实例化)
---------------------------------------------------------------------------
Benchmark Results:
---------------------------------------------------------------------------
Activator Constructor Compiled Lambda
---------------------------------------------------------------------------
Totals : 8121.2488 3067.6226 9353.8141
Average: 0.00081212488 0.00030676226 0.00093538141
Maximum: 922.5987 450.7662 1046.3734
Minimum: 0 0 0
---------------------------------------------------------------------------
推荐阅读
- drupal - GraphQl 查询与 gatsby-source-drupal 没有关系的节点图像 url
- twincat - 如何确定在给定持续时间内事件的最大第 n 次发生?
- python - 在 pandas 数据框中组合具有相似值范围的行
- javascript - 使用 NodeJS API 调用上传 MP4 时 Azure 视频索引器停止
- html - 为什么超链接在 asp.net gridview 的前几行中不起作用
- linux - Docker(撰写):没有 sudo 的连接被拒绝
- excel - 通过在excel中自动为单元格着色来创建一个矩形
- r - 我如何使用 R 中的给定格式从 chr 转到 dttm
- c# - 从 Zendesk 获取票证并插入 SQL
- mql4 - 具有自定义指标问题的 Metatrader 4 专家顾问