我正在查看.NET Framework的String
類的Equals
方法實現,並發現它使用了EqualsHelper
方法。我發現,這真是一個非常酷的和有效的方法,但有一些非常weired我發現,爲什麼他們通過除法運算遞增指針(或進行偏移),如:查看.NET框架中的EqualsHelper方法
*(long*)(ptr + (IntPtr)8/2), ptr += (IntPtr)4/2;
等。
謝謝!
我正在查看.NET Framework的String
類的Equals
方法實現,並發現它使用了EqualsHelper
方法。我發現,這真是一個非常酷的和有效的方法,但有一些非常weired我發現,爲什麼他們通過除法運算遞增指針(或進行偏移),如:查看.NET框架中的EqualsHelper方法
*(long*)(ptr + (IntPtr)8/2), ptr += (IntPtr)4/2;
等。
謝謝!
啊,我沒有看到你在說什麼的原因是你正在查看64位源,而不是我最初的32位源。
原來的源代碼文件中有一個#if
指令。它根據是否在編譯時定義符號AMD64
做了不同的事情。
原始代碼中的註釋非常具有啓發性。基本上,在編譯64位平臺的框架時,他們選擇將循環展開12,並一次檢查3 quadwords。這是通過不同的系統架構實現的性能優化。
// unroll the loop
#if AMD64
// for AMD64 bit platform we unroll by 12 and
// check 3 qword at a time. This is less code
// than the 32 bit case and is shorter pathlength
while (length >= 12)
{
if (*(long*)a != *(long*)b) break;
if (*(long*)(a+4) != *(long*)(b+4)) break;
if (*(long*)(a+8) != *(long*)(b+8)) break;
a += 12; b += 12; length -= 12;
}
#else
while (length >= 10)
{
if (*(int*)a != *(int*)b) break;
if (*(int*)(a+2) != *(int*)(b+2)) break;
if (*(int*)(a+4) != *(int*)(b+4)) break;
if (*(int*)(a+6) != *(int*)(b+6)) break;
if (*(int*)(a+8) != *(int*)(b+8)) break;
a += 10; b += 10; length -= 10;
}
#endif
如果你有興趣在.NET Framework的內部,確保從this site下載完整版共享源代碼的。當您嘗試僅使用.NET Reflector時,會錯過許多有趣的事情。不是其中的評論。想想,我已經看到有人在這裏爭辯說,在寫得很好的代碼中不需要評論!
+1有一個很好的答案和*想想,我已經看到人們在這裏爭辯說,在寫得很好的代碼中不需要評論!*。有時候正確的代碼不可能是微不足道的,需要一些解釋。 – 2011-05-08 16:05:11
我在'String.EqualsHelper'方法中看不到這段代碼。你正在檢查什麼版本的.NET Framework源代碼? – 2011-05-08 13:20:02
@Code Grey:.NET 4.0。 – sherifzain 2011-05-08 13:42:34