.NET C# 三种实例化一个类的方式的性能比较
2012-07-01 17:27
495 查看
本文内容
实例化一个类的方式用 New 关键字实例化一个类
用 Activator 实例化一个类
用 Assembly 实例化一个类
性能比较
环境
比较
分析
代码
在开发应用程序时,能够动态实例化一个类很有用。给出类的一个字符串名称,就能够创建这个类的一个实例。若这些需要实例化的类都继承同一个接口(如本例的 IPerson),那么实例化的 object 类型转换后可以赋值给这个接口。这很方便。否则,就得用 swtich-case 语句(估计会很长)。
那么,接下来的问题,实例化一个类的性能如何。
之前,我用 Assembly 较多,写本文后,发觉好像不妥。
实例化一个类的方式
用 New 关键字实例化一个类New 关键字用于创建对象和调用构造函数。是实例化一个类最常见的方式。
用 Activator 实例化一个类
Activator 用以在本地或从远程创建对象类型,或获取对现有远程对象的引用。其 CreateInstance 方法创建在程序集中定义的类型的实例。
用 Assembly 实例化一个类
Assembly 表示一个程序集,它是一个可重用、无版本冲突并且可自我描述的公共语言运行库应用程序构造块。该类可以加载程序集、浏览程序集的元数据和构成部分、发现程序集中包含的类型以及创建这些类型的实例。
加载程序集的推荐方式是使用 Load 方法。GetType 方法可用于在程序集中搜索特定类型。CreateInstance 方法可用于在程序集中搜索和创建类型的实例。
本文通过这三种方式来创建一个类的实例。
性能比较
环境 VS 2008 .NET Framework 3.5Intel CPU Duo T5450 1.66GHz
Memory 2G
比较 假设,Demo 中使用的类都在同一个程序集。
[code] [code]using System;
namespace InstancePerformance
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("实例化一个类的性能比较(单位:毫秒)");
Console.Write(" ");
for (int i = 1; i <= 10; i++)
Console.Write("{0:G}", i.ToString().PadLeft(5));
Console.Write("\n");
// New Key
Console.Write("InstanceByNew".PadRight(20));
for (int i = 1; i <= 10; i++)
InstanceByNewKey.Create();
Console.Write("\n");
// Activator
Console.Write("InstanceByActivator".PadRight(20));
for (int i = 1; i <= 10; i++)
InstanceByActivator.Create();
Console.Write("\n");
// Assembly
Console.Write("InstanceByAssembly".PadRight(20));
for (int i = 1; i <= 10; i++)
InstanceByAssembly.Create();
Console.Write("\n");
Console.ReadKey();
}
}
}
[/code]
[/code]
其中,
InstanceByNewKey.Create() 用 New 关键字实例化一个类;
InstanceByActivator.Create() 用 Activator 实例化一个类;
InstanceByAssembly.Create() 用 Assembly 实例化一个类。
在“代码”小节是这三个方法的实现代码。
为了便于测试,时间不至于小得可怜,以上每个方法实例化十万次,也就是创建十万个对象。
为了便于比较,对以上每个方法都调用 10 次。进行横向和纵向比较。
分析
由上图可以看出,用 Activator 实例化一个类最快;其次是用 New 关键字;最慢的是用 Assembly 实例化。Activator 比 用 New 都快。
因此,若想动态实例化一个类,根据你的实际情况,尽量将需要实例化的类放在同一个程序集。
代码
代码段 1:IPerson 接口和 Person 类
[code] [code]public class IPerson
{
}
[/code]
[/code]
[code] [code]public class Person : IPerson
{
public string Name { get; set; }
public Person()
{
}
public Person(string name)
{
this.Name = name;
}
}
[/code]
[/code]
代码段 2:使用 New 关键字实例化
[code] [code]public class InstanceByNewKey
{
/// <summary>
/// 直接调用
/// </summary>
public static void Create()
{
IPerson person = null;
Stopwatch watch = new Stopwatch();
watch.Start();
for (int i = 0; i < 100000; i++)
person = new Person("My" + i);
watch.Stop();
Console.Write(watch.ElapsedMilliseconds.ToString().PadLeft(5));
}
}
[/code]
[/code]
另外,若该代码段写成如下,是没有必要的。其他代码段类似。
[code] [code]Stopwatch watch = new Stopwatch();
watch.Start();
for (int i = 0; i < 100000; i++)
IPerson person = new Person("My" + i);
watch.Stop();
Console.Write(watch.ElapsedMilliseconds.ToString().PadLeft(5));
[/code]
[/code]
代码段 3:使用 Activator 实例化
[code] [code]public class InstanceByActivator
{
/// <summary>
/// 实例化反射
/// </summary>
public static void Create()
{
Type type = Type.GetType("InstancePerformance.Person");
IPerson person = null;
Stopwatch watch = new Stopwatch();
watch.Start();
for (int i = 0; i < 100000; i++)
{
object obj = Activator.CreateInstance(type);
person = obj as IPerson;
}
watch.Stop();
Console.Write(watch.ElapsedMilliseconds.ToString().PadLeft(5));
}
}
[/code]
[/code]
代码段 4:使用 Assembly 实例化
[code] [code]public class InstanceByNewKey
{
/// <summary>
/// 直接调用
/// </summary>
public static void Create()
{
IPerson person = null;
Stopwatch watch = new Stopwatch();
watch.Start();
for (int i = 0; i < 100000; i++)
person = new Person("My" + i);
watch.Stop();
Console.Write(watch.ElapsedMilliseconds.ToString().PadLeft(5));
}
}
[/code]
[/code]
下载 Demo
相关文章推荐
- 程序三种与数据库打交道的方式性能及安全性比较
- C#中字符串转换整型方法(三种方式的比较)
- sqlserver三种分页方式性能比较
- ASP.NET文件下载各种方式比较:对性能的影响、对大文件的支持、对断点续传和多线程下载的支持
- qlserver三种分页方式性能比较
- C#、VB.NET、C++.NET中的按引用传递参数的方式比较
- ASP.NET文件下载各种方式比较:对性能的影响、对大文件的支持、对断点续传和多线程下载的支持
- C#.NET禁止一个程序启动多个实例
- C#读取Excel的三种方式以及比较分析
- js replace 全局替换 以表单的方式提交参数 判断是否为ie浏览器 将jquery.qqFace.js表情转换成微信的字符码 手机端省市区联动 新字体引用本地运行可以获得,放到服务器上报404 C#提取html中的汉字 MVC几种找不到资源的解决方式 使用Windows服务定时去执行一个方法的三种方式
- 头像截图上传三种方式之一(一个简单易用的flash插件)(asp.net版本)
- 浅谈JS中的三种字符串连接方式及其性能比较
- iOS Dev (42) 三种定位方式的性能比较
- C#读取Excel的三种方式以及比较
- java三种实例对象方式性能比拼
- C#.NET禁止一个程序启动多个实例
- 一个 C# .NET 2.0 HTTP GET 方式访问类
- ADO.NET 中 DataReader 各种读取方式性能比较/测试
- 关于-c#字符串三种逆转方法及性能比较的另外看法
- C#.NET禁止一个程序启动多个实例