一直以为在开发阶段能够直接调用的,速度而言一定是最优秀的,因为总比后期通过反射之类来调用来得快吧.

下面请看一个SB的例子,重新编译以后,这个类在创建100,000,000实体时居然耗费了16秒的时间:

	internal class CreateWithNew<T> : EntityCreator<T> where T : new()
{
public override T Create()
{
return new T();
}
}//此SB相当荣幸的以为这个调用速度一定是最快的,怎么的也是编译级别的吧

  

奶奶的,居然还不如之前的解决方案:(创建100,000,000实体约4秒)

			/// <summary>
/// 根据参数的类型,创建一个句柄,这个句柄可以根据对应的参数列表创建指定的实例
/// </summary>
/// <param name="parameterTypes">参数类型列表</param>
/// <returns>用于创建实例的句柄</returns>
private static Func<object[], TType> GenerateCreateInstanceHandler(Type[] parameterTypes)
{
Type type = typeof(TType);
if (type.IsSealed && type.IsAbstract)
{
throw new NotSupportedException(string.Concat("不支持用于创建静态类型的实例:", Reflector.GetTypeName(type)));
}
if (type.IsArray || type.IsEnum || type.IsGenericTypeDefinition || type.IsGenericParameter)
{
throw new NotSupportedException(string.Concat("不支持用于创建数组,枚举,泛型定义,泛型参数的实例:", Reflector.GetTypeName(type)));
}
if (type.IsNotPublic && (type.IsInterface || type.IsAbstract))
{
throw new NotSupportedException(string.Concat("不支持用于创建非公开的接口及抽象类型的实例:", Reflector.GetTypeName(type)));
}
//if (type.IsAbstract || type.IsInterface)
//{
// TypeFactory factory = TypeFactory.Create(type);
// factory.ImplementBase();
// type = factory.CreateType();
//}
ConstructorInfo constructor = Reflector.GetConstructor(type, parameterTypes);
DynamicMethodFactory<Func<object[], TType>> method = DynamicMethodFactory<Func<object[], TType>>.Create("CreateInstance"); /*
* If found match constructor, then invoke it.
* Else if found any constructor, use default parameters.
*/ MethodInfo convert =
new Func<object[], int, object>(GetParameter<object>).Method.GetGenericMethodDefinition(); if (constructor != null)
{
#region Use a match constructor to create a new instance ParameterInfo[] parameters = constructor.GetParameters();
if (type.IsClass)
{
int len = parameterTypes.Length;
for (int i = 0; i < len; i++)
{
ParameterInfo p = parameters[i];
method.LoadArg(0).Load(i);
method.Call(convert.MakeGenericMethod(p.ParameterType));
}
method.New(constructor).Return();
}
else
{
LocalBuilder result = method.Declare(type);
method.LoadVarAddr(result);
int len = parameterTypes.Length;
for (int i = 0; i < len; i++)
{
ParameterInfo p = parameters[i];
method.LoadArg(0).Load(i);
method.Call(convert.MakeGenericMethod(p.ParameterType));
}
method.Call(constructor);
method.LoadVar(result).Return();
} #endregion
}
else
{
method.LoadDefault<TType>().Return();
}
return method.Delegation;
}

  

奶奶的 ,抽象类居然被委托打败了,我很想学着穿越小说里面的SB配角大喊一声:怎么可能

于是开始分析,我X他娘的,居然发现NEW()被解释成了这个,他妈的这还不如直接反射算了

System.Activator.CreateInstance()

于是果断修改成这样:

						if (con.IsPublic && type.IsPublic)
{
Type parent = typeof (EntityCreator<T>);
TypeFactory factory = TypeFactory.Create(parent);
factory.DefineOverride(parent.GetMethod("Create"), m =>
{
m.New(con).Return();
});
Type creator = factory.CreateType();
Createor = Reflector.CreateInstanceAs<EntityCreator<T>>(creator);
}
else
{
Createor = new CreateWithPrivateNew<T>();
}

  

接下来表现如何?

2.6秒!!!

OK,我心里平衡了.

