雨谷の日和

過去20年で2,700を超えるアニメの第1話だけは見続けた僕のお勧めアニメがハズレなはずがない

Javaでのバイナリ出力(最適化無)

文字コード変換を行わせないような強引なコーディングをJavaで行ってみて、実際にどうなるかを見てみよう。
通常こうした形で文字列を扱うことは、Javaでは推奨されていない。今回は比較のための特殊な場合だと思って頂きたい。

import java.io.FileOutputStream;
import java.io.OutputStream;
class Test {
  public static void main(String args) throws Exception {
    byte buf = "Hello world!\n".getBytes();
    OutputStream out = new FileOutputStream("j_log.txt");
    for(int i = 0; i < 10000000; ++i)out.write(buf);
  }
}

文字ストリームであるWriter系の出力を止め、バイトストリームを用いる。
出力する文字は、予めバイト列に変換しておく。これはループの外の1度のみの処理なので、Profileにはほとんど影響しないことが予想される。
最適化せずに実行した結果は以下のようになった。

Flat profile of 17.24 secs (1103 total ticks): main

  Interpreted + native   Method                        
 91.4%     7  +  1001    java.io.FileOutputStream.writeBytes
  4.0%    44  +     0    java.io.FileOutputStream.write
  3.4%    38  +     0    Test.main
  0.1%     1  +     0    java.util.jar.Attributes$Name.isValid
 98.9%    90  +  1001    Total interpreted

  Thread-local ticks:
  0.1%     1             Interpreter
  0.5%     6             Unknown: running frame
  0.5%     5             Unknown: thread_state


Global summary of 17.24 seconds:
100.0%  1103             Received ticks
  0.1%     1             Interpreter
  1.0%    11             Unknown code

約154秒もかかっていた処理が、約17秒で終わってしまった。
最適化したときに比べればまだ遅いが、それでも最適化していないCと遜色ない実行速度のようである。
次は最適化した場合を実施して、比較してみよう。