簡體   English   中英

F#簡易型及結構比較

[英]F# simple type and structural comparison

在這個問題中,為什么這個 F# 代碼這么慢? , 討論了結構比較使 function let min3(a, b, c) = min a (min bc)變慢; 簡單類型的結構比較不應該和原生類型一樣快嗎? 我很困惑,因為人們談論總是在 FSharp 中的 F# 中使用HashIdentity.Structural作為字典運行我的算法比 Python 慢 如果我有一個以簡單類型(int 或字符串)為鍵的字典,是否會因使用HashIdentity.Structural而受到性能損失?

一般來說,我不會擔心比較的性能,因為對於典型的代碼比較不太可能成為性能瓶頸。 如果您確定您有性能問題並且分析顯示比較是原因,那么您可以考慮如何最好地解決它。

如果您確實需要考慮比較的性能,那么您可能需要了解編譯器的工作原理。 在您引用的第一個示例中, min3 function 的類型為'a * 'a * 'a -> 'a when 'a: comparison 此 function 將被編譯為 .NET 方法,該方法采用 3 個通用類型的 arguments,在 ZD7EFADB6027D23D772FDZ 中看起來像這樣:

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方法也是通用的,其中必須有邏輯來根據被比較的實際類型執行比較。 這可能需要一些類型測試和虛擬方法調用。 這些操作並不是非常昂貴,但它們比直接比較兩個 integer 值要慢得多。 因此,如果比較占您工作量的很大一部分,則使用通用比較例程可能會對您的整體性能產生重大影響,並且將min3 function 專門用於僅處理整數而不是任何通用值可能會大大提高性能.

同樣,如果您只是將整數存儲為字典鍵,那么在鍵上使用內置的GetHashCode()Equals()實現(這是字典默認執行的操作)將比使用結構比較更快。 但是,這對您來說是否是一個重要的區別將取決於您正在編寫的實際代碼 - 正如我之前所說,關鍵比較占用算法運行時間的很大一部分是有點不尋常的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM