それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

rbenvのruby が遅いので何とかする

rbenv 経由の ruby は遅い・・・

takuya@rena:~/Desktop$ time rbenv exec ruby -e "puts 1"
1

real     0m1.012s
user     0m0.511s
sys     0m0.392s

非常に遅いというわけではないが、だいぶおそい。

OSXruby はこれくらい速い

takuya@rena:~/Desktop$ time /usr/bin/ruby -e "puts 1"
1

real    0m0.048s
user    0m0.030s
sys 0m0.011s

OSX NaitiveなRubyは20倍ほど速い。

rbenv のRubyを直接叩くと速い

takuya@rena:~/Desktop$ time /Users/takuya/.rbenv/versions/2.1.1/bin/ruby -e "puts 1"
1

real    0m0.036s
user    0m0.029s
sys 0m0.006s

なんと、OSX NativeのRubyより高速に起動する。

早く何とかしないと。

irb を起動するだけで、3秒も待たされてたら、作業のタイミングが変になる。

rbenv が local だとか、shell だとかを動的に見ている所為で遅いのだ。

そもそも、rbenv 必要あんの?rbenv なんて、バージョン違いを使うために入れた

普段使いのrubyで頻繁にバージョンを切り替えることなんて無いし。

alternatives 的なので十分じゃないですかー

なので、rbenv コマンドさんに、ちょっかいを出す。

rbenv のruby ってそんなに頻繁に切り替えないので、もう固定する

takuya@rena:~/Desktop$ realpath $(which rbenv)
/usr/local/Cellar/rbenv/0.4.0/libexec/rbenv

そもそも、rbenv の いれる、プロキシ(リンク)のRubyコマンドがこんな感じなので

rbenv が作るプロキシ

#!/usr/bin/env bash
set -e
[ -n "$RBENV_DEBUG" ] && set -x

program="${0##*/}"
if [ "$program" = "ruby" ]; then
  for arg; do
    case "$arg" in
    -e* | -- ) break ;;
    */* )
      if [ -f "$arg" ]; then
        export RBENV_DIR="${arg%/*}"
        break
      fi
      ;;
    esac
  done
fi

export RBENV_ROOT="/Users/takuya/.rbenv"
exec "/usr/local/Cellar/rbenv/0.4.0/libexec/rbenv" exec "$program" "$@"

バージョンを変えたいときは、 rbenv exec ruby すればいいとわかる

takuya@rena:~$ rbenv exec ruby -v
ruby 2.1.1p76 (2014-02-24 revision 45161) [x86_64-darwin14.0]

普段は固定でいいや

というわけで、作った。

ln -s /Users/takuya/.rbenv/versions/2.1.1/bin/ruby /usr/local/bin/ruby
ln -s /Users/takuya/.rbenv/versions/2.1.1/bin/irb /usr/local/bin/irb

かなり、よく使うコマンドだけ、直接叩くと嬉しいくらい速い。

ただ、rbenv でlocal 切り替えた時に、おかしくなりそうだな

/usr/local/bin に ruby 作って、リンクする

毎回作るのも面倒だし、bashrc に書いておいた。

rbenv が使ってる ruby と、リンクしている ruby のバージョンを比較し、異なっていたら、バージョンのリンクを変えることにした。

#rbenv
if [ -x  "`which rbenv 2>/dev/null`" ] ; then
    eval "$(rbenv init -  )"
    # rbenv 経由の ruby は遅いので、使わない
    if [ `uname` = "Darwin" ]; then
        export PATH=$( echo $PATH | /usr/bin/ruby -ne 'puts $_.split(/:/).reject{|e| e=~/rbenv/ }.join(":")' )
        if [ -f /usr/local/bin/ruby -a  $(rbenv which ruby) != $( realpath /usr/local/bin/ruby )  ] ;then
            rm /usr/local/bin/ruby
        fi
        if [ ! -f /usr/local/bin/ruby ] ; then
            ln -s $(rbenv which ruby) /usr/local/bin/ruby
        fi
    fi
fi

でも、よく考えたら、ruby だけじゃなく、gem とか irb も。なので

全部のコマンドのエイリアスをつくろうかと思ったけど、こんどはbashの起動速度が遅くなりそう・・・最低限 ruby だけでいいや

自分で手作業でリンクしてた時の対策。

もう面倒なので、rbenv のPATHを、/usr/local/bin の後ろに順序を下げた。

#rbenv
if [ -x  "`which rbenv 2>/dev/null`" ] ; then
    eval "$(rbenv init -  )"
    # rbenv 経由の ruby は遅いので、使わない
    if [ `uname` = "Darwin" ]; then
        #export PATH=$( echo $PATH | /usr/bin/ruby -ne 'puts $_.split(/:/).reject{|e| e=~/rbenv/ }.join(":")' )
        export PATH=$( echo $PATH | /usr/bin/ruby -ne 'a=$_.split(/:/);ridx = a.find_index{|e, i| e=~/rbenv/};target = a.find_index{|e, i| e=~/local\/bin/};rbenv_path=a[ridx];a.delete_at(ridx);a.insert( target,rbenv_path );puts(a.join(":"))'  )
        if [ -f /usr/local/bin/ruby -a  $(rbenv which ruby) != $( realpath /usr/local/bin/ruby )  ] ;then
            rm /usr/local/bin/ruby
        fi
        if [ ! -f /usr/local/bin/ruby ] ; then
            ln -s $(rbenv which ruby) /usr/local/bin/ruby
        fi
    fi
fi

改善した。

takuya@rena:~/Desktop$ time ruby -e "puts 1"
1

real     0m0.036s
user     0m0.029s
sys     0m0.006s
takuya@rena:~/Desktop$ time rbenv exec ruby -e "puts 1"
1

real     0m1.012s
user     0m0.511s
sys     0m0.392s
takuya@rena:~/Desktop$

それでも、gem irb は遅いので、もうツライ。。。。

そんなに頻繁に切り替えないので、もうrbenv 捨てようかしら

参考資料

rubyをビルドしたときのconfigureオプションを表示する - Qiita

clmemo@aka: rbenv 版 ruby の高速化