2010-06-16 87 views
2

有人向我建議,.NET 4.0中的內置函數緩存了它的結果,所以如果我一遍又一遍地調用Math.Sqrt(50),它實際上並不是在執行sqrt,而只是從緩存中提取答案。任何人都可以驗證或否認這一說法?如果這是真的,那麼我的代碼中會有一堆不必要的緩存。Math.Sqrt緩存自己的結果嗎?

回答

0

我沒有安裝.net 4,但您可以通過在反射器中查看上述方法輕鬆地進行驗證。
這是您確定會看到發生的唯一方法。

+1

我實際上在ildasm和.net反射器中檢查了這一點。看起來,.NET級別沒有緩存,因爲兩者都表明Math.Sqrt實際上是一個外部調用。 – 2010-06-16 14:35:15

+0

你不能看到這個使用反射器,因爲它是一個外部調用。您可以從Microsoft下載[共享源參考實現]的源代碼(http://www.microsoft.com/downloads/details.aspx?FamilyID=8c09fd61-3f26-4555-ae17-3121b4f51d4d&displaylang=en)並查看那裏。您會看到'Math.Sqrt'只是對C++ math.h中'sqrt()'函數的調用。 – 2010-06-16 14:55:27

1

我不這麼認爲。

您可以嘗試做一個基準測試,在1000.000個不同的號碼上撥打Math.Sqrt,然後在1000.000個相同的號碼上,所用的時間應該相似。

你可以看看反射器,它可以揭示你的功能代碼(至少是非管理部分)。

如果你需要一個緩存,你應該創建一個你自己的某種散列表。 請注意,您應該留下一個小數,例如1.0000000應該與1.00000001相同,否則您會因準確性而陷入困境。