Upload
satoshi-kubo
View
1.983
Download
0
Embed Size (px)
Citation preview
泥沼の中のパフォーマンスチューニング
@megascus
• twitter id: @megascus
• JJUG幹事
• JJUG幹事募集中
自己紹介
普通のパフォーマンスチューニング
•メモリチューニングとか・・・・・・
•割愛
パレートの法則
•全体の八割は二割の労力で解消することが出来る
今回の内容
•二割の労力で解消できた八割以外の内容のお話
•業務系SE()が作ったアプリのチューニング
二割に対して労力を注ぎ込む
やる必要がなければやらなくてもよい
余分なオブジェクト生成
AutoBoxingが有名
List<Integer> is = getSomeList();
for (int i : is) { //ここでAutoBoxingが //do something.}
Long値
long l = Long.valueOf("10000000000");
Long値
long l = 10000000000; //コンパイルエラーlong l = 10000000000l; //lを付ければOK
SimpleDateFormat
SimpleDateFormat
•遅いライブラリとして有名
•スレッドセーフでもない
SimpleDateFormat
• commonsに互換で早くてスレッドセーフなライブラリがある
• commonsのライブラリが使えない場合はThreadLocalに入れてしまう場合が
SimpleDateFormat
• ThreadLocalとかわけのわからんものは業務チームでは使用禁止
•実際にJava EEとかでThreadLocal使うとAPサーバーによってはメモリリークが発生する
•そもそも、国際化とか考えてないのに動的に日付書式を変えられるライブラリを使用する意味ある?
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 = ......//省略 }
SimpleDateFormat
•何だかんだでベタ書きが一番早い()
謎のロジック
謎のロジック
public ImutableClass execute(String... args) { ImutableClass ic = ImutableClass.getInstance(); ic.doSomething(args); return ic; }
謎のロジック
public ImutableClass execute(String... args) { ImutableClass ic = ImutableClass.getInstance(); ic.doSomething(args); return ic; }
イミュータブルなのに戻り値が捨てられている
謎のロジック
•ブラックボックステストだと不要な処理が行われていることに気が付かない
リフレクション
呼び出すたびにリフレクション
public SomeClass execute(String className) throws ReflectiveOperationException { Class<SomeInterface> clazz = (Class<SomeInterface>) Class.forName(className); SomeInterface i = clazz.newInstance(); return i.execute();}
リフレクションを減らす
static final Map<String, Class<SomeInterface>> cache;static { cache = new HashMap<>(); // リフレクションでクラスを生成しcacheに入れる} public SomeClass execute(String className) throws ReflectiveOperationException { return cache.get(className).execute();}
設定ファイル
設定ファイル
•呼び出すたびにXMLの設定ファイルを読み込みXMLをパース、オブジェクトに変換する
•適切にキャッシュしましょう
キーでリストから探す
キーでリストから探す
static List<SomeClass> list = SomeClass.getList();
SomeClass getById (Integer id) { for (SomeClass someClass : list) { if(someClass.getId().equals(id)) { return someClass; } } return null;}
キーでマップから探す
static Map<Integer, SomeClass> map = SomeClass.getMap();
SomeClass getById(Integer id) { return map.get(id);}
Collection Framework
•適切に使いましょう!
• Set、List、Deque、Map
• ArrayListとLinkedListとか
最後に
•今回の内容をやっても早くなるとは限りません
• JVMのバージョン上げるだけでも早くなる
•パフォーマンスチューニングするときは極力事前事後の測定をしましょう