5-D オラクルコンサルが語るJava SE 8の勘所

Similar documents
Oracle パブリック・クラウド・サービス無料トライアル 申込手順書

How to Use the PowerPoint Template

Null

Sort-of-List-Map(A)

Safe Harbor Statement The following is intended to outline our general product direction. It is intended for information purposes only, and may not be

文字列操作と正規表現

Null

第 3 回 Java 講座 今回の内容 今週の Java 講座はコレクション 拡張 for 文, ガベージコレクションについて扱う. 今週の Java 講座は一番内容が薄いも のになるだろう. コレクション コレクションとは大きさが決まっていない配列だと考えればよい. コレクションには List 先

デジタル表現論・第4回

Java知識テスト問題

How to Use the PowerPoint Template

JAVA とテンプレート

JS2-14 マルチコアCPU時代の Javaプログラミング

Java Day Tokyo 2017 ダウンロード資料

DB12.2 CoreTech Seminar Overview

[HO-2] NetBeansとGlassFishではじめるJava EE7ハンズオン

JavaプログラミングⅠ

PowerPoint Presentation

Microsoft PowerPoint - ●SWIM_ _INET掲載用.pptx

開発・運用時のガイド JDK8への移行に伴う留意点 [UNIX]

Fork/Join Frameworkの性能について

How to Use the PowerPoint Template

2016 年度 JAVA 講座第六週目 目次 パッケージ... 2 パッケージの作成... 2 パッケージの使用方法... 3 異なるパッケージ同名クラスの宣言... 4 パッケージの側面から見たアクセス修飾子... 4 ラッパークラス... 5 ラッパークラス利用法:キャスト... 5 ラッパーク

