@dmikurube あらー、残念です > 一時文献。見つけたら是非教えてください :-) 適当に書いてるときは、あんまりパフォーマンス気にしないんですけど、たまに頑張らないといけない時に、という話でした。 個人的には JIT は夢を感じるんで、頑張ってほしいんですけどねー。
2013-07-02 23:30:16devirtualize 自体というよりは、多段の仮想関数呼び出しを分岐なしでいかにぶち抜くか、というのがポイントだと理解しているけど、そのへんも最近では事情違うのかな
2013-07-02 23:32:14@dmikurube あ、まさにその asm 職人 v.s. Compiler みたいな世界が面白いなぁと思います。ただ、現状 Java v.s. C++ みたいのってあんまり考えなきゃいけない複雑度変わらないような・・・。
2013-07-02 23:32:58@phoenixstarhiro JIT本だれか書かないのーってその辺のきつねさんに振ったことがあるような気がするw
2013-07-02 23:33:15確かに「__builtin_expect とか __builtin_prefetch とかくらいまでは普通」だと、それ手動で動的情報を静的コードにエンコードしているようなものだから、その上でJITで何を、ということになるとなかなか高度である。
2013-07-02 23:35:00@phoenixstarhiro WebKitそんなにいじってない側の人ですが、「ここでっ...ここで仮想関数使わせてくれたらコード量が1/10になるのに...っ!」ってことが2, 3回あったですはい。でもあれほんとに仮想関数入れたら遅くなったのかなあ、というのは未検証 (^^;
2013-07-02 23:38:56GCC の devirtualization 関連の missed optimization バグ報告は CERN の中の人がちょこちょこ報告してたので,中でどういう要求があったのかは知りたい.まー,単に報告者個人の趣味だった可能性も相当程度あるけど.
2013-07-02 23:39:47@eomole @nya3jp なんとなく "JIT" の定義的な話に入りそうな感じですが、それこそ最新事情を追いかけていないのでなんとも言えない (でもそれは直感的な語彙としては普通に just-in-time optimization の範疇に入るような気がしますが)
2013-07-02 23:44:46CERN の中の人がちょこちょこ報告してたバグの種類として他に ELF visibility 関連があるので,仮想関数(動的多態)を依存関係切るツールとして見た場合,どちらも相当程度の規模のコードベースが背景にあると仮定すればしっくりくるので,そういう感じかなー? 知らんけど?
2013-07-02 23:45:13仮想関数呼び出しのオーバーヘッドとかウソもいいところでしょ。もちろん多重継承しまくったらアレだけど、Javaだとできないんだから間接参照一回の世界での比較だよね。
2013-07-02 23:46:03Java vs C++軸はJIT vs 静的コンパイル軸とはそれなりにずれてると思う。Java の場合、大元の言語が先でJITが後だったので、「JITを最大限に言語生産性に生かした言語」だとどうなるんだろう。
2013-07-02 23:47:43LinuxでstaticコンパイルしてPLT抜いてもほとんどスピード変わらないんだから間接参照1回抜いて速くなるわけが。
2013-07-02 23:47:52考えてみれば性能を気にするJIT言語とかほぼ書いたことないや……
2013-07-02 23:47:53頑張ったらJITで速くなるケースって多分いろいろあるんだけど、JVMの場合はエラーが起きたときにスタックトレースが正しく取れる、って制約加えるだけでほとんど何もできなくなる印象。
2013-07-02 23:50:18C++ は別に静的コンパイルとか特に仮定してないよ,あれはただ単に実装詳細だよ,派.まだ歴史的・技術的蓄積は浅いとはいえ, LLVM にして JIT 実行もできるご時世だし特に.
2013-07-02 23:52:48個人的な理解では「静的コンパイルできなくなるような言語仕様はいれない」という視点は,直接は持ってないような気がする.「使わない機能のためにオーバーヘッドが掛からない」という視点に,あと,「既存のリンカなどの資産を継承する」という視点はおそらくある.
2013-07-03 00:06:03ある作業を後段のステップに遅らせれば遅らせるほどリッチな情報が取れるのは当たり前で,これは別に最適化に限らず,たとえばコンパイラとリンカを一体化すれば C++ の規格の "no diagnostic is required" という言い回しがされている部分の多くが改善する.
2013-07-03 00:10:11レジスタ割り当てアルゴリズムが最強ならインライン化して遅くなるケースは基本、無いはずだけど実際にはそうならないし。
2013-07-03 00:11:37仮想関数については実際問題最近はどこまで消えるん? 常にほぼ0だというのは今でもさすがに無いと思うのだけど。とりあえず2年前くらいの時点で目に見えて影響があるケースを解説した記事が1, 2個あった気がするけど、その後そんなに変わったん?
2013-07-03 00:12:38何が言いたかったんだっけ? えーっと,C++の規格の文言は,従来のコンパイル・リンク・実行というモデルを想定はしているだろうけれど,コンパイルやリンクを後段のステップに遅らせる実装を排除していないので,observable behaviorが規格に準拠してさえいればやりたい放題.
2013-07-03 00:13:35