タグ

ブックマーク / blog.unnono.net (3)

  • absの罠

    こないだ、@kumagiさんがJubatusのクラスタリングのテスト書いたらNaNになるというので、デバッグしてたらabsにハマってたという恐ろしいバグを発見したので書いておきます。 C++で絶対値を求める関数は3つあります。 ::abs Cの関数でintを引数に取る ::fabs Cの関数でdoubleを引数に取る std::abs C++の関数でint引数とdouble引数でオーバーロードされている さて、大事なのは std::abs はオーバーロードされているので、doubleを渡すと::fabs相当の処理をしてくれる、ところが::absはCの関数なのでdoubleを渡してdoubleで結果を受け取ろうとすると、intにキャストして絶対値を計算してからdoubleに戻す、という恐ろしい挙動を示すことです。さて、std::absを呼んでるつもりで、absと書くとどうなるか。usingし

    craf
    craf 2014/02/16
  • pficommonをちょっとだけ紹介

    報道機関の発表の通り、10/27日に分散オンライン機械学習基盤Jubatusを発表しました。これに関しても書きたいことは山ほどあるのですが、来週Jubatus Workshopがあるので、それまでは秘密です(ウソです、聞かれたら答えます)。 さて、同時に公開されたのがpficommonです。これは、弊社内で使われていた便利ライブラリで、あまりの便利さにこれがないと開発できないため、Jubatusでも使われています(もちろんSedueでも)。そして、Jubatus公開に伴い公開となりました。pficommonは明日からでも使うべきなライブラリなので、先にこちらを紹介します。 pficommonは様々なライブラリからなる、複合的なライブラリです。 今日は個人的にお気に入りの、 xhtml_cgi json の2つを紹介します。 xhtml_cgi 実験用のコードなどを書くと、たくさんログを出力

    craf
    craf 2011/10/31
  • 動的型情報で仮想関数呼び出しを速くできるか

    C++は抽象化と高いパフォーマンスを両立させるにはtemplateを使うのがセオリーでした。そのため、標準ライブラリはtemplateを使っています。一方のJavaは、積極的に仮想関数を使っています。しかし、Javaは動的型情報を使った実行時インライン展開ができるため、C++と違って疎結合のまま高いパフォーマンスを出すことが出来ました。しかし、よく考えれば、C++でも実装クラスが限定されるなら、Javaと同様なことをハードコードすることでC++の仮想関数を高速ができるのではと思って試してみました。 結論から言うと、一応速くなりました。でも、インライン展開を抑制しなければいけないほどの効果が出るのは、かなり限定的のようです。 さて、順を追って説明します。 まず、C++では仮想関数を使うと遅くなるというはなし。C++で仮想関数を使うと、仮想関数テーブルが作られます。そして、関数呼び出しが起こる

    craf
    craf 2011/06/30
  • 1