12章Java SEのAPIのパフォーマンス
この章では、工夫によってパフォーマンスを上げられるようなJava SEのAPIを取り上げます。JDKにはこのような実装上の詳細な事柄が多数あります。これらの点で実際にパフォーマンスの問題が発生しているのを、筆者は(自分が書いたコードも含めて)何度も見たことがあります。
12.1 バッファー付き入出力
2000年に筆者がJava Performance Groupに参加したちょうどその頃に、筆者の上司がJavaのパフォーマンスに関する最初の書籍を出版しました。当時はバッファー付き入出力が最もホットなトピックの1つでした。それから14年が過ぎて、この話題は時代遅れであり本書で取り上げるには値しないと筆者は思い始めていました。しかし本書に着手した週に、筆者が関係していた2つのプロジェクトで、バッファーのない入出力がパフォーマンスを大きく損ねているバグが同時に発生しました。そして数ヶ月後に本書のサンプルコードを作成している時、筆者は最適化の効果が少ないことに悩んでいました。そこで筆者はようやく、入出力を正しくバッファーしていなかったということに気づきました。
本書でも、バッファー付き入出力のパフォーマンスについて考えてみることにします。InputStream.read()
とOutputStream.write()
の各メソッドでは、1バイト単位で入出力が行われます。アクセス先のリソースにもよりますが、これらのメソッドはとても低速になることがあります。このread()
メソッドを使う場合、FileInputStream
はきわめて低速です。データを1バイト読み出すたびに、カーネルへの呼び出しが発生してしまいます。幸運なことにほとんどのオペレーティングシステムでは入出力がバッファーされているため、 ...
Get Javaパフォーマンス now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.