ruby-trunk-changes r37563 - r37598

今日は String#index などの高速化、Bignum の乗算アルゴリズム Toom3 の修正、配列をFIFOのように使うケースでの配列の共有バッファの再利用するようにする高速化、そしてハッシュ関数に siphash というアルゴリズムが導入されるというかなり濃い内容の変更が多くありました。

naruse:r37563 2012-11-08 19:04:24 +0900

r37487 で Net::InternetMessageIO#each_crlf_line で行を分割するための正規表現から n オプションを削除しましたが、正規表現自体も \r でだけからなる改行でも切り出されるように修正されています。 [ruby-dev:46425] [Bug #7278]

glass:r37564 2012-11-08 22:40:33 +0900

String#index や String#split で使われている rb_memsearch() という関数の、1バイト単位で文字を検索する処理を for ループを使って書いているところを memchr(3) にまかせるように書き換えています。 memchr(3) を使うほうが高速化されるそうです。 [ruby-dev:45397] [Feature #6173]

mrkn:r37565 2012-11-09 05:38:53 +0900

r31695多倍長整数の乗算に Toom3 というアルゴリズムを利用するようにしていたのですが、このアルゴリズムに計算結果が間違う不具合があったそうなので一時的に Karatsuba という元々使っていたアルゴリズムに切り替えています。でもすぐに Toom3 の修正が r37567 で入ったようです。 [ruby-core:48552] [Bug #7242]

svn:r37566 2012-11-09 05:38:58 +0900

version.h の日付更新。

mrkn:r37567 2012-11-09 07:38:03 +0900

r37565 で一時的に無効にされた Toom による多倍長整数の乗算の不具合を修正して、また Toom3 を利用するように戻しています。 [ruby-core:48552] [Bug #7242]

zzak:r37568 2012-11-09 09:28:41 +0900

IO.new の rdoc の空白とタブの置き換えをしています。体裁のみの修正です。 [ruby-core:48052] [Bug #7179]

zzak:r37569 2012-11-09 09:30:55 +0900

r37565 と r37567 の ChangeLog エントリの日付と typo の修正をしています。

knu:r37571 2012-11-09 12:34:08 +0900

alloca(3) は gcc に -ansi オプションをつけると __builtin_alloca に置き換えられていて、libc に alloca が存在しない環境でリンクエラーになるので gc.c や eval_intern.h で個別に重複して書かれていた環境によって適切に alloca() の宣言を切り替える対処を inclue/ruby/ruby.h に書いて常に有効になるようにしています。詳しいことがチケットにも書かれていますのでご参照を。 [ruby-core:49086] [Bug #7307]

naruse:r37572 2012-11-09 13:06:45 +0900

String#crypt で crypt(3) が NULL を返した時のことを想定して SystemCallError を発生させるようにしています。 最新版の glibc (2.16?)で crypt(3) が NULL を返すことがあったそうです。 [ruby-core:49106] [Bug #7312]

knu:r37576 2012-11-09 15:25:02 +0900

標準添付ライブラリの Shellwords#shelljoin の rdoc の記述されていたサンプルコードを修正しています。

knu:r37577 2012-11-09 15:28:00 +0900

標準添付ライブラリ Shellwords#shellescape の rdoc のサンプルコードに grep(1) のパターンに指定する文字列に使う例を追加しています。

nobu:r37579 2012-11-09 15:57:42 +0900

r37338 でパーサの状態を enum 定数からビットフラグによる表現に変更していたのでそれに追随して状態のチェックをしている所を修正しています。テストはないのでおそらく複数のビットを OR して使わない状態のみチェックしていたので実際には問題がなかったのでしょう。

zzak:r37580 2012-11-09 16:03:13 +0900

拡張ライブラリ bigdecimal の rdoc の追記や体裁の修正をしています。 [ruby-core:49047] [Bug #7305]

nobu:r37581 2012-11-09 16:08:38 +0900

配列のバッファ共有の仕組みに変更を加えて、共有している配列が1つだけの時の変更時にバッファを再利用してメモリ確保を抑えるようなしくみが入れられています。ちょっとちゃんと読めているか不安ですが肝は共有している親の配列の length に capa (つまりバッファ全体のサイズ)を入れておいて、rb_ary_modify() で内容を変更する時に可能ならそのバッファをそのまま変更する配列で再利用するようにしています。この処理が使えるかどうかの判定に共有数とサイズと共有バッファの capa との比較があるのですが、このサイズの比較(capa >> 1 より大きい)というのは、サイズが減る場合はバッファを取り直したらメモリ効率が良くなるからという意味なんでしょうか。そうだとしたらここの係数はパラメータ化されてたほうがいいかも、と思いましたが bit shift でやるのは実行速度のことを考えているのかもしれないですね。 [ruby-core:45818] [Feature #6638]
あと ChangeLog のエントリに重複があるようです。

nobu:r37582 2012-11-09 16:08:42 +0900

Array#push と Array#<< で配列が共有されていて、共有数が1である時に、直接共有しているバッファに要素を追加することで不要なコピーを抑制しています。 直前の r37581 とあわせて Array をキュー(FIFO)のように操作する時の処理を効率化するためのものです。 [ruby-core:45818] [Feature #6638]

nobu:r37583 2012-11-09 16:08:45 +0900

Array#[ ] や Array#insert で配列の末尾に要素を追加する時も r37582 の push の時と同様に共有数1 の時に共有バッファに直接要素を追加するようにする最適化を行うようにしています。 [ruby-core:45818] [Feature #6638]

nobu:r37584 2012-11-09 16:08:50 +0900

Array#unshift も同様に共有バッファを再利用して直接要素を移動&追加するようにしています。 [ruby-core:45818] [Feature #6638]
この r37581 から r37584 の一連の Array の共有バッファの変更はコアな部分で修正内容もなかなか難しいので要チェックですね(レビューして欲しい的な意味で)。

nobu:r37585 2012-11-09 16:12:00 +0900

siphash.c というソースファイルを追加して siphash という疑似乱数関数のアルゴリズムを利用して rb_memhash() を実装するようにしています。これはコア内および拡張ライブラリのあちこちでハッシュ値を計算するために利用されていて、siphash の内容はさっぱり読んでおりませんが、つまりハッシュの強度を強めているとかそういうことでしょう。おそらく近く何かアナウンスがあると思います。 stay tuned.

naruse:r37587 2012-11-09 17:11:44 +0900

r37586 で追加された shiphash.c で C++ 流の行コメントが使われていたので C90 スタイルのコメントに置き換えています。

naruse:r37588 2012-11-09 20:04:05 +0900

r37583 で末尾を越えた位置に要素を追加するケースを考慮していなかったのを修正しています。

zzak:r37589 2012-11-09 20:20:31 +0900

r37580 と r37588 の ChangeLog エントリの typo とフォーマットを修正しています。

kazu:r37590 2012-11-09 22:02:16 +0900

r37466 と r37571 の ChangeLogtypo というか余分な空白の除去。

nobu:r37591 2012-11-09 23:02:31 +0900

siphash.c で 256bit (32byte)の定数を char[32] から int64_t[4] に変換するのをキャストでやっていたのを union を使う方法にしてコンパイラの警告除去しています。

nobu:r37592 2012-11-09 23:02:34 +0900

r37591 のぶんの ChangeLog のエントリを追加しています。

nobu:r37593 2012-11-09 23:05:11 +0900

random.c というかそこから #include されている siphash.c で使われている BYTE_ORDER や BIG_ENDIAN, LITTLE_ENDIAN といったマクロの定義を WORDS_BIGENDIAN を利用して定義するようにしています。 siphash.c に直接書けばいいような気もしますがなぜ random.c 側に書いたんでしょう。

nobu:r37594 2012-11-09 23:33:11 +0900

標準添付ライブラリ erb で ERB#run や ERB#result のデフォルトの引数の bindings を TOPLEVEL_BINDING にしていて、複数の Thread で同時に利用されると干渉する恐れがあったので TOPLEVEL_BIDING.dup で複製したものをデフォルトで用いるようにしています。 [ruby-core:47638] [Bug #7046]

nagachika:r37595 2012-11-09 23:44:05 +0900

r37581 から r37584 の ChangeLog のエントリが重複していたので削除しています。

usa:r37597 2012-11-10 00:19:56 +0900

siphash.h で inttypes.h が存在しない時も #include しようとしていたので HAVE_INtTYPES_H のチェックを追加しています。

svn:r37598 2012-11-10 00:20:01 +0900

version.h の日付更新。