rbenv 経由の ruby は遅い・・・
takuya@rena:~/Desktop$ time rbenv exec ruby -e "puts 1" 1 real 0m1.012s user 0m0.511s sys 0m0.392s
非常に遅いというわけではないが、だいぶおそい。
OSX の ruby はこれくらい速い
takuya@rena:~/Desktop$ time /usr/bin/ruby -e "puts 1" 1 real 0m0.048s user 0m0.030s sys 0m0.011s
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
早く何とかしないと。
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 捨てようかしら