文字コード変換を行わせないような強引なコーディングを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と遜色ない実行速度のようである。
次は最適化した場合を実施して、比較してみよう。