2009-10-06
■ [prog] 言語間のおおまかな速度差
「Computer Language Benchmarks Game」を眺めて、各言語のおおまかな速度性能をまとめてみた。
C、C++ ---- 1倍の壁 ---- Java ---- 3倍の壁 ---- Scala C#(Mono) Haskell(GHC) OCaml CommonLisp(SBCL) Fortran ---- 10倍の壁 ---- Lua(LuaJIT) Erlang Scheme(PLTScheme) ---- 30倍の壁 ---- JavaScript(V8, Tracemonkey) Smalltalk(VisualWorks) ---- 50倍の壁 ---- Python PHP ---- 100倍の壁 ---- Perl Ruby(JRuby, Ruby 1.9)
もちろん実際には、動かすプログラムによって大きく差があるんだけどね。
■ [ruby][memo] gem環境を再構築した
以下、特におすすめしないよ
やりたかったこと
- ruby 1.8とruby 1.9の共存
- ~/.gemに入れる (sudo使わない)
手順
Ruby 1.9.2のtrunk(git mirror)を取ってきて、ruby-1.9という名前でインストール
- 最近はRakefileでやってる
- rake ruby-trunk AS=ruby-1.9 で、~/bin/rubys/以下にインストールされる
sudoで入れた方を全削除 (Standards: RubyGems Best Practiceより)
$ yes | sudo gem uninstall '' -a
~/.gemにパスを通す
export PATH=/Users/yhara/.gem/ruby/1.9.1/bin:/Users/yhara/.gem/ruby/1.8/bin:$PATH
複数のgemコマンドで一括インストールするにはgemiを使う
- gem install gemi --source=http://gemcutter.org
- gemi install foo で gem install foo と gem-1.9 install foo が走る
今の.gemirc:
- :name: 'MRI 1.8' # used just for showing messages :command: 'gem' :options: '--no-format-executable --user-install' - :name: 'MRI 1.9' :command: 'gem-1.9' :options: '--format-executable --user-install'
つまりどっちも~/.gemに入れて、実行ファイルは foo と foo-1.9 のように命名される。
経緯
- 本当は foo-1.8 と foo のようにしたかったのだけど(Rubyistとして)、portsで入れたRuby 1.8が ruby という名前になってるので無理だった。
- Ruby 1.8も自前で入れるようにすれば可能。
- Rakefileをこれ以上いじるのが面倒になったので、延期。そろそろRakeじゃなくて普通のRubyスクリプトにした方が楽そう
- ~/.gemに入れるには gem install foo --user-installでOk
- 1.8.x は ~/.gem/ruby/1.8以下に入る
- 1.9.1, 1.9.2は ~/.gem/ruby/1.9.1に入る (どちらも拡張ライブラリがバイナリ互換なので)
- 1.9で~/.gem生活を送るにはtrunkが必要!
- 1.9.1には、デフォルトで~/.gemからロードしてくれないバグがある(1.9.2で直る)
- 1.9.1と1.9.2でgemを共有するためには、両方を「同じ名前で」インストールする必要がある
- 別名にしてsymlinkで切り替えるのではダメ
- なんでかというと、実行ファイルのshebangにインタプリタのパス名が入るから
- 例:~/.gem/ruby/1.9.1/bin/rake-1.9 には #!/Users/yhara/bin/rubys/ruby-1.9/bin/ruby-1.9 と書かれている
- 1.9.1を「ruby-1.9」という名前でインストールしておき、1.9.2が出たらまるごと置き換えればOK (1.9.1と1.9.2とか、1.9.2-preview1とpreview2とか同時に使いたいケースはあまりないよね?)
- --format-executableを「途中で」切り替えるのはおすすめしない
- 実行ファイルfooが入ってるときにfoo-1.8として上書きインストールすると、uninstall fooしたときにfooの方が消えてくれないバグがないだろうか