タグ

ブックマーク / shinh.hatenablog.com (9)

  • Rubyで実装し直したFixnum#timesの方が速い

    http://d.hatena.ne.jp/Gimite/20080802/1217647596 でちょっと思い出した、前からやってみたかった実験をやってみたらだいたい思った通りな感じだった。 class Fixnum def times i = 0 s = self while i < s yield i i += 1 end end end s = 0 1000000.times{|i| s+=i } p s みたいなコードを書くわけです。ご存知の通り、 Ruby の Fixnum#times は C 言語で実装されてます。それを Ruby で実装しなおしたら当然遅くなります。ホント時間のムダです。実はそうでもないんです。 > time ruby1.9 bench.rb 499999500000 ruby1.9 bench.rb 0.10s user 0.00s system 91%

    Rubyで実装し直したFixnum#timesの方が速い
    Wacky
    Wacky 2008/08/13
    タネはこう、あまりサックリとは説明できないんですけど、 Ruby => C => Ruby って往復がそれなりにコストかかる、っていう話かと思います。
  • プログラムは ASCII で書くべきだよ - 兼雑記

    ふと、 main = 195; とかやって喜んでいた私はバカだったんじゃないかと思いました。 Binary 2.0 などとうかれてほとんどバイナリのコードをゴルフに submit してたのはどうなのか、と。プログラムは ASCII で書くべきだったんじゃないでしょうかと。それもメンテナンスしやすいように、 isprint が true を返すような文字で書くべきではないのか、と。 とりあえず Hello, world! 書きました。そのままコピペでたぶん最近の x86 & linux & glibc なら動きます。それ以外の環境では無理です。 char main[]="`j X$@P[PYPPPPX4.4 PZUX, P^XH,=)F(P_X3F()8)8@)8@@)8)8@PYX@@@@CQBaGHello, world!\n"; int 0x80 とか ret とか ASCII の範囲

    プログラムは ASCII で書くべきだよ - 兼雑記
    Wacky
    Wacky 2006/12/19
    プログラムは ASCII で書くべきだよ
  • 実行回数を記憶している実行ファイル - 兼雑記

    http://d.hatena.ne.jp/alohakun/20061113 を見てて、騙されてはいけない! id:yupo5656 さんは僕らの自由を奪う詐欺師だっ…とか思ったので適当に。 ELFヘッダは e_ident という 16Byte のメンバから始まっています。ここは magic を記録する場所です。 magic については Binary Hacks #4 見てね☆とかそんな感じで。 でまぁ、最初の 4Byte 、 "\x7fELF" までは、無いと動きませんし、しぶしぶつけるわけですが、残りの 12Byte は "Hello world\n" を埋めるための空間です…と思ってたらなんか プロゴルファーは実行コード埋めてた というようなのが今までの粗すぎる粗筋なのですが、たしか高林さんがファイルのパーミッションか時刻情報あたりでカウンタ実現してたなぁ(でもURL見つからないな

    実行回数を記憶している実行ファイル - 兼雑記
    Wacky
    Wacky 2006/11/18
    ELFヘッダは e_ident という 16Byte のメンバから始まっています。ここは magic を記録する場所です
  • forth.rb - 兼雑記

    http://haskell.g.hatena.ne.jp/mr_konn/20060919/1158656918 Haskell 製の FORTH に非常に大人気ない対抗をしてみました。 @v={ '+'=>proc{@s<<@s.pop+@s.pop}, '-'=>proc{@s<<-@s.pop+@s.pop}, '*'=>proc{@s<<@s.pop*@s.pop}, '/'=>proc{d=@s.pop;@s<<@s.pop/d}, '.'=>proc{p @s}, '@'=>proc{raise if !n=@v[@s.pop];@s<<n}, '!'=>proc{raise if !@v[k=@s.pop];@v[k]=@s.pop}, 'drop'=>proc{@s.pop}, 'swap'=>proc{@s[-2,2]=[@s[-1],@s[-2]]}, 'dup'=>

    forth.rb - 兼雑記
    Wacky
    Wacky 2006/09/23
    Haskell 製の FORTH に非常に大人気ない対抗をしてみました。
  • ラクに vector を作る - 兼雑記

    そろそろ Google Code Jam です。 Google Code Jam は入力とかが vector とか多い気がするので、 vector の初期化を楽にできるようにしておくとテストとかしやすいかもしれません。昔 Boost sandbox とかでも見た気がしますが、このくらいなら自分でサックリと雑に。 #include <vector> #include <iostream> #include <algorithm> #include <iterator> #include <assert.h> using namespace std; template <class T> struct vector_ : public vector<T> { vector_() {} template <class U> vector_(vector<U> v) { copy(v.begin(

    ラクに vector を作る - 兼雑記
    Wacky
    Wacky 2006/09/07
    ラクに vector を作る
  • プロファイラ

    あんま日語情報無いものも多いので適当に要点だけまとめて書いてみます。

    プロファイラ
    Wacky
    Wacky 2006/03/05
    gprof はめんどいけど正確。コンパイル時に仕込みが絶対必要。 google-perftools はなんか中途半端な気。sysprof は手軽。外部から GUI でスタックトレース見れる。oprofileは いい CPU なら gprof よりいいくらい。
  • 更新履歴兼雑記 - C で curry 化 @x86

    http://nicosia.is.s.u-tokyo.ac.jp/pub/essay/hagiya/h/curry を Sun から x86 に。 C言語は便利で楽しいなあ、と思わざる得ないのである。 に激しく同意なのです。 #include <stdio.h> #include <stdlib.h> #include <sys/mman.h> int (*curry(int (*F)(), int A))() { char *code = (char*)malloc(18); *(char*)code = 0x55; *(short int*)(code+1) = 0xe589; *(short int*)(code+3) = 0x75ff; *(char*)(code+5) = 0x08; *(char*)(code+6) = 0x6a; *(char*)(code+7) = (ch

    更新履歴兼雑記 - C で curry 化 @x86
  • ■ - 兼雑記

    これまた長い間やってみたかったけど、案外やってみると簡単で b2con までにやろうと思えばできたな、と。

    ■ - 兼雑記
    Wacky
    Wacky 2005/12/24
    構造体の中身を動的に取得できん、っていう話があったんですが、環境依存して良ければ -g オプションと DWARF2 でできるだろう、ということでとりあえず gdb がやってくれるみたいな変数の中身をダンプ
  • 実行時に情報を調べる話のまとめ

    このへんの話もーちょい調べたら今度まとめてみたいなとか思うけど何がわかってないのか混乱してきたから、現状のまとめ。 ldd と違ってどのアドレスにロードされているかの情報も欲しい。 Linux だと /proc/self/maps に書いてある情報。 Linux では dl_iterate_phdr でにコールバック関数を渡してやる。 FreeBSD では dlinfo(RTLD_SELF, RTLD_DI_LINKMAP, &lmap) などとして link_map という構造体をゲットすればいい。 MacOSX では dyld(3) 。 _dyld_image_count と _dyld_get_image_name と _dyld_get_image_vmaddr_slide を使えばいい。 Win32 では今のところどうすればいいやら。 NetBSD では見当らない。 dlctl(

    実行時に情報を調べる話のまとめ
    Wacky
    Wacky 2005/12/24
    共有LIBの名前とロードされたadrを取得(実行時 ldd 相当),自分のプロセスの名前を取得,共有LIBをオープン,起動後に共有LIBの名前とadrを取得,ファイル名からシンボル一覧を取得(nm相当),関数ptrから任意関数を呼ぶ
  • 1