三种方式实例化一个类的性能情况

源内容:http://www.cnblogs.com/shouce/p/5558095.html#undefined

下面的内容是根据“源内容”进行了整改、补充。

三种方式实例化一类,包括无参数构造形式与有参数构造形式性能测试

  1. 使用new关键字创建类实例(常用方式)。
  2. 使用Activator激活器类创建类实例(Activator用以在本地或从远程创建对象类型,或获取对现有远程对象的引用)。
  3. 使用Assembly程序集创建类实例(Assembly表示一个程序集,它是一个可重用、无版本冲突并且可自我描述的公共语言运行库应用程序构造块。该类可以加载程序集、浏览程序集的元数据和构成部分、发现程序集中包含的类型以及创建这些类型的实例)。

测试环境:

  1) Visual studio 2015 Community

  2) Windows 10 Profession

  3) Memory 6G,CPU Inter-Core-i3-3220 @ 3.3GHz

测试代码如下,分别为接口、接口实现类、实例化类的创建、执行测试方法

/// <summary>
/// 职业、行业
/// </summary>
public interface IProfession
{
    string Name { get; }
    string MostMeaningThing();
}
/// <summary>
/// 工人、蓝领
/// </summary>
public class Worker : IProfession
{
    public Worker(string name)
    {
        Name = name;
    }

    public Worker()
    {

    }

    public string Name { get; private set; }

    public string MostMeaningThing()
    {
        return "挖掘机哪家强山东找蓝翔";
    }
}
public class InstanceClass
{
    //可根据自己的项目名称进行修改
    private string className = "TestProblem.Worker";
    //执行次数
    private int time = 100000;
    /// <summary>
    /// 是否执行有参数构造函数
    /// </summary>
    private bool hasParameters;

    public InstanceClass(bool hasParameters)
    {
        this.hasParameters = hasParameters;
    }

    /// <summary>
    /// 通过new关键字创建
    /// </summary>
    public void CreateByNew()
    {
        IProfession profession;
        Stopwatch watch = new Stopwatch();
        watch.Start();
        for (int i = 0; i < time; i++)
        {
            profession = hasParameters ? new Worker("工人-New-" + i) : new Worker();
        }
        watch.Stop();
        Console.Write(watch.ElapsedMilliseconds.ToString().PadLeft(5));

    }
    /// <summary>
    /// 通过Activator控制类创建
    /// </summary>
    public void CreateByActivator()
    {
        Type type = Type.GetType(className);
        IProfession profession;
        Stopwatch watch = new Stopwatch();
        watch.Start();
        for (int i = 0; i < time; i++)
        {
            object obj = hasParameters ? Activator.CreateInstance(type, "工人-Activator-" + i) : Activator.CreateInstance(type);
            profession = obj as IProfession;
        }
        watch.Stop();
        Console.Write(watch.ElapsedMilliseconds.ToString().PadLeft(5));
    }
    /// <summary>
    /// 通过Assembly控制类创建
    /// </summary>
    public void CreateByAssembly()
    {
        Assembly assembly = Assembly.GetAssembly(Type.GetType(className));
        IProfession profession;
        Stopwatch watch = new Stopwatch();
        watch.Start();
        for (int i = 0; i < time; i++)
        {
            object obj = hasParameters ?
                assembly.CreateInstance(className, true, BindingFlags.Default, null, new object[] { "工人-Assembly-" + i }, CultureInfo.CurrentCulture, null)
                : assembly.CreateInstance(className);
            profession = obj as IProfession;
        }
        watch.Stop();
        Console.Write(watch.ElapsedMilliseconds.ToString().PadLeft(5));
    }
    /// <summary>
    /// For循环,替代代码中多次手写类似的For循环代码
    /// </summary>
    /// <param name="time">循环次数</param>
    /// <param name="action">委托</param>
    public static void ForLoop(int time, Action<int> action)
    {
        for (int i = 0; i < time; i++)
        {
            action(i);
        }
    }
    /// <summary>
    /// For循环,封装For循环代码执行
    /// </summary>
    /// <param name="time">循环次数</param>
    /// <param name="action">委托,函数指针</param>
    public static void ForLoop(int time, Action action)
    {
        for (int i = 0; i < time; i++)
        {
            action();
        }
    }
}
/// <summary>
/// 执行十次的十万个创建类实例
/// </summary>
private static void ExecuteLakh()
{
    bool hasParameters = true;
    Console.WriteLine("实例化一个类({0}参数构造)的性能比较(单位:毫秒)", hasParameters ? "有" : "无");
    Console.Write("\t\t\t");
    InstanceClass.ForLoop(10, i => Console.Write("{0:G}", (i + 1).ToString().PadLeft(5)));
    Console.WriteLine();
    InstanceClass instanceClass = new InstanceClass(hasParameters);
    Console.Write("CreateByNew".PadRight(24));
    InstanceClass.ForLoop(10, () => instanceClass.CreateByNew());
    Console.WriteLine();
    Console.Write("CreateByActivator".PadRight(24));
    InstanceClass.ForLoop(10, () => instanceClass.CreateByActivator());
    Console.WriteLine();
    Console.Write("CreateByAssembly".PadRight(24));
    InstanceClass.ForLoop(10, () => instanceClass.CreateByAssembly());
    Console.WriteLine();
}

