kなんとかの日記 このページをアンテナに追加

2010-06-09

Windows では Ruby の require が遅いらしい

| 08:44 |  Windows では Ruby の require が遅いらしいを含むブックマーク

Ruby の require が Windows では遅いという話。

このような現象が起こるのは一体なぜなのでしょうか?理由は、read_class_onefile_binmodeを見るとすぐに分かります。バイナリモードでは、Windowsの1.8.7と1.9.1は違いがないのです。バイナリモードとテキストモードの違いは、文字列のエンコード関係の処理を行うか否かですので、これにより、Windowsではファイル読み込み時のエンコード処理に時間がかかることがわかります。

require高速化:基準となるベンチマーク - ashelの日記

(強調はワシによる)

これって、File.open('file.rb', 'r') と File.open('file.rb', 'rb') の違いを言っているんだよね。だったらエンコードじゃなくて改行文字の変換 ("\r\n" → "\n") をするかどうかじゃないのかな。

あと requrie のベンチマークは、1 回の require だけで計測してるけど、これだと時間が短すぎて計測誤差が大きいように思うけど、そんなことない?複数回 require して計測できればそのほうがいい。

ashelashel 2010/06/10 01:15 突っ込みありがとうございます、確かにバイナリモードとテキストモードの違いは、1.8系においては改行の扱いだけなのですが、1.9系においては読み出した文字列をシステム標準のエンコードにエンコードするか(例えばWindowsではWINDOWS-31Jになります)、エンコード処理を行わずにASCII-8BITにするかという違いがあります。改行コードの処理は1.8系でもやっているはずですので、1.9系で違いが出るというのはエンコード処理かな…という推測でした。もう少し調べてみようと思います。
計測誤差に関しては、確かにあります。ただ、大きくて10%くらいでそれほど大きくなかったので、今回はぱっと見で平均に近い値を選びました。そのくらいの精度の計測だと思っていただけたらと思います。将来的には平均を取るような計測をしてみたいと思います。

kwatchkwatch 2010/06/10 07:59 元記事では『read_class_onefile_windows31jでMacでファイルをWindows-31Jとして読み込むベンチマークを行ってみたのですが、特に遅くありませんでした。』という説明があり、かつ改行文字の変換については触れていないことから、改行文字の変換が原因かなと推測しました。
計測誤差については、そもそもミリ秒以下のタイムが正しく計測できるのかを心配してます。

ちなみに文字コードとも改行コードとも関係ありませんが、require 'openssl' はすごい遅いです。

Connection: close