(ch2 + i)->next = ch1 + r; doit(ch1, ch2); 図 1 ランダムアクセスする C ソース 時間 (elapsed) 32 ビットプログラム (gcc -O2 -m32 でコンパイル ) 6.23 秒 秒 64 ビットプログラム (gcc -O2 -m

intra-mart Accel Platform — IM-Repository拡張プログラミングガイド   初版  

ただし 無作為にスレッドを複数実行すると 結果不正やデッドロックが起きる可能性がある 複数のスレッド ( マルチスレッド ) を安全に実行する ( スレッドセーフにする ) ためには 同期処理を用いるこ とが必要になる 同期処理は 予約語 synchronized で行うことができる ここでは sy

1.SqlCtl クラスリファレンス SqlCtl クラスのリファレンスを以下に示します メソッドの実行中にエラーが発生した場合は標準エラー出力にメッセージを出力します (1)Connect() メソッド データベースへ connect 要求を行います boolean Connect(String

人工知能入門

パフォーマンス徹底比較 Seasar2 vs Spring 2006/04/12 株式会社電通国際情報サービスひがやすを株式会社アークシステム本間宏崇 Copyright the Seasar Foundation and the others all rights reserved.

Exam : 1z1-809-JPN Title : Java SE 8 Programmer II Vendor : Oracle Version : DEMO Get Latest & Valid 1z1-809-JPN Exam's Question and Answers 1 from Ac

Safe Harbor Statement The following is intended to outline about pitfall and risks happened with Oracle. It is intended for information purpose only,

PowerPoint プレゼンテーション

Java Day Tokyo 2017 ダウンロード資料

レポートでのデータのフィルタ

グラフの探索 JAVA での実装

JavaプログラミングⅠ

Oracle Code Tokyo 2017 ダウンロード資料

(1) プログラムの開始場所はいつでも main( ) メソッドから始まる 順番に実行され add( a,b) が実行される これは メソッドを呼び出す ともいう (2)add( ) メソッドに実行が移る この際 add( ) メソッド呼び出し時の a と b の値がそれぞれ add( ) メソッド

富士通製プラットフォーム 「PRIMEPOWER/PRIMERGY」及び、富士通製ミドルウェア 「Interstage」とVantage Analyzer 動作検証完了報告書

Null

2

プログラミング基礎I(再)

How to Use the PowerPoint Template

Javaセキュアコーディングセミナー2013東京第1回 演習の解説

Java の ConcurrentHashMap における同期化 バッドケースとその対処法 2013 年 9 月湊隆行 1. はじめに表 1.1 に示すように Java の Collections Framework には 3 つの世代があります バージョン 1.0 から存在するレガシー API バ

Vantage Analyzer 機能検証結果報告書

[3-F] コンテナとJavaとOracle JETによるアプリ開発ハッカソン

Java 基礎問題ドリル ~ メソッドを理解する ~ 次のプログラムコードに 各設問の条件にあうメソッドを追加しなさい その後 そのメソッドが正しく動作することを検証するためのプログラムコードを main メソッドの中に追加しなさい public class Practice { // ここに各設問

Pervasive PSQL v11 のベンチマーク パフォーマンスの結果

Javaの作成の前に

Program Design (プログラム設計)

Microsoft PowerPoint - prog04.ppt

Microsoft PowerPoint ppt

PowerPoint プレゼンテーション

Java講座

Android Layout SDK プログラミング マニュアル

Brekeke PBX - Version 2.1 ARSプラグイン開発ガイド

GUI プログラミング第 4 Graph ~ 手書認識と関数グラフ描画 ~ マウスで数式を書いて認識し 関数グラフを描画する < 手書認識とグラフ描画のステップ> ステップ 1_1 フレームの作成 ステップ 1_2 マウスで自由に線を書く ステップ 2-1 手書認識認識結果を標準出力する ステップ

PowerPoint プレゼンテーション

メディプロ1 Javaプログラミング補足資料.ppt

Microsoft PowerPoint - prog03.ppt

HashMapからConcurrentHashMapへの移行


問題1 以下に示すプログラムは、次の処理をするプログラムである

Java 16x9 PPT Interim Template

使用する前に

Javaプログラムの実行手順

プログラミング入門1

10/ / /30 3. ( ) 11/ 6 4. UNIX + C socket 11/13 5. ( ) C 11/20 6. http, CGI Perl 11/27 7. ( ) Perl 12/ 4 8. Windows Winsock 12/11 9. JAV

Microsoft PowerPoint - chap10_OOP.ppt

POSIXスレッド

た場合クラスを用いて 以下のように書くことが出来る ( 教科書 p.270) プログラム例 2( ソースファイル名 :Chap08/AccountTester.java) // 銀行口座クラスとそれをテストするクラス第 1 版 // 銀行口座クラス class Account String name

Java プログラミング Ⅰ 3 回目変数 変数 変 数 一時的に値を記憶させておく機能型 ( データ型 ) と識別子をもつ 2 型 ( データ型 ) 変数の種類型に応じて記憶できる値の種類や範囲が決まる 型 値の種類 値の範囲 boolean 真偽値 true / false char 2バイト文

JUnit 概要 2015/4/16 版今泉俊幸 2015 bbreak Systems 1

SpringSecurity

Microsoft PowerPoint Java基本技術PrintOut.ppt [互換モード]

Make the Future Java FY13 PPT Template

PowerPoint プレゼンテーション

How to Use the PowerPoint Template

ガイダンス

JavaプログラミングⅠ

デザインパターン第一章「生成《

2. データ構造ヒープに保存するデータは 番号付けられて保存される 従って リスト L として保存することとする 3. アルゴリズム 3.1. 要素の追加新しい要素の追加は リストの終端に置くことで開始する つまり 最下層の一番右 または新たに最下層を生成してその一番左となる この後 この要素を正し

Java から見たオブジェクト指向入門 オブジェクト指向 AtoZ セミナー ( 株 ) 豆蔵井上樹

第二回独習 Java ゼミ 第二章クラスとメソッド 2.1 メソッドの構造 2.2 静的メソッドと静的変数の概要 2.3 インスタンスメソッドとインスタンス変数の概要 2.4 Integerクラス 2006/04/19 神津健太

橡ボーダーライン.PDF

ガイダンス

基礎計算機演習 実習課題No6

PostgreSQL SQL チューニング入門 ~ Explaining Explain より ~ 2012 年 11 月 30 日 株式会社アシスト 田中健一朗

Oracle Solarisゾーンによるハード・パーティショニング

レポートのデータへのフィルタの適用

ガイダンス

2018 IPSJ/SIGSE Software Engineering Symposium (SES2018) 1,a) 1,b) 1,c) Java 2014 Java Java Java Stream Optional 18% Stream 5% Stream JDK6/7

新・明解Java入門

本文ALL.indd

5 継承とは クラス図 98 7 参照の自動型変換 参照の自動型変換 クラス図の見方 クラス図の書き方 継承 継承してクラスを作る インスタンスの初期化 継承の効果を確認する

IronPython による柔軟なゲーム開発 筑波大学 AmusementCreators

Dolteng Scaffoldに対する機能追加とマスタ-ディテールScaffoldの紹介

ガイダンス

第2回講義

Transcription:

オラクルコンサルが語る Java SE 8 の勘所 日本オラクル株式会社コンサルティング統括本部プリンシパルコンサルタント伊藤智博 Java Day Tokyo 2016 2016 年 5 月 24 日

