2008-10-04
■ [zsh] 指定したディレクトリからscreenを起動するzsh functionを書いてみた
僕はかなりタブを開きまくる子で、1つのscreenで複数のプロジェクトの作業を平行すると何がなにやら分かんなくなるので、 最近はプロジェクトごとにscreenを起動するようにしている。
が、作業を始めるときにいちいち
% cd ~/proj/hoge % screen
と打つのが面倒になってきた。偉大なハッカーは面倒なことを繰り返さない、皆さんもよくご存じですね。
んでまあいつもならシェルスクリプト書く流れなんだけど、ふとzshにfunctionという機能があったのを思い出した。
# start screen from given directory function sc(){ cd $1 screen }
.zshrcにこんな風に書いておくと、「sc ~/proj/hoge」で指定したディレクトリからscreenを起動できるようだ。
引数は$1や$*で取るっていうのは、シェルスクリプトと同じでわかりやすいね。まぁfunciton sc()の括弧はなんのためにあるんだと思わなくもないけど…。
■ [prog] 「1GBの文字列をstrlenするのに必要な時間は?」をやってみた
普段ならめんどいからスルーするんだけど、これ即答できるとカッコいいよねということでチャレンジ。 以下ネタバレ注意。
-
-
-
えーと、strlenってなんだっけ(そっからかよ)。いや文字列の長さを求めるのは分かってて。 Cだから、null終端だよな。
ということは文字列の先頭から見ていって、1GBめの \0 を見つけるまでに何秒かかるかっていう ことでいいのかな。(*1に「fast strlen〜」みたいなリンクがあるってことは、多分違うんだろうけど…とメタ推理*1)
1GBは1024 * 1024で 1048576バイト。問題は1秒間に何バイトスキャンできるかだけど… って、それ文字列がメモリ上にあるかディスク上にあるかで違うじゃん。 strlenってことは、とりあえず全てメモリ上にあると考えて良いのかな。
メモリの読み出し速度ってどれくらいなんだっけ?分からないので検索する。
うん、3GB/s とか 4GB/s とからしい。とりあえず4GB/sとしよう。
超単純に考えたら、1秒(1000ms)に4GBだから、1GBは250ms?こんなんでいいのかなぁ。
答え合わせ
おっと、メモリじゃなくてCPUがボトルネックになるのか…!なんとなくCPUだから余裕で速いよねとか思ってしまった。 「fast strlen」の方だと0.26秒だから、理論値にけっこう近いってことか。
何やってるのかはよくわからんけど、SIMDってことは、一度に複数のデータを取ってきて \0が入ってるかまとめて調べる…という方向で高速化してるんだと想像。
*1 違ってなかったっぽい