在這個問題Why is this F# code so slow?中,討論結構比較使功能let min3(a, b, c) = min a (min b c)
慢;不應該簡單類型的結構比較與原生類型一樣快嗎? 我很困惑,因爲人們談論的總是使用HashIdentity.Structural
作爲F#中的字典FSharp runs my algorithm slower than Python。如果我有一個簡單類型(int或字符串)作爲密鑰的字典,使用HashIdentity.Structural
會對性能造成影響嗎?F#簡單類型和結構比較
3
A
回答
3
一般來說,我不會擔心比較的性能,因爲對於典型的代碼比較來說,不太可能是性能瓶頸。如果你確定你有一個性能問題,並且分析顯示比較是原因,那麼你可以考慮如何最好地解決它。
如果您確實需要考慮比較的性能,那麼您可能需要了解編譯器的工作方式。在您引用的第一個示例中,min3
函數的類型爲'a * 'a * 'a -> 'a when 'a : comparison
。該功能將被編譯採取泛型類型這將是這個樣子在C#中的3個參數的.NET方法:
using LP = Microsoft.FSharp.Core.LanguagePrimitives;
T min3<T>(T a, T b, T c) {
T d = LP.HashCompare.GenericLessThanIntrinsic(b,c) ? b : c;
return LP.HashCompare.GenericLessThanIntrinsic(d,a) ? d : a;
}
的GenericLessThanIntrinsic
方法也是通用的,並在其中必須有執行邏輯根據所比較的實際類型進行比較。這可能需要一些類型測試和虛擬方法調用。這些並不是非常昂貴的操作,但它們比直接比較兩個整數值要慢得多。因此,如果比較佔工作量的很大一部分,那麼使用通用比較例程可能會對整體性能產生重大影響,並且專門將min3
函數僅用於整數而不是任何通用值可能會是一個巨大的性能優勢。同樣,如果您只是將整數存儲爲字典密鑰,那麼使用內置的GetHashCode()
和Equals()
實現(這是字典將默認執行的操作)將比使用結構比較更快。但是,這對你來說是否是一個重要的區別取決於你正在編寫的實際代碼 - 正如我之前所說的,關鍵比較佔用算法運行時間的一個重要部分是有點不尋常的。
相關問題
- 1. f#泛型類型比較
- 2. 簡單通用類型比較
- 3. 比較F#中的函數類型
- 4. F#中的結構比較和平等如何使.NET可變詞典<T, T>如何使F#中的結構比較和平等成爲可能F#
- 5. 簡單的ajax mvc類型結構
- 6. 結構比較
- 7. 比較Ecore類和類型
- 8. 簡單類型測試在F#
- 9. F#隱式類型簡單的遞歸
- 10. F#類型的遞歸樹結構
- 11. 結構比較器
- 12. Golang結構比較
- 13. 比較類型
- 14. 樹狀結構,F#泛型
- 15. 簡單的MySQL查詢和比較
- 16. F#比較報價
- 17. 比較和驗證數據結構
- 18. 比較不同的密鑰和結構
- 19. Scala:比較類型
- 20. Python類型比較
- 21. Javascript類型比較
- 22. 簡單的checkedlistbox比較
- 23. Python簡單數字比較
- 24. 簡單的PowerShell LastWriteTime比較
- 25. 比較2結構陣列
- 26. 比較目錄結構
- 27. 比較三維結構
- 28. 數據結構比較
- 29. 如何比較兩個散列表的結構和類型,而不是值
- 30. 泛型類型比較