torutkのブログ

ソフトウェア・エンジニアのブログ

「Javaパフォーマンス」を読む会第1回を開催して

6月20日(土)に「Javaパフォーマンス」を読む会(第1回)を開催しました。
http://www.javareading.com/bof/

参加者は17人とこの数年でもっとも多い人数となりました。2009年のScala本第1回の20人以来です。なお、Java読書会BOF開催以来の平均参加者数は12人です。

さて、オライリー本は表紙が動物の絵として有名ですが、その表紙の動物の説明も必ず書籍内(最後)に記載されています。Java読書会BOFでは最初に表紙の動物の説明から朗読します。
Javaパフォーマンス
今回の動物は、カザフスタンを生息地域とするレイヨウの一種サイガです。

議事録外のメモ

議事録は近日Java読書会BOFのWebサイトにアップされますので、ここでは当日議題(議論)しなかった気になるポイントのメモを書きます。

1.3.3 早まった安易な最適化

早すぎる最適化を戒める場所ですが、「パフォーマンスに悪影響を与えると分かっているコードを避ける」
点として、例外としてログ出力の引数における文字列結合・メソッド呼び出しの例を記載しています。
if文でログレベルを判定してからログ出力文を実行するコードを推奨しています。Java SE 8からはif文ではなくラムダ式でログ出力の引数に書く文字列結合・メソッド呼び出しを記載するというのもありかと思います。

2.1.1 マイクロベンチマーク

JMHの紹介があるかと思っていましたが登場しませんでした。
http://openjdk.java.net/projects/code-tools/jmh/

自分でマイクロベンチマークを書くのであれば、JMHを使って書くとウォームアップ、統計処理をJMHがやってくれるので楽です。

本のマイクロベンチマークでは、所要時間の取得にSystem.currentTimeMillis()を使っていますが、分解能に注意し、必要ならSystem.nanoTime()を使うとがいいかと思います。

  • currentTimeMillisはOSのシステムクロック更新レート(10ms間隔が多い)で精度が制約
2.3 不安定性を理解する

コードを変更したときに、変更前と後とで性能に違いが生じる(リグレッション)かどうかを検証するためにt検定を実施しています。一つ前の節でレスポンスタイムの算出にパーセンタイルを使用していました。
パフォーマンスを扱うなら、統計を少々知っておく必要があります。

3.1 オペレーティングシステム付属のツールと分析

Windowsでは、パフォーマンスモニタを使ってCPU使用率やメモリ使用量(Virtual, Working set, Privateなど)を測定していました。測定の度にGUIで設定/操作する必要があり面倒だなと思ってましたが、この本で、typeperfコマンドを紹介していました。いままで知りませんでしたが、これならコマンドラインから設定/操作できるので大変便利です。ぐぐるとあちこちに記事が出てくるので知らないのが不思議なくらいなのかもしれません。

3.1.4 ネットワークの使用率

Unixのツールでnetstatとnicstatを紹介しています。netstatCentOS 6には普通に入っていますが、nicstatは別途入手しないとなさそうです。

二次会

読書会は17:00に終わり、会場から駅に戻りつつ二次会の場所を探します。居酒屋は17:00から開く店が多いので、予約無しでも入るのに困ったことはありません。
今回は地元の焼き鳥系の店に行きましたが、人数が多くて、つながった席がないので、少しさ迷って渋谷餃子なるお店へ入りました。
2時間過ごして一人2300円でした。