我有一個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);
}
}
通常情況下,您的CreateDelegate不會在內部循環中,但是,對嗎? – antlersoft 2012-03-13 20:39:35
當我執行WCF服務的負載測試時,它在內部循環中是有效的。 – 2012-03-13 20:40:44
@AidanRyan,你可以嘗試不止一次地調用你的Main方法嗎? (將您的Main重命名爲Main2並在循環中寫入新的Main Main Main2)。 – 2012-03-13 21:35:07