FreeBSDの/usr/srcはhgsubversionでとってきていて、いまの/usr/srcは

% hg tip
changeset:   162828:8fff0f0c3911
svnrevision: 226824
tag:         tip
user:        alc@ccf9f872-aa2e-dd11-9fc8-001c23d0bc1f
date:        2011-10-27 02:52 +0000 (27 hours ago)
summary:     contigmalloc(9) and contigfree(9) are now implemented in terms of other
% hg log -r0
changeset:   0:6d11119de1ac
svnrevision: 3
user:        rgrimes@ccf9f872-aa2e-dd11-9fc8-001c23d0bc1f
date:        1993-06-12 14:49 +0000 (1993-06-12)
summary:     This commit was generated by cvs2svn to compensate for changes in r2,
%

というかんじで、最初からとってきているのでとてもでかい。途中のリビジョンからとってくればいいんだけど、せっかくなのでそのままにしてある。チェンジセットがたくさんあるせいなのか、hgコマンドはなにするにも1秒以上かかって、ちょっとイライラする。以前は数秒もかかってほんとうにイライラしたがhgsubversionなのかhgなのか改善されてましになった。

で、pypyというpythonの実装があるらしくて、素のpython(CPythonというらしい)よりも速いらしいので、じゃあためしてみるか、と。

portsにpypyがないのでFreeBSDでは動かないのかとおもったがチャレンジ。

Building from sourceをみながらpypyのインストール。

% hg clone https://bitbucket.org/pypy/pypy
% cd pypy/pypy/translator/goal
% python translate.py -Ojit  ←←まだpypyがないのでCPythonでつくる

途中コンパイルエラーも見えたような気がするがbuildはどんどん進んでいく。しばらくすると何かカラフルな模様がでてきて、なにかのプログレスバーかとおもってたら、上下対象の模様がみえだしてきてやっとマンデルブローだと気付いた。たしかにBuilding from sourceにも書いてある。で4GBのメモリが必要だとも書いてある。そのときは物理メモリは11GB載っているので問題ないぜ!とおもってた。もうかなりの時間がたつのに終わらないのでtopでみてみるとプロセスサイズが3.5GB(常駐3.0GB)になったところで頭打ちになってpageoutがはじまっていたので、できるだけ不要なプロセスを閉じて放置しといた。

夜になって終わってるかみてみたらまだ何かやっていてswapin/swapoutもおこっていた。どうやらZFSのARC(adaptive replacement cache)が3GBで下げ止まっている。しかたないのでX serverを止めたりしてみたが、ほとんどのプロセスからメモリが剥されたあとだったので効果なし。放置。

朝になったらおわっていたが、11時間ちかくかかったようだ。おそろしい。openoffice並だ。会社のpython野郎にきいてみたら自分でコンパイルしたことがないから知らんといわれた。最近の若いのはそんなんだよね。

[translation:info] usession directory: /tmp/usession-default-0
[translation:info] created: /home/koie/repo/pypy/pypy/translator/goal/pypy-c
[Timer] Timings:
[Timer] annotate                       ---  4436.3 s
[Timer] rtype_lltype                   ---  2757.3 s
[Timer] pyjitpl_lltype                 ---  4861.3 s
[Timer] backendopt_lltype              ---  2436.0 s
[Timer] stackcheckinsertion_lltype     ---   566.4 s
[Timer] database_c                     ---  5688.6 s
[Timer] source_c                       --- 13597.5 s
[Timer] compile_c                      ---  4305.5 s
[Timer] ============================================
[Timer] Total:                         --- 38649.0 s

とりあえずインストールイメージをつくってからインストール。

いろいろGNUツールやLinuxしか考えてないようなでFreeBSDではちょっと手直しが必要だった。tarはgtarに、グループrootはwheelに。linuxってgid=0はrootなんだね。はじめてしった。

diff --git a/pypy/tool/release/package.py b/pypy/tool/release/package.py
--- a/pypy/tool/release/package.py
+++ b/pypy/tool/release/package.py
@@ -124,11 +124,11 @@
         else:
             archive = str(builddir.join(name + '.tar.bz2'))
             if sys.platform == 'darwin':
-                e = os.system('tar --numeric-owner -cvjf ' + archive + " " + name)
+                e = os.system('gtar --numeric-owner -cvjf ' + archive + " " + name)
             else:
-                e = os.system('tar --owner=root --group=root --numeric-owner -cvjf ' + archive + " " + name)
+                e = os.system('gtar --owner=root --group=wheel --numeric-owner -cvjf ' + archive + " " + name)
             if e:
-                raise OSError('"tar" returned exit status %r' % e)
+                raise OSError('"gtar" returned exit status %r' % e)
     finally:
         os.chdir(old_dir)
     if copy_to_dir is not None:
% cd pypy/tool/release
% python package.py ../../.. pypy-my-own-package-name
% cd /tmp/usession-default-5/build
% mkdir ~/tmp/pypy-a2b911e61392
% tar xvf pypy-my-own-package-name.tar.bz2 -C ~/tmp/pypy-a2b911e61392
% cd ~/tmp/pypy-a2b911e61392
% ln -s pypy-a2b911e61392 pypy

次はhgのビルド。

PYTHON=$(HOME)/tmp/pypy/bin/pypy に書き換えて gmake all して、 gmake PREFIX=$HOME/tmp/hg install。

そしてついに/usr/srcで簡単にベンチマーク。「hg log --style=compact >/dev/null」の実行時間を測ってみた。

cpython 113.216u 16.762s 2:10.19 99.8% 1458+1471k 0+0io 0pf+0w
pypy 149.352u 22.263s 2:51.88 99.8% 21542+28179k 0+0io 0pf+0w

どうみてもpypyの方が遅い。なんだこれは。ふたたびpython野郎に「どういうことなんだ、これはっ!」聞いてみたら、「まぁそんなもんですよ」って返事。脱力。パイパイって音からしてはずかしいのに使うのもはずかしいとは。またしても地球温暖化に貢献してしまった。