use*_*807 8 c# java f# multithreading multicore
简单的C#/ Java代码非常难以并行化,多线程等.因此,简单的C#/ Java代码将在一个盒子上使用越来越少的总处理能力(因为现在所有东西都将是多核的) ).
在C#和Java中解决这个问题并不简单.可变性和副作用是在C#和Java中完成工作的关键,但这正是使多核,多线程编程变得如此困难的原因.
因此,函数式编程将变得越来越重要.
鉴于J2EE/Ruby世界将在许多功能/多核方法之间分裂(就像它几乎所有其他方式一样),而.NET人员都将使用F#,这种思路表明F#将是巨大的两个年份.
这种思路有什么问题?F#为什么不是很明显?
(编辑)Larry O'Brien在这篇博客文章中指出:"语言方面,在我看来,这是一套C和C++闪耀的练习 - 至少在多线程的东西之前.列表处理习语的语言也会最初做得很好,但可能有内存消耗问题(特别是函数式语言).最后,我认为托管的C派生语言(Java和C#)有最简单的练习9的路径,然后在练习10中面临严重的缺点,其中并发问题起主要作用.在我看来,并发性将成为未来五年专业发展的核心问题,因此这些缺点非常重要.
Rob*_*vey 11
简单的C#/ Java代码非常难以并行化
如果您使用任务并行库,则不会.
F#是否变得巨大取决于成本/收益是否存在,这一点并不明显.如果.NET开发人员发现他们可以在1/3的时间内使用功能而不是命令式的方法编写一些程序(我认为对于某些类型的程序可能是这样),那么F#采用应该有一些动机.
保罗·格雷厄姆关于他在一家创业公司中使用Lisp的故事说明了这一过程.Lisp为他们提供了巨大的竞争优势,但Lisp没有接管世界,不是因为它不强大,而是出于其他原因,比如缺乏图书馆支持.F#可以访问.NET框架,这给了它一个战斗机会.
http://www.paulgraham.com/avg.html
函数式编程比命令式编程更难理解.F#在很多方面都比C#更难.大多数"开发人员"不了解函数式编程概念,甚至无法在C#中编写非常好的命令式代码.那么他们有什么希望在F#中编写好的功能代码?
当你考虑团队中的每个人都需要能够理解,编写,调试,修复等等你选择的语言代码时,这意味着你需要一个非常强大的团队 - 而不仅仅是一个非常强大的人 -能够使用F#,因为它意味着使用.周围的人并不多.
加入混合的事实是,有8年的C#/ VB代码不可能被迁移,并且在C#/ VB中创建外观和感觉像BCL的库更容易,因为它不容易泄漏像通过公共接口,元组等等,我认为F#很难获得比强大的团队在新的内部项目中使用更多的东西.
使用新颖的编程语言是一种计算风险 - 您可能会获得更多内置功能和语法糖,但您将失去社区支持,雇用程序员的能力以及解决语言中的盲点问题.
我不是在选择F# - 编程语言的每个决定都是你需要解决的风险等式.如果人们没有承担C#的风险,我们现在仍然使用VB6和C++.这些语言与他们的前辈相同.您必须为您的项目决定优势是否超过风险.
就我个人而言,我认为函数式语言将变得越来越主流(哎呀,F# 本身就是证明),但可能永远不会像 C/C++/Java/C# 等那样获得通用语言的地位。已经或将会。
*这显然是一个有些争议的观点,所以我将对其进行扩展。
在多线程 UI 中,每个 UI 事件都是在其自己的线程上异步分派(线程的实际管理可能比仅仅启动一个新线程更复杂,但这与讨论并不真正相关)。
想象一下如果是这种情况,并且您正在渲染窗口。
在步骤 2 中,每个元素必须锁定应用程序状态(或影响显示的子集)。否则,如果应用程序状态被更新,则呈现窗口的最终结果可能包括反映两个不同应用程序状态的元素。
这是一个锁车队。每个渲染线程都会加锁、渲染、然后释放;因此他们会串行执行。
现在,假设您正在处理用户输入。首先,用户的速度相当慢,因此除非您在(多个)UI 线程上做大量工作,否则好处将不存在;所以我假设情况就是如此。
您所完成的只是从显式启动工作线程更改为隐式启动工作线程;如果您不锁定状态,则会以潜在的 heisenbug 和死锁为代价。
UI api 的根本问题是您正在处理多对一(或一对多,具体取决于您如何看待它)关系。许多窗口、许多元素或许多“输入类型”,所有这些都会影响单个窗口/表面。某种类型的同步必须发生,而当它发生时,多线程就不再有任何好处,只是有坏处。