Note that there are some explanatory texts on larger screens.

plurals
  1. POWhy subsequent direct method call is much faster than the first call?
    primarykey
    data
    text
    <p>As is explained in <a href="http://msdn.microsoft.com/en-us/magazine/cc163759.aspx">this MSDN article</a>, when one uses .NET Reflection API such as <code>InvokeMember</code>, the first call takes much more time to run than the subsequent calls because of caching of metadata.</p> <p>When I tested the direct method call without using Reflection, I also see the similar effect both on Mono and .NET 4. </p> <p>The first number is the result of the operation, and the second number after '-' is the time spent for this operation in ms. I used '&lt;--' mark to identify the first method call.</p> <pre><code>300 - 0.192 &lt;-- 300 - 0.004 300 - 0.004 -100 - 0.096 &lt;-- -100 - 0.004 -100 - 0.004 </code></pre> <p>Why is this? I can understand that the first call can be slower, but 50x slower is not what I expected. </p> <p>Attached is the source code to get this result.</p> <h3>library</h3> <pre><code>namespace MyClass { public class Calculator { public int Value1 {get; set;} public int Value2 {get; set;} public Calculator() { Value1 = 100; Value2 = 200; } public int Add(int val1, int val2) { Value1 = val1; Value2 = val2; return Value1 + Value2; } public int Sub(int val1, int val2) { Value1 = val1; Value2 = val2; return Value1 - Value2; } } } </code></pre> <h3>Code to call this library</h3> <pre><code>// http://msdn.microsoft.com/en-us/magazine/cc163759.aspx using System; using System.IO; using System.Reflection; using System.Diagnostics; using System.Collections.Generic; using MyClass; class TestOne { static void DirectTest() { Stopwatch sw; Calculator t = new Calculator(); sw = Stopwatch.StartNew(); int value1 = t.Add(100,200); sw.Stop(); double time1 = sw.Elapsed.TotalMilliseconds; sw = Stopwatch.StartNew(); int value2 = t.Add(100,200); sw.Stop(); double time2 = sw.Elapsed.TotalMilliseconds; sw = Stopwatch.StartNew(); int value3 = t.Add(100,200); sw.Stop(); double time3 = sw.Elapsed.TotalMilliseconds; Console.WriteLine("{0} - {1}", value1, time1); Console.WriteLine("{0} - {1}", value2, time2); Console.WriteLine("{0} - {1}", value3, time3); sw = Stopwatch.StartNew(); value1 = t.Sub(100,200); sw.Stop(); time1 = sw.Elapsed.TotalMilliseconds; sw = Stopwatch.StartNew(); value2 = t.Sub(100,200); sw.Stop(); time2 = sw.Elapsed.TotalMilliseconds; sw = Stopwatch.StartNew(); value3 = t.Sub(100,200); sw.Stop(); time3 = sw.Elapsed.TotalMilliseconds; Console.WriteLine("{0} - {1}", value1, time1); Console.WriteLine("{0} - {1}", value2, time2); Console.WriteLine("{0} - {1}", value3, time3); } static void Main() { DirectTest(); DirectTest(); } } </code></pre>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload