泥沼の中のパフォーマンスチューニング #jjug

30
泥沼の中の パフォーマンスチューニング @megascus

Upload: satoshi-kubo

Post on 02-Jul-2015

1.983 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: 泥沼の中のパフォーマンスチューニング #JJUG

泥沼の中のパフォーマンスチューニング

@megascus

Page 2: 泥沼の中のパフォーマンスチューニング #JJUG

• twitter id: @megascus

• JJUG幹事

• JJUG幹事募集中

自己紹介

Page 3: 泥沼の中のパフォーマンスチューニング #JJUG

普通のパフォーマンスチューニング

•メモリチューニングとか・・・・・・

•割愛

Page 4: 泥沼の中のパフォーマンスチューニング #JJUG

パレートの法則

•全体の八割は二割の労力で解消することが出来る

Page 5: 泥沼の中のパフォーマンスチューニング #JJUG

今回の内容

•二割の労力で解消できた八割以外の内容のお話

•業務系SE()が作ったアプリのチューニング

Page 6: 泥沼の中のパフォーマンスチューニング #JJUG

二割に対して労力を注ぎ込む

やる必要がなければやらなくてもよい

Page 7: 泥沼の中のパフォーマンスチューニング #JJUG

余分なオブジェクト生成

Page 8: 泥沼の中のパフォーマンスチューニング #JJUG

AutoBoxingが有名

List<Integer> is = getSomeList();

for (int i : is) { //ここでAutoBoxingが //do something.}

Page 9: 泥沼の中のパフォーマンスチューニング #JJUG

Long値

long l = Long.valueOf("10000000000");

Page 10: 泥沼の中のパフォーマンスチューニング #JJUG

Long値

long l = 10000000000; //コンパイルエラーlong l = 10000000000l; //lを付ければOK

Page 11: 泥沼の中のパフォーマンスチューニング #JJUG

SimpleDateFormat

Page 12: 泥沼の中のパフォーマンスチューニング #JJUG

SimpleDateFormat

•遅いライブラリとして有名

•スレッドセーフでもない

Page 13: 泥沼の中のパフォーマンスチューニング #JJUG

SimpleDateFormat

• commonsに互換で早くてスレッドセーフなライブラリがある

• commonsのライブラリが使えない場合はThreadLocalに入れてしまう場合が

Page 14: 泥沼の中のパフォーマンスチューニング #JJUG

SimpleDateFormat

• ThreadLocalとかわけのわからんものは業務チームでは使用禁止

•実際にJava EEとかでThreadLocal使うとAPサーバーによってはメモリリークが発生する

•そもそも、国際化とか考えてないのに動的に日付書式を変えられるライブラリを使用する意味ある?

Page 15: 泥沼の中のパフォーマンスチューニング #JJUG

SimpleDateFormatをベタ書きで

public String format(Date d) { Calendar cal = Calendar.getInstance(); cal.setTime(d); StringBuilder build = new StringBuilder(); build.append(cal.get(Calendar.YEAR)).append("/"); int month = cal.get(Calendar.MONTH) + 1; if(month < 10) {build.append('0');} build.append(month).append("/"); int dayOfMonth = ......//省略 }

Page 16: 泥沼の中のパフォーマンスチューニング #JJUG

SimpleDateFormat

•何だかんだでベタ書きが一番早い()

Page 17: 泥沼の中のパフォーマンスチューニング #JJUG

謎のロジック

Page 18: 泥沼の中のパフォーマンスチューニング #JJUG

謎のロジック

public ImutableClass execute(String... args) { ImutableClass ic = ImutableClass.getInstance(); ic.doSomething(args); return ic; }

Page 19: 泥沼の中のパフォーマンスチューニング #JJUG

謎のロジック

public ImutableClass execute(String... args) { ImutableClass ic = ImutableClass.getInstance(); ic.doSomething(args); return ic; }

イミュータブルなのに戻り値が捨てられている

Page 20: 泥沼の中のパフォーマンスチューニング #JJUG

謎のロジック

•ブラックボックステストだと不要な処理が行われていることに気が付かない

Page 21: 泥沼の中のパフォーマンスチューニング #JJUG

リフレクション

Page 22: 泥沼の中のパフォーマンスチューニング #JJUG

呼び出すたびにリフレクション

public SomeClass execute(String className) throws ReflectiveOperationException { Class<SomeInterface> clazz = (Class<SomeInterface>) Class.forName(className); SomeInterface i = clazz.newInstance(); return i.execute();}

Page 23: 泥沼の中のパフォーマンスチューニング #JJUG

リフレクションを減らす

static final Map<String, Class<SomeInterface>> cache;static { cache = new HashMap<>(); // リフレクションでクラスを生成しcacheに入れる} public SomeClass execute(String className) throws ReflectiveOperationException { return cache.get(className).execute();}

Page 24: 泥沼の中のパフォーマンスチューニング #JJUG

設定ファイル

Page 25: 泥沼の中のパフォーマンスチューニング #JJUG

設定ファイル

•呼び出すたびにXMLの設定ファイルを読み込みXMLをパース、オブジェクトに変換する

•適切にキャッシュしましょう

Page 26: 泥沼の中のパフォーマンスチューニング #JJUG

キーでリストから探す

Page 27: 泥沼の中のパフォーマンスチューニング #JJUG

キーでリストから探す

static List<SomeClass> list = SomeClass.getList();

SomeClass getById (Integer id) { for (SomeClass someClass : list) { if(someClass.getId().equals(id)) { return someClass; } } return null;}

Page 28: 泥沼の中のパフォーマンスチューニング #JJUG

キーでマップから探す

static Map<Integer, SomeClass> map = SomeClass.getMap();

SomeClass getById(Integer id) { return map.get(id);}

Page 29: 泥沼の中のパフォーマンスチューニング #JJUG

Collection Framework

•適切に使いましょう!

• Set、List、Deque、Map

• ArrayListとLinkedListとか

Page 30: 泥沼の中のパフォーマンスチューニング #JJUG

最後に

•今回の内容をやっても早くなるとは限りません

• JVMのバージョン上げるだけでも早くなる

•パフォーマンスチューニングするときは極力事前事後の測定をしましょう