最近,我正在尝试进入并发编程的世界。一开始,我认为使用多核处理器的唯一原因是提高了程序的性能。但现在我不再那么确定了。
考虑到用大多数语言编写多线程程序都很困难,许多人倾向于推荐Erlang或Clojure等专门设计的语言作为并发计算的首选语言。当然,Erlang让编写并发程序变得容易得多,但这样做值得吗?
我已经查找了一些Erlang程序(是的,我知道microbenchmark没有说太多……)令人惊讶的是,许多单核C程序的性能甚至超过了四核Erlang程序。
所以我的问题是,像Erlang,Clojure等语言的优势是什么?当用C/Java编写单核程序的速度更快时,我为什么要使用这样一种语言,它使得编写多核程序变得容易?
(我忘了提一下,这些问题只与多核机器有关,分布式计算是不同的,我可以在这里看到Erlang的优势)
发布于 2011-09-11 19:29:00
当大多数好的答案开始时,这取决于你正在尝试做什么,在这种情况下,它取决于你试图在什么(硬件)上做这件事。
目前,有一些不错的机器配备了32+ cpus。要利用所有这些cpus,需要执行以下任一操作:
通常,1比2容易做得多。
如果你看一下“硬件的未来”,你会发现有一种趋势是更多的cpus而不是更快的cpus。比方说,ParaCCC (虚构语言)比C慢10倍,但是你有一台有512个cpus的机器,ParaCCC (对于我们的问题)可以利用它。理论上,ParaCCC程序的运行速度将比C程序快51倍。无需重写。Plus C通常不知道它的上市时间,因为这是这些新语言的另一个吹嘘。
此外,您可能没有考虑到大多数执行任何数量的I/O的程序最终都是多线程的,因为您倾向于使用不同的线程进行I/O而不是处理,并且您不希望单个缓慢的客户端减慢您的速度(显然C可以做到这一点,但线程模型通常看起来要好得多)。
关于Erlang,我在这里问了一个相关的问题:How many CPUs are needed before Erlang is faster than single-threaded Java,它的答案有更多的细节和这些方面的论点……
发布于 2011-09-11 19:49:43
Clojure正是这种权衡的好选择。它不会像erlang中那样对你施加很多约束,事实上,如果你喜欢并获得java的速度,你总是可以用可变的命令式风格(仍然是clojure,尽管更丑陋)重写需要更高性能的部分。然而,对于任何足够复杂的问题,正确性和并发性保证让你比C和java更快地将产品推向市场,而且我们都知道,开发人员的时间比硬件成本更有价值。
clojure背后的思想是构造(不变性、事务)使您能够更容易地推断并发性。
https://stackoverflow.com/questions/7377838
复制相似问题