BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース JavaOne 2016 - 2日目 並列に考えること

JavaOne 2016 - 2日目 並列に考えること

ブックマーク

原文(投稿日:2016/09/26)へのリンク

もう1度JavaOneの2日目、4つのセッションルームのライブを取り上げる。これらのセッションの動画はこの記事の最後に掲載している。

InfoQは‘並列に考えること’というセッションに参加した。これは、我々が今議論していることだ (以下のBallroom 4にある動画リンクをみてほしい)。このセッションはオラクルのStuart Marks氏とBrian Goetz氏がプレゼンしていた。タッグチームは並列の説明においてすばらしい仕事をした。ストリームにおいてはMarks氏がなぜストリームを使いたいのかという点に専念し、Goetz氏がなぜ並列を使いたいのかという点に専念した。

Marks氏はサンプルとして文字列配列を大文字に変換することから始め、ストリームでのアプローチと同様に旧来のアプローチを見せた。

forループを使った旧来のアプローチをここに示す。

ここでは入力の配列は左から右の順で順番に処理される。しかし、処理はただ“toUpperCase”を呼び出すだけだ。各処理は他から独立している。また、レコードはどんな順序でも並列でも処理できる。そのため、ストリームを使うのはどうだろう?

ストリームの事例においては、配列の入力は大文字へと変換され、それから配列へと戻る。入力と出力の配列は任意の順序であるかもしれず、コードは順序を指定する必要がない。配列のすべてが大文字になる。

Marks氏はストリームバージョンは高いレベルの抽象化と処理の独立、そして集約であるためよりよいと主張する。

次のサンプルはpredicateが指定した位置でリストを分割するデモだ。以下に示す。

Marks氏はsubListメソッドは元のリストへのインデックスを引数に取ることを指摘した。要求を達成するために我々のアルゴリズムは#の位置で分割しなければならない。協調のために、Marks氏は#の代わりにバーを置いた。これはsublistの端になるだろう。それから外部の境界を作成するためにそれぞれの最後に分割点を合成した。以下に示す。

旧来のアプローチを使ったこのアルゴリズムの実装は次のことを引き起こす。

本質的ではない複雑さもある。たとえばforループの外での start = cur + 1;result.addへの呼び出しだ。それゆえに、Marks氏は次のように述べる。

Marks氏は、我々はインデックスにのみ興味があるという問題を再検討しながらストリームのアプローチと対比した。そして、反復のforループに代わり、インデックスの上にストリームをすることができる、とした。predicateと分割処理の結果は互いに独立しているので、predicateのテストを各要素で実行でき、その他すべては独立しているだろう。結果となるコードは(配列に追加するためにコピーした配列を削除した後)このようになるだろう。

Marks氏はストリームのアプローチはよりわかりやすいと彼の意見を結論づけた。

それからGoetz氏は並列にすることの長所と短所を考えることによってMarks氏の提起を補完した。彼はより多くのリソースを消費することと、より早く結果を得ることの間のトレードオフである並列性について話す、以下のスライドから始めた。

Goetz氏は並列処理はつねにより多くの並列作業のタスクを必要とすることを強調した。それは、たとえば作業の分割、タスクと処理の管理と協調である。それゆえにもし問題が成功するのなら、並列可能でなければならず、またよい並列フレームワーク (たとえばフォークジョインライブラリ) がなければならない。結局、並列に処理するための十分なデータであるべきである。それからGoetz氏は並列性が役立つであろうサンプルを提供し、聴衆に分割統治するコードを示した。

Goetz氏は並列での解決策はすべて本質的に上記の分割統治のコードのように見えることを強調した。問題を分割することは同期のオーバーヘッドを避ける。効果的な並列アルゴリズムにとって、問題は早期に分割されるべきだ。それからGoetz氏は並列に配列を合計するサンプルを提供し、いくつかのパフォーマンス上の考慮を与えた。

最後に、Goetz氏は並列ストリームのパフォーマンスを考慮することへつなげた。ストリームは簡単に並列化できるが、すべてのソースが並列化に適しているわけではないかもしれない。

配列ベースのソースが一番よい。

Goetz氏によると、"NQモデル"は並列による速度向上の可能性のおおまかなやり方を計算するための単純なモデルである。

 

Goetz氏は"効果的に分割するソース"について話した。配列はその根底にある表現のせいで一様にそして費用をかけずに分割すると言った。また、パイプラインの処理は遭遇するシーケンスに依存することもあるということに留意する。たとえば"10の制限"の処理は明らかに順番になっている最初の10個に適用できる。 もう1つ考慮すべきことは時折マージは高価になるかもしれないということだ。

Goetz氏はセッションを次のようにまとめた。

Links:

Ballroom 4

Ballroom 6

Cyrill Magnin II/III

Embarcadero

Rate this Article

Relevance
Style

この記事に星をつける

おすすめ度
スタイル

BT