Mono開始采納.NET源代碼
英文原文:Mono Adopts .NET Source Code
Mono 4.0 發布說明的草稿目前已經提交,在新版本的諸多變更之中,值得注意的一點是 Mono 團隊開始采納微軟 CoreCLR 項目中的源代碼了。
讓我們說得更準確一些,微軟實際上一共推出了三個以 MIT 方式授權的源代碼集。
- ReferenceSource
- CoreFX
- CoreCLR </ul>
- System.Collections
- System.Collections.Concurrent
- System.Collections.Generic
- System.Collections.Specialized
- System.ComponentModel
- System.ComponentModel.Design
- System.Diagnostic.Contracts
- System.Linq
- System.Linq.Parallel
- System.Text.RegularExpressions
- System.Runtime.CompilerServices
- System.Threading.Tasks </ul>
由于 CoreCLR 項目本身依然還不夠穩定,因此 Mono 團隊目前主要專注于 ReferenceSource 項目中的代碼。團隊的短期目標是將 Mono 項目中一些有 bug 或未完成的組件替換為 .NET 的對應代碼,你可以在 Trello 網站上跟蹤該項目的進展情況。
除了 Decimal 類之外,以下命名空間中的代碼也都被替換為 ReferenceSource 項目中的源代碼了:
而其它命名空間中也有多個類的源代碼已經整合到 Mono 項目中了
不再支持的特性
Mono 將不再支持生成對應 .NET 4.0 或更早版本的程序集了,在新的版本中只支持生成 .NET 4.5 以及基于移動檔案的程序集。這一變動引起了那些使用 Unity 進行開發的使用者的疑慮,因為 Unity 的開發目前還依賴于某個早期版本的 Mono 中對 .NET 3.5 的實現。
新版本也將不再提供對 Entity Framework 的“內置支持”,因為畢竟大多數用戶都會選擇使用 NuGet 下載的 EF 版本進行開發。與之類似的是,Mono 中也不再提供自己的 Npgsql 驅動了。
性能優化
之前,Mono 對于浮點數的操作默認是使用最大精度的。雖然使用 64 位算法進行 32 位浮點數操作同樣是安全的,但這種方式對于性能會帶來不利的影響。因此,新版本中提供了一個選項,可以選擇進行 32 位的計算。
方法的內聯也得到了改進。“我們現在能夠對最多 8 個機器字長的數據結構的拷貝進行內聯,而之前只支持最多 5 個機器字長。超過 8 個字長的數值仍將使用 memcpy 指令以完成操作”。
此外,對于原子操作的運行方式也有某些地方進行了變更。
現在,JIT 能夠將框架中的所有原子方法認可為固有方法,并進行內聯,這一點利益于平臺中某些特定代碼的功能。這些方法包括 Interlocked 和 Volatile 的所有方法,以及 Thread 類中的 MemoryBarrier、VolatileRead 和 VolatileWrite 方法。
在 x86 及 64 位機器上,Thread.MemoryBarrier 的實現方式選擇了使用 mfence 指令,而不是使用 lock add rsp,0 指令。此外,Interlocked.Exchange 的實現使用了 xchg [dst], val 指令,而不是之前那種更耗性能的 lock cmpxchg [dst], val 循環方式。
對于使用獲取/釋放語法的原子方法來說,我們將為這些語法生成內存屏障,而不是使用過于嚴格的順序一致性方式。
</blockquote>來自: InfoQ本文由用戶 xg48 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!