微信号:infoqchina

介绍:有内容的技术社区媒体

Mono开始采纳.NET源代码

2015-04-13 12:30 InfoQ



Mono 4.0发布说明的草稿目前已经提交,在新版本的诸多变更之中,值得注意的一点是Mono团队开始采纳微软CoreCLR项目中的源代码了。


让我们说得更准确一些,微软实际上一共推出了三个以MIT方式授权的源代码集。


ReferenceSource


CoreFX


CoreCLR


由于CoreCLR项目本身依然还不够稳定,因此Mono团队目前主要专注于ReferenceSource项目中的代码。团队的短期目标是将Mono项目中一些有bug或未完成的组件替换为.NET的对应代码,你可以在Trello网站上跟踪该项目的进展情况。


除了Decimal类之外,以下命名空间中的代码也都被替换为ReferenceSource项目中的源代码了:


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


而其它命名空间中也有多个类的源代码已经整合到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循环方式。


对于使用获取/释放语法的原子方法来说,我们将为这些语法生成内存屏障,而不是使用过于严格的顺序一致性方式。




如果想要评论本篇文章,想看下其他读者都有什么话想说,欢迎点击“阅读原文”参与讨论。


 
InfoQ 更多文章 Facebook如何实现PB级别数据库自动化备份 学术派Google软件工程师Matt Welsh谈移动开发趋势 Spotify为什么要使用一些“无聊”的技术? 妹纸们放假了,汉纸们做啥? 大多数重构可以避免
猜您喜欢 如何通过第三方工具提高电商数据转化 【▣】不同寻常家庭饲养的宠物:从黑猩猩到美洲狮 告别线框图,不懂技术也能做出精美的高保真原型 API 调用次数限制实现 为帮大家提高表达能力,皮克斯提出讲故事的22条法则!