Safe Harbor Statement The following is intended to outline our general product direction. It is intended for information purposes only, and may not be incorporated into any contract. It is not a commitment to deliver any material, code, or functionality, and should not be relied upon in making purchasing decisions. The development, release, and timing of any features or functionality described for Oracle s products remains at the sole discretion of Oracle. 4

自己紹介 伊藤智博 ( いとうちひろ ) コンサルティングサービス統括所属 インメモリ高速処理基盤の構築を支援 Javaに関わるトラブルシューティング 国内外問わずJavaのイベントで講演 5

Java SE 8 を使ってますか? 6

Java SE 8 について次のような疑問を伺います 7

" 旧来の日付 API で十分だし 新しいのは重そうね " 8

"Lambda 式? 複雑そうだし 処理に 時間が掛かりそうだね " 9

"Stream API? 本当に速いの?" 10

こんな疑問をパフォーマンス分析の観点で解決します 11

アジェンダ 1. Date and Time API 2. Lambda 式 3. Stream API and Java Flight Recorder 12

Java Flight Recorder とは アプリケーションと JVM の情報を記録 低負荷で情報取得し 簡単に解決までの時間を短縮 13

主な分析観点 CPU リソースの割り当て JVM に中断された時間 処理時間 14

1. Date and Time API 15

よく行われる日付の処理 文字列 日付オブジェクト "2016/05/24" 2016/05/24 変換計算 2016/05/31 16

これまでの実装方法 SimpleDateFormat formater = スレッドセーフではない new SimpleDateFormat("yyyy/MM/dd"); Date date = formater.parse("2016/05/24"); 重い Calendar cal = Calendar.getInstance(); cal.settime(date); イミュータブルではない cal.set(date,cal.getactualmaximum(date)); Date end = cal.gettime(); 常に日付と時間を持つ 17

Date and Time API とは JSR 310 として標準化された日時 API これまでのAPIと互換性は無い スレッドセーフ データ形式ごとにクラスを定義 イミュータブル 18

文字列からオブジェクトへ変換手順 文字列日付オブジェクト変換 "2016/05/24" 2016/05/24 1. 1 形式を指定してフォーマッタを作成 形式の例 :yyyy/mm/dd 2. 2 フォーマッタと文字列からオブジェクトを作成 文字列の例 :2016/05/24 19

変換コードの比較 1 2 SimpleDateFormat formater = 旧 new SimpleDateFormat("yyyy/MM/dd"); Date date = formater.parse("2016/05/24"); 1 2 DateTimeFormatter formater = 新 DateTimeFormatter.ofPattern("yyyy/MM/dd"); LocalDate date = LocalDate.parse("2016/05/24", formater); 20

月末日の取得手順 日付オブジェクト 2016/05/24 計算 2016/05/31 1. 1 計算をするための日付オブジェクトの取得 2. 2 日付オブジェクトに末日を設定 3. 3 欲しいクラスの日付オブジェクトへ変換 21

月末日の取得コードの比較 1 2 3 Calendar cal = Calendar.getInstance(); 旧 cal.set(date,cal.getactualmaximum(date)); Date end = cal.gettime(); 新 LocalDate end = YearMonth.now().atEndOfMonth(); 1 2 3 22

パフォーマンス分析 23

パフォーマンス分析するケース 1 文字列 日付オブジェクト "2016/05/24" 2016/05/24 変換計算 2 2016/05/31 24

ケース 1: 変換処理 処理 日付文字列から日付オブジェクトを変換 分析観点 CPUリソースの割り当て GCの実行時間 変換にかかった処理時間 25

リソースと中断時間を確認 CPU が使えたかを確認 GC の実行時間を確認 26

検証環境 ハードウェア CPU 4コア メモリ 16GB Java VM ヒープ 4GB (New 3GB, Eden 2.88GB) 27