new的原罪的更多相关文章

  1. [react] 细数 React 的原罪

    Props & onChange 的原罪 .「props & onChange 接口规范」它不是一个典型的「程序接口规范」. 当你拿到一个可视组件的 ref,却没有类似 setProp ...

  2. [转帖][分享] 关于系统DIY--by 原罪

    http://wuyou.net/forum.php?mod=viewthread&tid=399277&extra=page%3D1 前几天我发了一个帖子<Windows组件w ...

  3. Python踩坑之旅其二裸用os.system的原罪

    目录 1.1 踩坑案例 1.2 填坑解法 1.3 坑位分析 1.4.1 技术关键字 1.5 填坑总结 2. 前坑回顾 2.1 Linux中, 子进程拷贝父进程哪些信息 2.2 Agent常驻进程选择& ...

  4. <把时间当做朋友>读书笔记

    这本书我早就看过,还想再来一遍 开始这一行动是看李萌在朋友圈晒101计划,每天健身,读书半小时之类的,我也想做点啥,那就每天睡前读书半小时吧,怎么坚持下去呢? 我不想晒到朋友圈里,那就晒给玉玉看吧, ...

  5. codeforces 731C(DFS)

    题目链接:http://codeforces.com/contest/731/problem/C 题意:有n只袜子(1~n),k种颜色(1~k),在m天中,左脚穿下标为l,右脚穿下标为r的袜子,问最少 ...

  6. Java学习笔记:控制反转

    控制反转(Ioc)模式(又称DI:Dependency Injection)就是Inversion of Control,控制反转.在Java开发中,IoC意味着将你设计好的类交给系统去控制,而不是在 ...

  7. 形象化的spring 依赖注入原理

      转. IoC就是Inversion of Control,控制反转.在Java开发中,IoC意味着将你设计好的类交给系统去控制,而不是在你的类内部控制.这称为控制反转. 下面我们以几个例子来说明什 ...

  8. 【jquery】幻灯片效果

    闲着无聊,用Jquery写了一个幻灯片效果. 我这人喜欢造轮子,除了jquery这种有强大开发团队的框架级别JS,其实的一些小程序都是尽量自己写. 一是因为怕出问题了没人问,二是自己写的改起来也方便. ...

  9. 聊聊JS与设计模式之(工厂Factory)篇------(麦当劳的故事)

    一,总体概要 1,笔者浅谈 说起设计模式其实并不是什么很新奇的概念,它也不是基于特定语言所形成的产物,它是基于软件设计原则以及相关的方法论和经过特定时期衍生出的若干解决方案.本文会以一个实例带入大家学 ...

随机推荐

  1. secure boot(安全启动)下为内核模块签名

    上一篇随笔中提到了如何在secure boot下安装Nvidia显卡驱动 >>上一篇随笔 如果不需要安装Nvidia显卡驱动,而且要生成密钥,可以参考>> 这篇文章 这里假设生 ...

  2. NSURLCache详解和使用

    使用缓存的目的是为了使应用程序能更快速的响应用户输入,是程序高效的运行.有时候我们需要将远程web服务器获取的数据缓存起来,以空间换取时间,减少对同一个url多次请求,减轻服务器的压力,优化客户端网络 ...

  3. Java 如何跳出多重嵌套循环体?

    1. 在最外层循环语句前定义一个标号,循环体内任意位置都可以使用带有标号的break语句跳出外层循环,结束整个循环. System.out.println("MainClass1 Start ...

  4. chrome浏览器开发者工具之同步修改至本地

    相信好多小伙伴喜爱webpack的热加载技术,省时而又不繁琐,讨厌F5或者Ctrl+F5. 嘿嘿,现在介绍大家一个在浏览器中修改直接同步到本地代码修改的方法--- (程序员都是从0开始数数的!) 第0 ...

  5. [z]查表空间使用情况

    SELECT UPPER(F.TABLESPACE_NAME) "表空间名",D.TOT_GROOTTE_MB "表空间大小(M)",D.TOT_GROOTTE ...

  6. Nginx-->基础-->理论-->002:Nginx进程介绍

    一.Nginx进程介绍

  7. C++中数据对齐

    大体看了看数据对齐,不知道是否正确,总结如下: struct A { char name; double dHeight; int age; }; sizeof(A) = (1+7+8+4+4) =  ...

  8. MVC中获取模型属性的Range和StringLength验证特性设置

    MVC中的客户端及服务端模型验证信息都以ModelMetadata类型作为承载,在获得属性的ModelMetadata之后(还不知道怎么获取ModelMetadata的童鞋请自行恶补),我们可以轻松得 ...

  9. 用keras的cnn做人脸分类

    keras介绍 Keras是一个简约,高度模块化的神经网络库.采用Python / Theano开发. 使用Keras如果你需要一个深度学习库: 可以很容易和快速实现原型(通过总模块化,极简主义,和可 ...

  10. Linux系统编程温故知新系列 --- 01

    1.大端法与小端法 大端法:按照从最高有效字节到最低有效字节的顺序存储,称为大端法 小端法:按照从最低有效字节到最高有效字节的顺序存储,称为小端法 网际协议使用大端字节序来传送TCP分节中的多字节整数 ...