Activator.CreateInstance(Type type)方法创建对象和Expression Tree创建对象性能的比较(终结版)...

本文通过代码实测,比较了直接实例化、表达式树和Activator.CreateInstance三种创建对象方式的性能。结果显示,直接实例化最快,表达式树次之,Activator.CreateInstance最慢。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  这应该是这个文章的最终版本了,期间犯了不少错误,也学习到了不少东西。

  不多说了,直接上代码。还是我最后的测试结果,代码很简单,不解释了。

 1              Stopwatch watch1  =   new  Stopwatch();
 2 
 3              watch1.Start();
 4               for  ( int  i  =   0 ; i  <   1000000 ; i ++ )
 5              {
 6                  Activator.CreateInstance( typeof (Class1));
 7              }
 8 
 9              watch1.Stop();
10              Console.WriteLine( " Activator.CreateInstance " );
11              Console.WriteLine(watch1.Elapsed.ToString());
12 
13              watch1.Reset();
14              watch1.Start();
15               for  ( int  i  =   0 ; i  <   1000000 ; i ++ )
16              {
17                  GetCache.InstanceCacheEx.InstanceCache( typeof (Class1));
18              }
19              watch1.Stop();
20              Console.WriteLine( " Expression.CreateInstanceEx " );
21              Console.WriteLine(watch1.Elapsed.ToString());
22 
23 
24              watch1.Reset();
25              watch1.Start();
26               for  ( int  i  =   0 ; i  <   1000000 ; i ++ )
27              {
28                   new  Class1();
29              }
30              watch1.Stop();
31              Console.WriteLine( " Direct CreateInstance " );
32              Console.WriteLine(watch1.Elapsed.ToString());

 

表达式树构建和缓存:

 1       public   class  InstanceCachesEx
 2      {
 3           private  Dictionary < Type, Func < object >>  dicEx  =   new  Dictionary < Type, Func < object >> ();
 4           public   object  InstanceCache(Type key)
 5          {
 6 
 7              Func < object >  value  =   null ;
 8 
 9               if  (dicEx.TryGetValue(key,  out  value))
10              {
11                   return  value();
12              }
13               else
14              {
15                  value  =  CreateInstance(key);
16                  dicEx[key]  =  value;
17                   return  value();
18              }
19          }
20 
21           static  Func < object >  CreateInstance(Type type)
22          {
23              NewExpression newExp  =  Expression.New(type);
24              Expression < Func < object >>  lambdaExp  =  Expression.Lambda < Func < object >> (newExp,  null );
25              Func < object >  func  =  lambdaExp.Compile();
26               return  func;
27          }
28      }
29 
30       public   static   class  GetCache
31      {
32           static  GetCache()
33          {
34              InstanceCacheEx  =   new  InstanceCachesEx();
35          }
36 
37           public   static  InstanceCachesEx InstanceCacheEx {  get set ; }
38      }

 

测试结果:

Activator.CreateInstance:
00 : 00 : 00.2221068
Expression.CreateInstanceEx:
00 : 00 : 00.0845797
Direct CreateInstance
00 : 00 : 00.0071313

 

之所以这么测试,是因为Activator.CreateInstance()方法使用了缓存机制,所以对于表达式树创建对象也使用了缓存,没有新东西,只是一个总结而已。至于为什么Activator.CreateInstance方法创建对象比用表达式创建对象要慢, 您可以看这篇文章(友情提示:或许评论能带给你更多的东西呦)

转载于:https://www.cnblogs.com/WillMeng/archive/2009/12/08/Expression-Tree-Activator-Final.html

### 使用 `System.Activator.CreateInstance` 方法创建 MATLAB 实例失败的解决方案 当尝试通过 C# 调用 MATLAB 并使用 `System.Activator.CreateInstance` 创建 MATLAB 应用程序实例时,可能会遇到各种问题。以下是详细的解决方案: #### 1. 确认 MATLAB 安装路径配置正确 确保环境变量中已包含 MATLAB 的安装路径,并且可以在命令提示符下成功启动 MATLAB。 ```csharp // 获取 MATLAB 类型并创建实例 try { Type matlabAppType = System.Type.GetTypeFromProgID("Matlab.Application"); var matlab = System.Activator.CreateInstance(matlabAppType) as MLApp.MLApp; } catch (Exception ex) { Console.WriteLine($"Error creating instance: {ex.Message}"); } ``` 如果在此过程中抛出异常,则可能是由于未找到 COM 组件或权限不足等问题引起[^1]。 #### 2. 验证 .NET Framework MATLAB 版本兼容性 确认所使用的 .NET Framework 版本与 MATLAB 支持的版本相匹配。不同版本之间可能存在不兼容的情况,这可能导致无法正常加载类型库或初始化组件。 #### 3. 设置应用程序平台目标 对于某些情况下的互操作问题,可能需要设置项目的平台目标为 x86 或 AnyCPU(取决于具体需求)。右键单击项目属性 -> 构建选项卡 -> 将 "首选 32 位" 勾选取消,并选择适当的目标 CPU 架构。 #### 4. 添加必要的引用支持文件 除了直接调用外,还可以考虑将 MATLAB 编译成 DLL 文件供其他语言调用。不过需要注意的是,这种方式有时会因为依赖关系复杂而导致难以调试的问题。可以先测试简单的函数调用来验证连接是否稳定[^3]。 #### 5. 捕获更详细的错误信息 为了更好地理解为什么会出现 “类型初始值设定项引发异常”,建议捕获完整的堆栈跟踪日志以便进一步分析原因所在。可以通过自定义异常处理逻辑来实现这一点。 ```csharp catch (TargetInvocationException tie) { Console.WriteLine(tie.InnerException?.Message ?? "Unknown error occurred."); } ``` 以上措施有助于排查解决问题,使能够顺利地利用 `Activator.CreateInstance` 来创建 MATLAB 对象实例。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值