2016-11-22 65 views
1

什麼是馮諾依曼瓶頸,函數式編程如何減少它的影響?有人可以通過一個簡單方式解釋一個實用和全面的例子,可以說明,例如,如果有的話,使用Scala而不是Java的優勢?什麼是馮諾依曼瓶頸?

更重要的是,爲什麼要避免強制性的控制結構和更喜歡的功能對提高性能如此重要?理想情況下,一個實際的編碼示例解釋瞭如何解決問題功能和沒有受Von Neuman瓶頸影響將是非常有益的。

+1

這兩者完全無關。馮諾依曼瓶頸是指在編程語言(即硬件架構)水平以下的等級* waaay *下的系統吞吐量。 –

+0

投票結束。馮諾依曼瓶頸在互聯網上的其他地方被定義和解釋;不需要StackOverflow來引用維基百科。第二部分(「Scala如何比Java更好」)主要是基於觀點的。另外,正如@JaredSmith所說,問題的兩個部分與彼此無關。 – Madoc

回答

7

即使使用函數式編程,使用Scala也不一定能解決性能問題。

更重要的是,導致性能不佳的原因很多,而且如果不進行性能分析,您不知道正確的解決方案。

von Neumann Bottleneck與von Neumann體系結構中CPU和內存是分開的,因此CPU通常需要等待內存有關。現代CPU通過緩存內存來解決這個問題。這不是一個完美的解決方案,因爲它需要CPU正確猜測它需要緩存哪個內存。然而,高性能代碼通過構建數據效率和線性迭代數據(即好的data locality),可以讓CPU輕鬆正確猜測。

斯卡拉可以簡化並行編程,這可能是你正在尋找的。這與馮諾依曼瓶頸沒有直接關係。

即使如此,如果您想要執行並行編程,Scala並不是自動的答案。有幾個原因。

  1. Java也可以並行編程,並且爲此目的有許多類型的並行集合。
  2. Java 8 Streams是Java對Scala並行集合的回答。它們可以用於功能性編程。
  3. 並行編程不能保證提高性能,並且由於安裝成本的原因,可能會使小型數據集上的程序變慢。

有一種情況,您是正確的,斯卡拉克服馮諾依曼瓶頸,這是與大數據。當數據不適合在單臺機器上輕鬆安裝時,可以將數據存儲在許多機器上,例如Hadoop羣集。 Hadoop的分佈式文件系統旨在將數據和CPU保持在一起以避免網絡流量。 Hadoop編程的最簡單方法是使用Scala中的Apache Spark。這裏有一些Spark examples;從Spark 2.x開始,Scala示例比Java示例要簡單得多。

+0

感謝您回答一個不好的問題是否可以有一個好的答案+1。 –