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

Post on 02-Jul-2015

1.983 Views

Category:

Technology

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

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

@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のバージョン上げるだけでも早くなる

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

top related