ケース 1: 変換処理のコード比較 ( 再掲 SimpleDateFormat formater = new SimpleDateFormat("yyyy/MM/dd"); Date date = formater.parse("2016/05/24"); 旧新 DateTimeFormatter formater = DateTimeFormatter.ofPattern("yyyy/MM/dd"); LocalDate date = LocalDate.parse("2016/05/24", formater); 28

リソース使用量 これまでの方法 Date and Time API 1 つのコアを使用できている GC 回数 30 回 GC 回数 33 回 29

ケース 1:GC 停止時間 80 60 40 20 ms 68.3 71.5 ms +4.6% ms 0 これまでの方法 Date and Time API 30

ケース 1: 処理時間 240 秒 180 120 180 秒 106 秒 60 0 これまでの方法 -41.2% Date and Time API 31

ケース 2: オブジェクトのサイズ 処理 1. 日付オブジェクトを生成 保持 1000 万オブジェクト 2. Full GC 分析観点 FullGC をした後のヒープ使用量 32

FullGC 後のヒープ使用量の確認 GC を選択 ヒープ情報を確認する 33

FullGC 後のヒープ使用量の確認 これまでの方法 Date and Time API 34

ケース 2: ヒープ使用量 400 MB 300 200 284 MB 284 ±0% MB 100 0 java.util.date java.time.localdate 35

まとめ 処理の流れはほぼ同一に実装可能 処理時間は40% 以上短縮 日付オブジェクトのヒープ使用量は同等 データ形式によっては増えるので注意が必要 36

2. Lambda 式 37

インターフェースについて インターフェース インターフェース 関数型インターフェース 1 つのメソッドのみ定義 本番実装 モック実装 38

インターフェースの実装方法 名前付きのクラスによる実装 class Impl implements Iface { @Override public void method1(){ // 処理 } } 匿名クラスによる実装 Iface o = new Iface() { @Override public void method1(){ // 処理 } }; 39

これまでの実装方法とその嫌な点 IntPredicate func = new Intpredicate(){ public boolean test(int param){ return param % 2 == 0; } }; 関心事 開発者は関心事だけに集中したい 40

Lambda 式とは 関数型インターフェースを簡単に実装する記法 ( 引数 )-> { 本体 } Stream APIとの親和性が高い Java SE 7 以前のインターフェースにも使える 実行時に多くのクラスをロード 41

Lambda 式への変換方法 IntPredicate func = new Intpredicate(){ public boolean test(int param){ return param % 2 == 0; } }; 関心事の抽出 IntPredicate func = param -> param % 2 == 0; 42

パフォーマンス分析 43

ケース : 実装方法による処理時間 処理 指定した数が素数かどうかを確認する あえて条件式をLambda 式で書いた方法を比較 分析観点 コンパイル数およびコンパイル時間 処理時間 44

素数とは 1 とその数自身のみで割りきれる数 (2,3,5,7,11, ) 素数の候補となる数 n を 2 から n-1 までの数で 割り切れなければ ( 余り 0) 素数である 本例では計算量増加のために 2 から n-1 まで全て計算します 45

コンパイル数の確認方法 コンパイルされたメソッド数 46

コンパイル時間の確認方法 コンパイルの情報から時間を算出 47

ケース : テストコード 旧 for (int div = 2; div < candidate; div++) boolean isprime = true; if (candidate % div == 0) isprime = false; IntPredicate func = div -> (candidate % div 新 == 0); for (int div = 2; div < candidate; div++) if( func.test(div) ) isprime = false; 48

リソース使用量 for 文 lambda 式 1 つのコアを使用できている ヒープ使用量 9.4MB ヒープ使用量 10.7MB 49

コンパイル数の確認 for 文 Lambda 式 66 メソッド 312 メソッド 50

コンパイル時間の比較 400 ms 371 ms 300 +140% 200 154 ms 100 0 for 文 Labmda 式 51

処理時間の比較 60 秒 55.0 秒 53.3 秒 45 30-3.1% 15 0 for 文 Labmda 式 52

まとめ コンパイルされるメソッド数が増加 コンパイル時間が増加 実行時間に比べると微増 処理時間は Lambda 式がわずかに短い 53

3. Stream API 54

繰り返し内で行われる処理 中間操作 ( 途中で行う処理 ) 情報のフィルタ 情報の変換 終端操作 ( 最終的に行う処理 ) 出力 コレクションに入れるなど 55

繰返し処理の種類 外部イテレータ :( 繰返しを外に書く ) for( 要素 e : 集合 ) 処理 内部イテレータ :( 繰返しを内部で隠蔽する ) 集合. 終端操作用メソッド ( 処理 ); 56

30 歳以上の社員名を集める実装例 Collection<Employee> empcol =...; List<String> list = new ArrayList<>(); 終端操作 for(employee e : empcol) if( e.getage() >= 30 ) list.add( e.getname() ); 外部イテレータ 中間操作 終端操作 57

これまでの実装方法の嫌な点 同じようなコードが多くメンテナンス性に欠ける for 文の前でコレクションを作って 中で add して スループットの向上が困難 1 回あたりの処理の粒度が小さいために速度向上が困難 マルチスレッドに分割する開発コストが高い 58

Stream API とは 内部イテレータによる繰返し処理 主に Collection インターフェースに定義 中間操作と終端操作を組み合わせて処理を実行 Fork Join Frameworkでパラレル化を実現 オブジェクトだけではなくプリミティブも使える 59

Stream API のメソッド例 中間操作 情報のフィルタ (filter) 情報の変換 (map) 終端操作 戻り値無し (foreach) 戻り値あり (collect など ) 内部イテレータ empcol.stream().collect( 処理 ); 60

Parallel Stream empcol.stream().parallel().collect( 処理 ); empcol.parallelstream().collect( 処理 ); システムプロパティで多重度を設定可能 java.util.concurrent.forkjoinpool.common.parallelism デフォルト値はコア数 61

繰返し処理のコード比較 旧 if( e.getage() >= 30 ) list.add( e.getname() ); List<String> list = new ArrayList<>(); for(employee e : empcol) List<String> list = 新 empcol.stream().filter(e->e.getage() >= 30).map(e->e.getName()).collect(Collectors::toList); 62

パフォーマンス分析 63

分析するケース 実装方法 1 スレッド数 for 文 1 Stream 1 Parallel Stream 1 2 3 2 64

検証環境 Oracle Exalogic X5-2 Intel Xeon CPU E5-2699 v3 2.3GHz 18 コア HT あり 2 プロセッサ 256GB メモリ 65

ケース 1: 実装方法ごとの処理時間 処理 from から to までにある素数を数える for 文 Stream Parallel Stream(1スレッド ) 分析観点 CPU 使用率 スレッドの処理割合 オーバーヘッドの確認 66

リソース使用量の確認 CPU が使えたかを確認 処理をしているスレッド数を確認 67

オーバーヘッドを確認 素数を判断するメソッドまでの処理階層を確認 68

for 文のコード int primenum = 0; for(int candidate=from; candidate<=to; candidate++) { } if ( PrimeUtil.isPrimeFunc(candidate) ){ } primenum++; 69

Stream API のコード Stream long num =IntStream.rangeClosed(from,to).filter(PrimeUtil::isPrimeFunc).count(); Parallel Stream long num =IntStream.rangeClosed(from,to).parallel().filter(PrimeUtil::isPrimeFunc).count(); 70

リソース使用量 for 文 Stream Parallel Stream 1 コアを使用できている 1 スレッドで処理をしている 71

実装方法による処理階層の深さ 30 20 10 実行までの階層が異なる 3 13 22 0 for 文 Stream Parallel Stream 72

実装方法による処理時間の比較 250 200 秒 201 208 212 秒秒秒 150 100 50 0 for 文 Stream Parallel Stream 73

ケース 2: パラレル化 処理 from から to までにある素数を数える 1~72スレッドまでスレッド数を増加 分析観点 CPU 使用率 スレッドの処理割合 処理時間 74

リソース使用量 (1 と 3 スレッド ) 1 スレッドを設定 3 スレッドを設定 CPU 使用率が 3 倍に増加 3 スレッドで分割している 75

1~18 スレッドの処理時間推移 100% 75% 50% 25% 0% 51.3% 33.6% 処理時間 18.2% 12.8% CPU 使用率 スレッド数増加に伴い処理時間は短縮 7.0% 1 2 3 6 9 18 スレッド数 76

リソース使用量 (18 と 36 スレッド ) 18 スレッドを設定 36 スレッドを設定 CPU 使用率が 2 倍に増加し 50% となる 77

18 と 36 スレッドの処理時間推移 100% 処理時間 CPU 使用率 75% 50% 25% 0% 56.8% 処理時間は約半減 18 36 スレッド数 78

リソース使用量 (36 と 72 スレッド ) 36 スレッドを設定 72 スレッドを設定 CPU 使用率が 2 倍に増加し 100% となる 79

36 と 72 スレッドの処理時間推移 100% 処理時間 CPU 使用率 75% 50% 25% 0% 90.5% 処理時間は微減 HT と CPU 使用率に注意 36 72 スレッド数 80

スレッド数毎の処理時間推移まとめ 100% 75% 50% 処理時間 CPU 使用率 25% 0% 7.0% 4.0% 3.6% 1 18 36 72 スレッド数 81

まとめ Stream APIのオーバーヘッドは微少 処理を簡単にパラレル化できる マルチコア マルチプロセッサの効果大 HT の効果は低く CPU 使用率に注意 82

全体のまとめ 処理時間は短縮 リソース使用量は微増 パフォーマンス以外にもメリット Java SE 8 の新機能をご使用ください 83

Safe Harbor Statement The preceding is intended to outline our general product direction. It is intended for information purposes only, and may not be incorporated into any contract. It is not a commitment to deliver any material, code, or functionality, and should not be relied upon in making purchasing decisions. The development, release, and timing of any features or functionality described for Oracle s products remains at the sole discretion of Oracle. 84

85