2008-12-20 32 views
0

方法調用是否真的很慢,或者我的電腦有問題嗎?慢速方法調用

static void Main(string[] args) { 
    Stopwatch sw = new Stopwatch(); sw.Start(); 
    for (int i = 0; i < 10000000; i++) { 
     double z = Math.Pow(i,2); 
    } 
    Console.WriteLine(sw.ElapsedMilliseconds); 
    sw = Stopwatch.StartNew(); 
    for (int i = 0; i < 10000000; i++) { 
     Noop(); 
    } 
    Console.WriteLine(sw.ElapsedMilliseconds); 
} 

static void Noop() { } 

第一環路需要1600至1700年毫秒,而第二環路需要3100 - 3200毫秒在我的系統(賽揚d 2.53 GHz的512 MB RAM的Windows XP SP3 .NET 3.5)。 這是一個命令行項目。我用VB.Net得到了類似的結果。

編輯:我想我找到了答案。

回答

4

1723 13這是否更像您所期望的?

是的,這就是我所期望的。我沒有在調試模式下運行(調試模式給我1900/3200)。在IDE打開或關閉的情況下運行它,我會得到相同的結果。使用csc或使用ngen install不會改變結果。 我想我應該重新安裝.net框架。

編輯:

感謝您的答案。
重新安裝框架並未解決問題。在用虛擬機測試後,我得到了有意義的結果。我終於發現問題:
前段時間我安裝了一個名爲ProfileSharp的探查器。我不知道在沒有我的授權的情況下Profiler在做什麼(或爲什麼),但從我卸載它的那一刻起,我得到了第二個循環的6 ms。 我仍然需要重新安裝它並做一些測試,看看它是否是罪魁禍首。

編輯2:

探查有一個選項設置爲「自動連接並開始分析新工藝」,它的默認情況下啓用。當分析器關閉時,它應該停止分析,並且確實在我的虛擬機測試中完成,但由於某種原因,一旦它沒有並開始分析每個分析器。(系統,ASP和Microsoft命名空間默認排除在外,因此它不會影響Math.Pow太多)。

5

機會是您:

  • 內置調試模式
  • 冉在調試器。

我的結果:

c:\Users\Jon\Test>csc /o+ /debug- Test.cs 
Microsoft (R) Visual C# 2008 Compiler version 3.5.30729.1 
for Microsoft (R) .NET Framework version 3.5 
Copyright (C) Microsoft Corporation. All rights reserved. 


c:\Users\Jon\Test>test 
1723 
13 

是不是更喜歡你期望什麼呢?即使使用/debug+ /o-,從命令行運行時,我的結果比原來的要好得多,這表明您在調試器中運行的。不是性能測試的好主意:)

+0

喬恩,即使在調試模式,我得到一個非常類似於你的結果。 – 2008-12-20 21:09:05

+0

在調試器中運行,還是隻在調試模式下建立? – 2008-12-20 21:10:49

1

無論什麼原因,這與方法調用無關。一方面,這種方法調用是有效的。另外,你的第一個例子調用一個方法。第三,第二個方法調用內聯,因爲沒有任何反應,第二個循環實際上將完全是空的。編譯器甚至可以優化整個循環。

最後,我無法在調試和發佈模式下重現您的結果。