Re: Ruby 1.9 で eval が遅いという話

なんというか、頭のいい人は結論だけ語って途中をすっ飛ばすから困る。

コンパイルフェーズを追加して仮想マシンで実行するようにしたら、3倍遅くなっても全く不思議ではないと思う。

Ruby 1.9 で eval が遅いという話 - odz buffer

仮想マシンの仕組みを知らない自分からすれば、『コンパイルフェーズを追加して仮想マシンで実行する』ことと『3倍遅くなっても全く不思議ではない』という結論の間には10光年ぐらいの開きを感じるけど、すでに仕組みを知っている人はその距離を何の苦もなくワープできるんだろう。

続きを読む

Re: interface と型チェックの有無 #3

だーかーらー、話題が違うって言ってるでしょうが。なんでこんなにグダグダつっかかってくるの?


こっちで話しているのは「JavaのinterfaceはObjective-Cのprotocolが元ネタであり、本質的に同じ機能である」という話。それを裏付ける資料があるのに、なんでそれらを無視してGoslingが参考にしたかどうかもわからない論文で話を進めるの?誰も型チェックが無意味とか言ってないでしょ?classもinterfaceも、Javaでは型として使われるけど、型チェックのない動的な言語にも導入されて実際に役に立っている。だからclassやinterfaceの機能は型チェックとは関係なく独立して存在できるし、両者は分けて考えることができる。前に書いたように、あなたが「interfaceと型チェックは不可分」と考えるならそれはあなたの自由。ただ自分とは考えが違いますね、で終了。これ以上話しても進展はなし。

続きを読む

Re: interface と型チェックの有無 #2

なんというかなぁ、sumim さんの紹介された論文のタイトルが「Interfaces for Strongly-Typed Objecect-Oriented Programming」だというのを忘れていませんか。

interface と型チェックの有無 #2 - odz buffer

いつから、suminさん紹介の論文に関する話題になったんでしょうか。


もともとは Gosling のプレゼン資料にあるように、また中の人の証言にあるように、JavaのinterfaceはObjective-Cが元ネタになっているよね、という話であり、またJavaのinterfaceとObjective-Cのprotocolは本質的に同じもんじゃね?という話です。「intefaceは型チェックを行うべきである」という意見はあってもいいと思いますが、それはここで扱っているのとは別の話ですよね(関連はしてますけど)。


正直、odz氏が何を焦点に話をしているのかよく分かりません。「interfaceでは型が重要である。だからJavaのinterfaceとObjective-Cのprotocolは本質的に違うものだ。」というのでしたら、はいそうですか、自分とは違いますね、で終了です。正直、それ以上コメントしようがありません。ゴメンナサイ。

続きを読む

Re: Ruby1.9で遅くなる項目

Ruby1.9での新VMの作者さんからコメントいただきました。わざわざありがとうございます。

たとえば,スレッドはネイティブスレッド化が問題になり,count_words は m17n の影響になります.

count_wordsが8倍以上遅くなるのは謎でしたが、m17nが原因ですか。しかしそうなると、他の文字列処理にも影響を与えるはずです。m17nが原因としてもここまで遅くなるとは思えないし、他のベンチマークは速くなっていてcount_wordsだけ8倍以上遅いというのもやはり解せないというのが正直なところです。

eval に関しては,よくぞ 3 倍で留めたな,という感覚です.ただ,erb は遅くなっていないため(ベンチマークがあります),その辺は問題ないかなぁ,という気もしています.

なるほど。erbではevalが遅くなる代わりに他の処理が速くなっているおかげで、結果として相殺されているんでしょう。そのため、ベンチマークは遅くなっていないかわりに大して速くもなっていない。


ちなみにevalが遅くなる理由って、結局なんなのでしょうか。byte code変換の分だけ1.8より遅くなるのは分かりますが、それだけで3倍の時間がかかるとは思えない。

例外処理については,「例外が発生すると遅い」です.コードを見るとわかると思いますが,例外を連発するベンチマークです.
逆に,例外が発生しないものについてはとても速くなっています.それを確認するベンチマークもあるので,ご参照ください.

これはいい戦略ですね。例外が発生する場合よりしない場合のほうがずっと多いですから、発生しない場合が高速化されるなら、発生する場合が2割程度遅くなるのは十分許容できるでしょう。

なんかCPUの投機実行を思い出しました。

IO まわりは native thread の絡みですね.ただ,この辺はまだまだチューニングできると考えています.

チューニングで速くなればいいんですが。

最近「エンタープライズRuby」というのを聞きますが、もしRubyが本当にエンタープライズを目指すのであれば、I/Oが遅いというのは良くないです(理由がなんであれ)。Native threadが原因ということがわかっているなら、native threadを使わないという選択肢も用意すべきではないでしょうか。


例えばApacheコンパイル時にthread modelを切り替えられます。それとはちょっと違いますがJavaJVMの起動時に-clientまたは-serverを指定することで実行モードを切り替えられます。同様に、Rubyでもコンパイル時または起動時にthread modelや正規表現エンジンを指定できる機能があると理想的です。


ただそこまで用意できるほどの開発リソースがRubyチームにあるかどうかわかりませんので、あくまで無責任な外野の一意見としてください。

Re: interface と型チェックの有無

基本的にみずしまさんのコメントにつきるんだけど、なんとために「視点による」と書いたのか分かってもらえてないようで。普通、比較するときは複数の面について比較するでしょ。ある面について違うから比較できないなんて話にはならないよ。

interface と型チェックの有無 - odz buffer

「比較」という言葉の意味が違うということでしょう。


自分がもともと

前に書いた通りですね。型チェックのあるなしで「違う」と見なすのであれば、静的な言語と動的な言語ではそもそも機能の比較ができないでしょう(どうせ全て「違う」と見なされるのだから)。

クラス、インターフェース、型チェックの有無 - usagidropの日記

で書いたときは、「本質的に同じかどうか」という意味で使ってます。「JavaのinterfaceとObjective-Cのprotocolは本質的に同じ機能だが、Rubyのmoduleは本質的に違う」と言及するようなことを「比較する」といってます。そのため、『複数の面について比較』ということはそもそもありえない。

続きを読む

Ruby1.9で遅くなる項目

Ruby1.8と1.9でのベンチマーク結果が公開されている。

緑の項目はRuby1.9で速くなった項目、赤い項目は逆に遅くなった項目である。また灰色の項目は、Ruby1.8がstack overflowでエラーになったか、Ruby1.9が遅すぎて表示されていないかのどちらかである。


これを見る限り、Ruby1.9では以下の項目が遅くなるようだ。


以下詳細。

続きを読む

チューリング賞モノの大発見: ソートアルゴリズムの計算量は O(n) だった!?

元ネタはここらへん。


読んでみたけど、なんかおかしくね?

このループの回数、見てのとおり常に一定です。上の22というのは、これだけ繰り返せば必ずdoubleの精度に収まるというマジックナンバーです。詳しくは奥村本をご覧ください。

404 Blog Not Found:アルゴリズム百選 - ベキ乗はO(1)でOK?

これはつまり、n に「doubleの精度」という制限をかけて、その範囲でなら O(1) だと主張しているようだ(だから『高々22回繰り返せば良い』といっているのだろう)。


しかしこれは間違いじゃないだろうか。この『22』というマジックナンバーは、n についての制限を取っ払ったらきっと増えていくんじゃない?もしそうなら、この『22』は定数ではなくなるので、O(1) だという根拠にはならなくなる。

続きを読む