专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »DotNet » 函数调用:.NET各种方式调用函数性能对比 »正文

函数调用:.NET各种方式调用函数性能对比

来源: 发布时间:星期四, 2009年2月12日 浏览:130次 评论:0


using ;

using .Diagnostics;

using .Reflection;

using .Reflection.Emit;

using .Runtime.CompilerServices;



public CallTest

{

public delegate AddDelegate( x);



public erface IAdd

{

add( i);

}



public addClass : IAdd

{

[MethodImpl(MethodImplOptions.NoInlining)]

public add( i)

{

i + 1;

}



[MethodImpl(MethodImplOptions.NoInlining)]

public _add( x)

{

x + 1;

}

}



public MethodInfo addMethodInfo

{

AssemblyName asmName = AssemblyName;

asmName.Name = "DynamicAssembly";



AssemblyBuilder asmBuilder = AppDo.CurrentDo.DefineDynamicAssembly(asmName, AssemblyBuilderAccess.Run);

ModuleBuilder modBuilder = asmBuilder.DefineDynamicModule("DynamicModule");



MethodBuilder funBuilder = modBuilder.DefineGlobalMethod("add", MethodAttributes.Public | MethodAttributes.Static, typeof(), Type[1] { typeof() });

ILGenerator il = funBuilder.GetILGenerator;



il.Emit(OpCodes.Ldarg_0);

il.Emit(OpCodes.Ldc_I4_1);

il.Emit(OpCodes.Add);

il.Emit(OpCodes.Ret);



il.Emit(OpCodes.Ret);

modBuilder.CreateGlobalFunctions;

MethodInfo method = modBuilder.GetMethod("add");

method;

}



public DynamicMethod addDynamicMethod

{

DynamicMethod dm = DynamicMethod("add", typeof(), Type { typeof() });

ILGenerator il = dm.GetILGenerator;

il.Emit(OpCodes.Ldarg_0);

il.Emit(OpCodes.Ldc_I4_1);

il.Emit(OpCodes.Add);

il.Emit(OpCodes.Ret);

dm;

}



public IAdd addInterface

{

Type baseType = typeof(IAdd);



//创建动态

AssemblyName asmName = AssemblyName("add.assembly");

AssemblyBuilder assembly = AppDo.CurrentDo.DefineDynamicAssembly(asmName, AssemblyBuilderAccess.Run);



//创建动态模块

ModuleBuilder module = assembly.DefineDynamicModule("add.module");



//创建类型 MyClass

TypeBuilder type = module.DefineType("MyClass", TypeAttributes.Class, typeof(Object), Type { baseType });



//创建思路方法

MethodAttributes attribute = baseType.GetMethod("add").Attributes & ~(MethodAttributes.Abstract);

MethodBuilder method = type.DefineMethod("add", attribute, typeof(), Type[1] { typeof() });

ILGenerator il = method.GetILGenerator;



il = method.GetILGenerator;

il.Emit(OpCodes.Ldarg_1);

il.Emit(OpCodes.Ldc_I4_1);

il.Emit(OpCodes.Add);

il.Emit(OpCodes.Ret);



// 显式接口思路方法需要定义 Override而普通实现不需要

type.DefineMethodOverride(method, baseType.GetMethod("add"));



// 创建类型 MyClass

Type myClass = type.CreateType;

object o = Activator.CreateInstance(myClass);

IAdd iadd = o as IAdd;

iadd;



}



void Main( args)

{

const TIMES = 100000000;

Stopwatch time = Stopwatch;



time.Start;

for ( i = 0; i < TIMES; )

i;

time.Stop;

Console.WriteLine("直接执行时间:" + time.ElapsedMilliseconds);



time.Start;

for ( i = 0; i < TIMES; )

i = addClass._add(i);

time.Stop;

Console.WriteLine("静态执行时间:" + time.ElapsedMilliseconds);



time.Start;

addClass add = addClass;

for ( i = 0; i < TIMES; )

i = add.add(i);

time.Stop;

Console.WriteLine("成员执行时间:" + time.ElapsedMilliseconds);



AddDelegate AddDelegate = AddDelegate(addClass._add);

time.Start;

for ( i = 0; i < TIMES; )

i = AddDelegate(i);

time.Stop;

Console.WriteLine("静态思路方法delegate执行时间:" + time.ElapsedMilliseconds);



time.Start;

IAdd iadd = addClass;

for ( i = 0; i < TIMES; )

i = iadd.add(i);

time.Stop;

Console.WriteLine("接口执行时间:" + time.ElapsedMilliseconds);



MethodInfo addMethod = addMethodInfo;

time.Start;

for ( i = 0; i < TIMES / 100; )

i = ()addMethod.Invoke(null, object[1] { i });

time.Stop;

Console.WriteLine("反射Invoke执行时间:" + time.ElapsedMilliseconds * 100);



DynamicMethod dynamicMethod = addDynamicMethod;

time.Start;

for ( i = 0; i < TIMES / 100; )

i = ()dynamicMethod.Invoke(null, object[1] { i });

time.Stop;

Console.WriteLine("DynamicMethod.Invoke执行时间:" + time.ElapsedMilliseconds * 100);



AddDelegate dynamicAddDelegate = (AddDelegate)dynamicMethod.CreateDelegate(typeof(AddDelegate));

time.Start;

for ( i = 0; i < TIMES; )

i = dynamicAddDelegate(i);

time.Stop;

Console.WriteLine("DynamicMethod生成delegate执行时间:" + time.ElapsedMilliseconds);



IAdd dynamicIAdd = addInterface;

time.Start;

for ( i = 0; i < TIMES; )

i = dynamicIAdd.add(i);

time.Stop;

Console.WriteLine("emit生成erface执行时间:" + time.ElapsedMilliseconds);



Console.ReadLine;

}

}

