RHGの逆襲 第2回

RHG の逆襲の第2回に参加してきました。
主催のYuguiさん、会場を提供してくださった よしおかさんとミラクル・リナックスさんに感謝。

結局朝のうちに前回のUstreamのログ3つめを 1/3 くらい聴いていたところで出発しないといけない時間になっていたことに気がついてあわてて出発。お昼御飯食べそこねた……。そんなことより、今回のテーマである第3章の st.[ch] の予習ができなかったので、会場に着いてから発表と平行して読んでいたのでひたすら聴くだけになってしまった。次はオブジェクトモデルのところなので、ちゃんと予習しておかないと。あのメタクラスの関係図は一応理解してるつもりなんだけど、ややこしいので毎度混乱するんですよね。つっこみでも入れられるようにならないと、聴いてるだけではちょっと心苦しい。

今回の内容は st.c のハッシュテーブルの実装について。st_tableはrubyインタプリタ内のいろんなところで多用されているので重要ですが、実はあんまり中身を見たことはありませんでした。Cで書いてるとハッシュテーブルって気がつくと何度も実装してるので、まあだいたい同じだろうなと思って、使い方を見るくらいでした。意外に1.9で手が入ってるんですね。そういえばハッシュの順序保持の話とかありましたね。まあでも基本的にはごく普通のCの話の範疇だったので、今回はそんなにRuby独特の内容ではありませんでした。次回はRubyのオブジェクトモデルのコア部分なのでけっこう楽しみです。

では今回の記録。あくまで自分用。Lingr にもリアルタイムに詳細なログが残されていたようなので、詳しい内容はそちらがいいと思います。

  1. RHGの逆襲 第二回 @ミラクリナックス
  2. まずは Yugui さんによる発表
    1. 意外なことに st.[ch]も .8 -> 1.9 で結構変化しているらしい。
    2. akrさん(?)による要素数が少ない時の埋め込みと、ハッシュの順序保持の絡みで変化している。
    3. FIND_ENTRY の PTR_NOT_EQUALマクロの名前が変な件。このマクロ、COLLISIONの為にちょっと複雑になってるのが混乱しやすい原因のような気がする。
    4. table->entries_packed が真のとき埋め込み戦略が使われている。
      1. table->bins に2つずつキーと値のペアで入れてる。つまりbinsのサイズの半分以下のエントリの時はハッシュテーブルじゃなくてタプルの配列として使っている。
      2. ただしタイプがtype_numhashの時だけ(多分比較が単純なので)。最大5個(MAX_PACKED_NUMHASH)まで。
    5. st_insert とか st_add_direct のところで、越えてしまったら改めてunpackしてからinsertしてる。
    6. remove する時に減っても埋め込みに変更したりはしてないみたい。
  3. よしおかさんが st.[ch] まわりについて、もう一度
    1. 埋め込みについて
      1. キャッシュに乗りやすいので高速になるんじゃないかな?
      2. しかしベンチマークは取ったのか?
        1. akrさんの動機はメモリ使用量が問題じゃない?
      3. それにしても、共通のベンチマークがあることは重要じゃないか?
  4. ID とシンボル
    1. M17Nで大変になってる。
  5. さわださんが引き続き、ハッシュが順序を保持するようになった件
    1. table_entry の fore back で循環双方向リストになった。
    2. 1.9 で st_reverse_foreach も増えてる。
  6. yuguiさんの3つの謎
    1. M17N
    2. strhash の 素数かけ算
    3. hash/cmpの戻り値intの謎
  7. artonさんが登場
    1. 拡張ライブラリ作る時にst.cが大事だよという話。
    2. rb_hash も使えるけど……
    3. 独自の型(Cの型)を使ったハッシュが欲しい時はst_table_typeを自前の関数で登録したい。
    4. また、Hashをフリーズしたいんだけど、拡張ライブラリ側からは中身のst_tableを直に触るというテクニック。
    5. なので st.c の使い方をマスターするといいでしょう。。。
    6. それにしてもさらっと登壇してするすると話題が出てくるartonさんの余裕さがかっこよすぎる。
  8. 次回の予習 第4章「クラスとモジュール」
    1. 特異クラスの話。
    2. 特異クラスと特異メソッド(クラスメソッドは特異メソッド)
    3. Object, Class, Module のブートストラップとか。関係図のこと。
    4. Fooクラスは直接のClassクラスの直接のinstanceじゃないよ。(Foo)なる無名の特異クラスが常に居るよ。
    5. モジュールのincludeの話。
    6. この関係図が頭に入っていれば、分量は多いけど読み易いんじゃないか。

この後懇親会にも参加。おもしろい話を聴いて、後でぐぐっておこうと思ってたことがあったと思うのですが、お酒も入ってたのでなんか思い出せなくなっちゃいました。メモしておかないとだめですね。あっ、そうだ、1.9のThreadのスイッチのコストが軽くなってるというのを教えてもらったんだった。今 1.8 で rb_thread_schedule が(多分スタックのコピーあたりだと思う)やたら時間喰ってるので、その点だけでも新しいスレッドの実装は魅力的だなー。

あーあと、前回のオブジェクトへの埋め込みもそうですが、効率が良くなってるていうのはわかるんだけど、ちゃんと評価しようと思ったら、代表的なベンチマークが存在して、それで評価してどうなったという議論ができるようにしておくのがいいよねという話。テストもそうですよね。そういうものがあると、新規参入しやすくなりますよね。結構細かいところで人手がないからやってないだけっていうものがごろごろしてるらしいので。

去年はほとんど勉強会への参加ができなかったのが残念だったのですが、やっぱりこういう場所に出掛けるとちょっと元気になるので、できるだけいろいろ行ってみたいと思います。もうしばらくは仕事に沢山時間を注ぎ込まないといけなさそうですが……。てかこの週末休んで(?)しまったけど他の人は出社してるんだよな……。