2012-03-13 82 views
2

我有一個WCF服務,它的數據層使用LINQ to SQL。只有存儲過程正在使用中,沒有動態表訪問。當我定位到x64時,我獲得了x86構建的一半吞吐量。我追溯到Reflection.Emit.DynamicMethod.CreateDelegate的熱門路線。我創建了一個簡單的測試項目來演示兩個平臺之間的性能差異。爲什麼DynamicMethod在x64上慢得多?

什麼是DynamicMethod在x64上慢得多的具體解釋?我的模糊認識是,在x64上可能會有DynamicInvoke涉及額外的thunk。


下面是結果@ 1.60 GHz的Windows上執行7企業版x64,酷睿i7 Q720時,單線程:

Build Target  Average milliseconds to execute 100,000 iterations 
x86    5504 
x64    14699 
Any CPU   14789 

並測試代碼:

class Program 
{ 
    private delegate string XInvoker(string arg); 

    private const int OUTER_ITERATIONS = 4; 
    private const int INNER_ITERATIONS = 100000; 

    static void Main(string[] args) 
    { 
     Console.WriteLine("Timing {0} iterations, repeat {1} times...", INNER_ITERATIONS, OUTER_ITERATIONS); 

     var watch = new Stopwatch(); 
     long totalMs = 0; 

     for (int outer = 0; outer < OUTER_ITERATIONS; outer++) 
     { 
      watch.Restart(); 

      for (int inner = 0; inner < INNER_ITERATIONS; inner++) 
      { 
       var method = new DynamicMethod("X", typeof(string), new[] { typeof(string) }); 

       var ilGen = method.GetILGenerator(); 
       ilGen.Emit(OpCodes.Ldarg_0); 
       ilGen.Emit(OpCodes.Ret); 

       var del = method.CreateDelegate(typeof(XInvoker)); 
       var blah = del.DynamicInvoke("blah"); 
      } 

      watch.Stop(); 
      totalMs += watch.ElapsedMilliseconds; 

      Console.WriteLine("Took {0} ms to iterate {1} times", watch.ElapsedMilliseconds, INNER_ITERATIONS); 
     } 

     Console.WriteLine(); 
     Console.WriteLine("Overall average: {0} ms to iterate {1} times", totalMs/OUTER_ITERATIONS, INNER_ITERATIONS); 
    } 
} 
+0

通常情況下,您的CreateDelegate不會在內部循環中,但是,對嗎? – antlersoft 2012-03-13 20:39:35

+0

當我執行WCF服務的負載測試時,它在內部循環中是有效的。 – 2012-03-13 20:40:44

+0

@AidanRyan,你可以嘗試不止一次地調用你的Main方法嗎? (將您的Main重命名爲Main2並在循環中寫入新的Main Main Main2)。 – 2012-03-13 21:35:07

回答

1

我會猜測這跟編譯速度有關。有很多線程似乎表明JIT編譯x64比x86顯着慢。

在這種情況下,有人看到他們的x64 JIT顯着的性能提高,僅僅是因爲其他相關程序集沒有NGEN'd。雖然我懷疑它會在這種情況下有所幫助,但你永遠不知道它試圖加載的其他東西可能會減慢它的速度。也許嘗試在答案中運行命令,看看是否會改變你的表現。 WPF slow to start on x64 in .NET Framework 4.0

相關問題