using ;

using .Diagnostics;

using .Reflection;

using .Reflection.Emit;

using .Runtime.CompilerServices;



public CallTest

{

public delegate AddDelegate( x);



public erface IAdd

{

add( i);

}



public addClass : IAdd

{

[MethodImpl(MethodImplOptions.NoInlining)]

public add( i)

{

i + 1;

}



[MethodImpl(MethodImplOptions.NoInlining)]

public _add( x)

{

x + 1;

}

}



public MethodInfo addMethodInfo

{

AssemblyName asmName = AssemblyName;

asmName.Name = "DynamicAssembly";



AssemblyBuilder asmBuilder = AppDo.CurrentDo.DefineDynamicAssembly(asmName, AssemblyBuilderAccess.Run);

ModuleBuilder modBuilder = asmBuilder.DefineDynamicModule("DynamicModule");



MethodBuilder funBuilder = modBuilder.DefineGlobalMethod("add", MethodAttributes.Public | MethodAttributes.Static, typeof(), Type[1] { typeof() });

ILGenerator il = funBuilder.GetILGenerator;



il.Emit(OpCodes.Ldarg_0);

il.Emit(OpCodes.Ldc_I4_1);

il.Emit(OpCodes.Add);

il.Emit(OpCodes.Ret);



il.Emit(OpCodes.Ret);

modBuilder.CreateGlobalFunctions;

MethodInfo method = modBuilder.GetMethod("add");

method;

}



public DynamicMethod addDynamicMethod

{

DynamicMethod dm = DynamicMethod("add", typeof(), Type { typeof() });

ILGenerator il = dm.GetILGenerator;

il.Emit(OpCodes.Ldarg_0);

il.Emit(OpCodes.Ldc_I4_1);

il.Emit(OpCodes.Add);

il.Emit(OpCodes.Ret);

dm;

}



public IAdd addInterface

{

Type baseType = typeof(IAdd);



//创建动态

AssemblyName asmName = AssemblyName("add.assembly");

AssemblyBuilder assembly = AppDo.CurrentDo.DefineDynamicAssembly(asmName, AssemblyBuilderAccess.Run);



//创建动态模块

ModuleBuilder module = assembly.DefineDynamicModule("add.module");



//创建类型 MyClass

TypeBuilder type = module.DefineType("MyClass", TypeAttributes.Class, typeof(Object), Type { baseType });



//创建思路方法

MethodAttributes attribute = baseType.GetMethod("add").Attributes & ~(MethodAttributes.Abstract);

MethodBuilder method = type.DefineMethod("add", attribute, typeof(), Type[1] { typeof() });

ILGenerator il = method.GetILGenerator;



il = method.GetILGenerator;

il.Emit(OpCodes.Ldarg_1);

il.Emit(OpCodes.Ldc_I4_1);

il.Emit(OpCodes.Add);

il.Emit(OpCodes.Ret);



// 显式接口思路方法需要定义 Override而普通实现不需要

type.DefineMethodOverride(method, baseType.GetMethod("add"));



// 创建类型 MyClass

Type myClass = type.CreateType;

object o = Activator.CreateInstance(myClass);

IAdd iadd = o as IAdd;

iadd;



}



void Main( args)

{

const TIMES = 100000000;

Stopwatch time = Stopwatch;



time.Start;

for ( i = 0; i < TIMES; )

i;

time.Stop;

Console.WriteLine("直接执行时间:" + time.ElapsedMilliseconds);



time.Start;

for ( i = 0; i < TIMES; )

i = addClass._add(i);

time.Stop;

Console.WriteLine("静态执行时间:" + time.ElapsedMilliseconds);



time.Start;

addClass add = addClass;

for ( i = 0; i < TIMES; )

i = add.add(i);

time.Stop;

Console.WriteLine("成员执行时间:" + time.ElapsedMilliseconds);



AddDelegate AddDelegate = AddDelegate(addClass._add);

time.Start;

for ( i = 0; i < TIMES; )

i = AddDelegate(i);

time.Stop;

Console.WriteLine("静态思路方法delegate执行时间:" + time.ElapsedMilliseconds);



time.Start;

IAdd iadd = addClass;

for ( i = 0; i < TIMES; )

i = iadd.add(i);

time.Stop;

Console.WriteLine("接口执行时间:" + time.ElapsedMilliseconds);



MethodInfo addMethod = addMethodInfo;

time.Start;

for ( i = 0; i < TIMES / 100; )

i = ()addMethod.Invoke(null, object[1] { i });

time.Stop;

Console.WriteLine("反射Invoke执行时间:" + time.ElapsedMilliseconds * 100);



DynamicMethod dynamicMethod = addDynamicMethod;

time.Start;

for ( i = 0; i < TIMES / 100; )

i = ()dynamicMethod.Invoke(null, object[1] { i });

time.Stop;

Console.WriteLine("DynamicMethod.Invoke执行时间:" + time.ElapsedMilliseconds * 100);



AddDelegate dynamicAddDelegate = (AddDelegate)dynamicMethod.CreateDelegate(typeof(AddDelegate));

time.Start;

for ( i = 0; i < TIMES; )

i = dynamicAddDelegate(i);

time.Stop;

Console.WriteLine("DynamicMethod生成delegate执行时间:" + time.ElapsedMilliseconds);



IAdd dynamicIAdd = addInterface;

time.Start;

for ( i = 0; i < TIMES; )

i = dynamicIAdd.add(i);

time.Stop;

Console.WriteLine("emit生成erface执行时间:" + time.ElapsedMilliseconds);



Console.ReadLine;

}

}
以下是我电脑执行结果:
直接执行时间:105
静态执行时间:475
成员执行时间:844
静态思路方法delegate执行时间:1480
接口执行时间:2008
反射Invoke执行时间:434000
DynamicMethod.Invoke执行时间:914600
DynamicMethod生成delegate执行时间:9674
emit生成erface执行时间:10202
0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: