簡體   English   中英

C#/ F#性能比較

[英]C# / F# Performance comparison

Web上是否有可用的C#/ F#性能比較,以顯示新F#語言的正確用法?

自然F#代碼(例如,函數/不可變)比自然(命令性/可變對象的)C#代碼慢。 但是,這種F#比通常的C#代碼短得多。 顯然,有一個權衡。

另一方面,在大多數情況下,您可以實現F#代碼的性能等於C#代碼的性能。 這通常需要以命令式或可變的面向對象的方式編寫代碼,配置文件並消除瓶頸。 您使用與C#中使用的相同的工具:例如.Net反射器和分析器。

話雖如此,但要注意F#中的一些高效率構造會降低性能。 根據我的經驗,我見過以下案例:

  • 引用(與類實例變量相對),僅在執行數十億次的代碼中

  • F#比較(<=)與System.Collections.Generic.Comparer,例如二進制搜索或排序

  • 尾調用 - 僅在某些情況下無法由編譯器或.Net運行時優化。 如評論中所述,取決於.Net運行時。

  • F#序列比LINQ慢兩倍。 這是由於引用和使用F#庫中的函數來實現seq <_>的轉換。 這很容易修復,因為你可以用一個使用Linq,PLinq或DryadLinq的相同簽名來替換Seq模塊。

  • 元組,F#元組是在堆上排序的類。 在某些情況下,例如int * int元組,它可能需要支付使用結構。

  • 分配時,值得記住的是,閉包是一個用new運算符創建的類,它記住了訪問過的變量。 可能值得“解除”閉包,或者用一個明確地將被訪問的變量作為參數的函數替換它。

  • 嘗試使用內聯來提高性能,尤其是通用代碼。

我的經驗是先用F#編碼,然后只優化重要的部分。 在某些情況下,在C#中編寫慢函數可能更容易,而不是嘗試調整F#。 但是,從程序員效率的角度來看,在F#中啟動/原型是有意義的,然后進行輪廓分析,反匯編和優化。

最重要的是,由於程序設計決策,您的F#代碼最終可能比C#慢,但最終可以獲得效率。

以下是與此主題相關的一些鏈接:

我似乎還記得羅伯特皮克林博​​客上的另一篇文章(或者是斯科特漢塞爾曼?),最后,因為兩者都坐在同一個框架上,你可以從兩者中獲得相同的表現,但有時你必須'扭曲'這種語言的自然表達。 在我回憶的例子中,他不得不扭曲F#以獲得與C#相當的性能......

暫無
暫無

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

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