Could you hire me? Contact me if you like what I’ve done in this article and think I can create value for your company with my skills.

May 17, 2010 / by Zsolt Soczó

Dynamic sebesség újra

Hogy ne a levegőbe beszéljek:

using System;
using System.Diagnostics;
using System.Reflection;

namespace DynamicTypeTest
{
class Program
{
static void Main(string[] args)
{
object target = “alma”;
object arg = “m”;

string a2 = (string)arg;

Stopwatch w = Stopwatch.StartNew();

const int callNumber = 1000 * 1000;
for (int i = 0; i < callNumber; i++) { Type[] argTypes = new Type[] { typeof(string) }; MethodInfo mi = target.GetType().GetMethod("Contains", argTypes); object[] oa = new object[] { a2 }; bool b = (bool)mi.Invoke(target, oa); } w.Stop(); Console.WriteLine("Reflection hívási idő: {0}", w.Elapsed); double elapsedTickForReflection = w.ElapsedTicks; w.Restart(); for (int i = 0; i < callNumber; i++) { bool b = ((dynamic)target).Contains(a2); } w.Stop(); Console.WriteLine("Dynamic hívási idő: {0}", w.Elapsed); Console.WriteLine("A dynamic {0}x gyorsabb volt.", elapsedTickForReflection / w.ElapsedTicks); } } } [/source] [source='C'] Reflection hívási idő: 00:00:02.5393161 Dynamic hívási idő: 00:00:00.2049100 A dynamic 12.3923444658829x gyorsabb volt. [/source] Ha ügyesebbek vagyunk, és kivesszük a ciklusból a reflection előkészítését: [source='C#'] using System; using System.Diagnostics; using System.Reflection; namespace DynamicTypeTest { class Program { static void Main(string[] args) { object target = "alma"; object arg = "m"; string a2 = (string)arg; Stopwatch w = Stopwatch.StartNew(); Type[] argTypes = new Type[] { typeof(string) }; MethodInfo mi = target.GetType().GetMethod("Contains", argTypes); object[] oa = new object[] { a2 }; const int callNumber = 1000 * 1000; for (int i = 0; i < callNumber; i++) { bool b = (bool)mi.Invoke(target, oa); } w.Stop(); Console.WriteLine("Reflection hívási idő: {0}", w.Elapsed); double elapsedTickForReflection = w.ElapsedTicks; w.Restart(); for (int i = 0; i < callNumber; i++) { bool b = ((dynamic)target).Contains(a2); } w.Stop(); Console.WriteLine("Dynamic hívási idő: {0}", w.Elapsed); Console.WriteLine("A dynamic {0}x gyorsabb volt.", elapsedTickForReflection / w.ElapsedTicks); } } } [/source] [source='C'] Reflection hívási idő: 00:00:01.2058747 Dynamic hívási idő: 00:00:00.2044023 A dynamic 5.89951388765798x gyorsabb volt. [/source] Jó ez, szeretjük, pedig nem is COMolunk.

Could you hire me? Contact me if you like what I’ve done in this article and think I can create value for your company with my skills.

LEAVE A COMMENT

2 COMMENTS

  • Zoli May 19, 2011

    Hali,

    Ez érdekes, nekem pont ellentétes eredmény jött ki.
    Van ötleted?

    Üdv,
    Zoli

  • Soczó Zsolt May 19, 2011

    Ugyanezzel a kóddal?