2011-03-22 58 views
2

我遍歷一個3D陣列:新的x64在迭代數組時比x86舊版本更慢?

byte[, ,] data = original.Data; 
for (int i = original.Rows - 1; i >= 0; i--) 
{ 
    for (int j = original.Cols - 1; j >= 0; j--) 
    { 
     if (data [i,j,0] < 100) 
     { 
      data [i, j, 0] += 100; 
      data [i, j, 1] += 40; 
      data [i, j, 2] += 243; 
     } 
     else 
     { 
      data [i,j,0] = 0; 
     } 
     } 

    } 

我測試了這個代碼用很舊的x86 CPU(英特爾酷睿)和一個相當新的x64 CPU(英特爾酷睿i7)。我很驚訝地發現,新的x64 CPU要慢得多。 x64需要三倍多的時間!該代碼有什麼問題?我能做些什麼來使x64代碼更快?

附加信息: - 兩個測試都是在win 7 os上進行的。 (用於x86的32位版本和用於x64的64位版本) - 代碼爲C#

+3

你不能真正期望來自兩個不同操作系統和兩個不同芯片的可比結果,對吧?我敢打賭x86機器的RAM也更少。沒有辦法比較這些結果。 – 2011-03-22 16:32:43

+0

我在一個程序中觀察到類似的行爲,當我在同一臺64位計算機上運行它時,它將編譯爲x86或x64。 x64版本運行速度減半。我沒有驗證它是整個代碼還是隻是一小段。 – 2011-09-09 00:41:15

回答

2

一般而言,許多較新的處理器往往比較舊的處理器要慢,特別是較舊的處理器。

但是,較新的處理器傾向於擁有更多內核並使用更少的電力。這是多線程變得如此重要的原因之一 - 你不能依靠未來的硬件來提供速度優勢。

此外,64位代碼通常比類似的32位代碼運行速度慢。但是,它確實提供了其他好處,例如訪問更大量的內存。

1

如果您使用32位或64位值(即使您一次操作的可能是4字節值),您可能會得到更快的結果。

+0

Windows/.Net如何在x64模式下運行?當從內存中加載時,它會試圖將兩個32位整數填充到單個64位行中嗎?如果是這樣,它可能會使緩存無效,如果一個變化,另一個不變。 – 2011-03-22 16:43:58

+0

@Alex VC++編譯器非常瞭解對齊方式,並且會創建與性能保持一致的結構。 CLR也是如此。 – 2011-03-24 16:29:33

+0

我猜,只要它們是值類型的數組,clr就會以最有效的方式將它們全部粉碎。我想我將不得不做一些調查,看看clr如何反映x86/x86-64的偏移量,以及它如何對值類型也是如此。我現在有理由使用SoS! – 2011-03-24 17:35:33