<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                ## 數組并行 我們很快就不得不面對并行的主題。例如,“并行”一詞在許多Java庫方法中使用。您可能聽說過類似“并行程序運行得更快”這樣的說法,這是有道理的—當您可以有多個處理器時,為什么只有一個處理器在您的程序上工作呢? 如果您認為您應該利用其中的“并行”,這是很容易被原諒的。 要是這么簡單就好了。不幸的是,通過采用這種方法,您可以很容易地編寫比非并行版本運行速度更慢的代碼。在你深刻理解所有的問題之前,并行編程看起來更像是一門藝術而非科學。 以下是簡短的版本:用簡單的方法編寫代碼。不要開始處理并行性,除非它成為一個問題。您仍然會遇到并行性。在本章中,我們將介紹一些為并行執行而編寫的Java庫方法。因此,您必須對它有足夠的了解,以便進行基本的討論,并避免出現錯誤。 在閱讀并發編程這一章之后,您將更深入地理解它(但是,唉,這還遠遠不夠。只是這些的話,充分理解這個主題是不可能的)。 在某些情況下,即使您只有一個處理器,無論您是否顯式地嘗試并行,并行實現是惟一的、最佳的或最符合邏輯的選擇。它是一個可以一直使用的工具,所以您必須了解它的相關問題。 最好從數據的角度來考慮并行性。對于大量數據(以及可用的額外處理器),并行可能會有所幫助。但您也可能使事情變得更糟。 在本書的其余部分,我們將遇到不同的情況: - 1、所提供的惟一選項是并行的。這很簡單,因為我們別無選擇,只能使用它。這種情況是比較罕見的。 - 2、有多個選項,但是并行版本(通常是最新的版本)被設計成在任何地方都可以使用(甚至在那些不關心并行性的代碼中),如案例#1。我們將按預期使用并行版本。 - 3、案例1和案例2并不經常發生。相反,您將遇到某些算法的兩個版本,一個用于并行使用,另一個用于正常使用。我將描述并行的一個,但不會在普通代碼中使用它,因為它也許會產生所有可能的問題。 我建議您在自己的代碼中采用這種方法。 [http://gee.cs.oswego.edu/dl/html/StreamParallelGuidance.html](要進一步了解為什么這是一個難題,請參閱Doug Lea的文章。) **parallelSetAll()** 流式編程產生優雅的代碼。例如,假設我們想要創建一個數值由從零開始填充的長數組: ```JAVA // arrays/CountUpward.java import java.util.stream.LongStream; public class CountUpward { static long[] fillCounted(int size) { return LongStream.iterate(0, i -> i + 1).limit(size).toArray(); } public static void main(String[] args) { long[] l1 = fillCounted(20); // No problem show(l1); // On my machine, this runs out of heap space: // - long[] l2 = fillCounted(10_000_000); } } /* Output: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19] */ ``` **流** 實際上可以存儲到將近1000萬,但是之后就會耗盡堆空間。常規的 **setAll()** 是有效的,但是如果我們能更快地處理如此大量的數字,那就更好了。 我們可以使用 **setAll()** 初始化更大的數組。如果速度成為一個問題,**Arrays.parallelSetAll()** 將(可能)更快地執行初始化(請記住并行性中描述的問題)。 ```JAVA // arrays/ParallelSetAll.java import onjava.*; import java.util.Arrays; public class ParallelSetAll { static final int SIZE = 10_000_000; static void intArray() { int[] ia = new int[SIZE]; Arrays.setAll(ia, new Rand.Pint()::get); Arrays.parallelSetAll(ia, new Rand.Pint()::get); } static void longArray() { long[] la = new long[SIZE]; Arrays.setAll(la, new Rand.Plong()::get); Arrays.parallelSetAll(la, new Rand.Plong()::get); } public static void main(String[] args) { intArray(); longArray(); } } ``` 數組分配和初始化是在單獨的方法中執行的,因為如果兩個數組都在 **main()** 中分配,它會耗盡內存(至少在我的機器上是這樣。還有一些方法可以告訴Java在啟動時分配更多的內存)。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看