不同方式呼叫函式的效能對比

2021-04-18 17:27:06 字數 2424 閱讀 8814

using system;

using system.diagnostics;

using system.reflection;

using system.reflection.emit;

using system.runtime.compilerservices;

public class calltest

public class addclass : iadd

[methodimpl(methodimploptions.noinlining)]

public static int static_add(int x)

}public static methodinfo addmethodinfo()

);ilgenerator il = funbuilder.getilgenerator();

il.emit(opcodes.ldarg_0);

il.emit(opcodes.ldc_i4_1);

il.emit(opcodes.add);

il.emit(opcodes.ret);

modbuilder.createglobalfunctions();

methodinfo method = modbuilder.getmethod("add");

return method;

}public static dynamicmethod adddynamicmethod()

);ilgenerator il = dm.getilgenerator();

il.emit(opcodes.ldarg_0);

il.emit(opcodes.ldc_i4_1);

il.emit(opcodes.add);

il.emit(opcodes.ret);

return dm;

}public static iadd addinte***ce()

);//建立方法

methodattributes attribute = basetype.getmethod("add").attributes & ~(methodattributes.abstract);

methodbuilder method = type.definemethod("add", attribute, typeof(int), new type[1] );

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;

return iadd;

}static void main(string args)

);time.stop();

dynamicmethod dynamicmethod = adddynamicmethod();

time.reset();

time.start();

for (int i = 0; i < times / 100; )

i = (int)dynamicmethod.invoke(null, new object[1] );

time.stop();

adddelegate dynamicadddelegate = (adddelegate)dynamicmethod.createdelegate(typeof(adddelegate));

time.reset();

time.start();

for (int i = 0; i < times; )

i = dynamicadddelegate(i);

time.stop();

iadd dynamiciadd = addinte***ce();

time.reset();

time.start();

for (int i = 0; i < times; )

i = dynamiciadd.add(i);

time.stop();

console.readline();

}}

函式直接呼叫與反射效能對比

最近發現反射甚是好用,但是效能差距有多大呢。實驗環境是win8.1 64位系統,jre8,i7 4770cpu,8g記憶體。方法很簡單,對於乙個類,分別使用直接呼叫和函式反射的方式呼叫同乙個函式,看執行時間,時間使用system.currenttimemillis 函式僅申請乙個int型區域性變數並...

Vue元件間呼叫的理解 效能對比。

元件間的互動大概有這幾種情況 1.父子間的互動 watch,props,emit,這幾個屬性,可以涵蓋父子元件間的互動。父頁面中 menu aside元件的載入要隨著頁面的projectid的變動而變動,這時候,在menu aside元件中用props屬性接收父傳來的projectid,並用watc...

Delphi 函式傳遞引數的不同方式

在delphi過程 函式中傳遞引數幾個修飾符為const var out。另一種不加修飾符的為預設按值傳遞引數。一 預設方式以值方式傳遞引數 procedure tform1.procnormal value string begin orignum value me lblreturn.capti...