测试结果如下:

时间: 2024-07-31 05:46:26

三种方式实例化一个类的性能情况的相关文章

.NET C# 三种实例化一个类的方式的性能比较

本文内容 实例化一个类的方式 用 New 关键字实例化一个类 用 Activator 实例化一个类 用 Assembly 实例化一个类 性能比较 环境 比较 分析 代码 在开发应用程序时,能够动态实例化一个类很有用.给出类的一个字符串名称,就能够创建这个类的一个实例.若这些需要实例化的类都继承同一个接口(如本例的 IPerson),那么实例化的 object 类型转换后可以赋值给这个接口.这很方便.否则,就得用 swtich-case 语句(估计会很长). 那么,接下来的问题,实例化一个类的性能

Servlet实现的三种方式

实现Servlet的三种方式:一个实现,两个继承 /*========================================== * servlet的执行过程: * 1.创建servlet对象(Tomcat执行) * 2.第一次访问servlet时执行 * init()方法 该方法只执行一次 * service()方法 * 3.之后每访问一次 就执行一次service()方法 * 4.关闭服务时调用destroy()方法 该方法只执行一次 *servlet的服务周期 *1.创建 *2.

Java Class类以及获取Class实例的三种方式

T - 由此 Class 对象建模的类的类型.例如,String.class 的类型是Class<String>.如果将被建模的类未知,则使用Class<?>. [java] view plain copy print? public final class Class<T> extends Object  implements java.io.Serializable, java.lang.reflect.GenericDeclaration, java.lang.r

spring学习(02)之bean实例化的三种方式

bean实体例化的三种方式 在spring中有三中实例化bean的方式: 一.使用构造器实例化:(通常使用的一个方法,重点) 二.使用静态工厂方法实例化: 三.使用实例化工厂方法实例化 第一种.使用构造器实例化: 这种实例化的方式可能在我们平时的开发中用到的是最多的,因为在xml文件中配置简单并且也不需要额外的工厂类来实现. 比如 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="h

Spring bean管理器 bean实例化的三种方式

bean实例化的三种方式实现 第一种:使用类的无参数构造方法创建(常用 重要) 第一种实例化方式最常用,实例化类时会通过调用无参构造方法创建.示例代码如下: package spring.com.UserService; public class UserService { public UserService() { //该方法是无参方法 } public void AddUser(){ System.out.println("Add........................."

数组的三种方式总结、 多维数组的遍历及 Arrays类的常用方法总结

一.数组的三种方式总结 1.创建数组 Java语言使用new操作符来创建数组,语法如下: arrayRefVar = new dataType[arraySize]; 上面的语法语句做了两件事: 一.使用 dataType[arraySize] 创建了一个数组. 二.把新创建的数组的引用赋值给变量 arrayRefVar. 数组变量的声明,和创建数组可以用一条语句完成,如下所示: dataType[] arrayRefVar = new dataType[arraySize]; 另外,你还可以使

5.struts2中Action类中获取ServletAPI的三种方式

**Servlet的API的访问(开发中偶尔会使用到)** 1.在Action类中也可以获取到Servlet一些常用的API,有如下三种方式获取 * 完全解耦合的方式 * 使用接口注入的方式 * 使用ServletActionContext中静态方法直接访问Servlet的API * 需求:提供JSP的表单页面的数据,在Action中使用Servlet的API接收到,然后保存到三个域对象中,最后再显示到JSP的页面上. * 提供JSP注册的页面,演示下面这三种方式: <h3>注册页面</

头像截图上传三种方式之一(一个简单易用的flash插件)(asp.net版本)

flash中有版权声明,不适合商业开发.这是官网地址:http://www.hdfu.net/ 本文参考了http://blog.csdn.net/yafei450225664/article/details/12855915     并且加入了自己的解析,以供之后的参考. 官网提供的demo包,包含了php,jsp,asp,aspx的demo. 1.Demo中,avatar.swf是执行上传的flash文件:default.jpg是默认显示的图片:demo.html是demo,可以直接复制里面

js对象实例化的常见三种方式

三种常见模式:工厂模式,构造函数模式,原型模式 <span style="font-size:18px;"><!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Object</title> </head> <body> <h1>创建对象常见的