憂鬱な午後のひととき
最適化と言えば, 先日驚いたのは次のコード.
struct A {
A() : x_(0) {}
int func() { return x_++; }
int x_;
};
struct B : public A { };
int main()
{
A *p = new B;
const int count = 1000;
int ret = 0;
for (int i = 0; i < count; i++) {
ret += p->func();
}
printf("ret=%d\n", ret);
}
のループが
mov ebp, 250 ; 000000faH
LL3@main:
; 15 : ret += p->func();
lea ecx, [eax+1] ; ecx = eax + 1;
add edx, eax ; edx += eax;
lea eax, [ecx+1] ; eax = ecx + 1;
add esi, ecx ; esi += ecx;
lea ecx, [eax+1] ; ecx = eax + 1;
add edi, eax ; edi += eax;
add ebx, ecx ; ebx += ecx;
sub ebp, 1 ; ebp--;
lea eax, [ecx+1] ; eax = ecx + 1;
jne SHORT LL3@main
になっていたこと. newで動的に確保した領域のメンバですら, レジスタ上で計算してしまうのか.
しかもループアンロールしてレジスタの使い回しまでしてる. 凄いなあ.
ちなみにfunc()をvirtualにするとinline展開されなくなり, 7倍ほど遅くなった.
最適化オプション(-O2など)とデバッグオプション(-g)を一緒につける101の理由
デバッグのためだけに最適化オプションを付けないという立場も考えられる。これも悪手である。
その立場の場合、最適化オプション付きのバイナリと最適化オプションなしのバイナリの2種類のバイナリを維持管理する必要がでてくる。
それは古いコードのままデバッグしてしまったとかと同じレベルの品質管理の問題. 開発の問題じゃない.
たとえば起動時にデバッグ版(最適化オプション無しバイナリ)だけ"debug mode [version]"と出力させるなどの工夫をすれば減らせる.
問題発生時にリリース版(最適化オプション付きバイナリ)でもデバッガで追っかけられる技能を持つべきなのは同意するが,
開発時のデバッグではパフォーマンスが問題にならない限り, デバッガを使う前提ならデバッグ版の方が開発効率は上がるだろう. 上がるなら使えばよい.
納品のためのテストはリリース版のみすればよい. 問題が発生すればデバッグ版でもテスト.
もしリリースとデバッグで挙動が異なれば, それは大抵コードのバグであり, その現象に気がつきやすくなるのだから喜ばしいことだ.
コンパイラなどのバグに当たってしまうのはまれだし, たとえそうだった場合も, デバッグ版とリリース版で差を縮めながら該当個所を追い詰めるだろう.
というかassertは使わないんだろうか
『女王国の城』(有栖川有栖)
江神さんシリーズ, と言っても前作から16年振り. 去年出ていたのに気がつかなかった. うかつ. 思わず買ってしまった.
本の中では前作から半年ほどしか経過していないので読み始めてしばらく戸惑うが, 慣れればアリスの淡々としたモノローグのリズムが心地よい.
そういや, ハチクロの竹本君にどこか似てる気がする.
途中で結構派手なアクションも出てくるし十分楽しんだ. それはともかくいつのまにか大学8回生の江神さんより年上になってるのかあ,
36歳のカツオなみにショック.
Reverse Engineering Charange 2008
出来たところまでの
自分の答え.
Windowsでの解析はほとんどVCのIDEでやったんだけど,上級者はいろんなツール使ってるんだろうなあ.
level2の探索で, その時点で2時間未満で解いてる人がいたので「全数探索は無いだろ」と思い込んでしまったのが痛かった.
パッと感覚的にはわからなくても…中略…概算はできると思います的な感覚が悪い方に行ってしまった.
エミュレータいれて4問目に挑戦しようかと環境を作り始めたけど, 面倒になってやめてしまった根性無し.
今回やってみるまで全然知らなかったが海外にはこういうコンテストがあるんだなあ.
真夜中の集中豪雨で目が覚める. で続きをやってみたら3問目も解けた. あんたはラッキョかフリーザか. 4問目は環境整えるのが面倒だなあ.
実家になら実機があるんだけどどうしよう.
昨晩は2問目終わって3問目に突入し, 最初のステップを越えたところで力尽きて寝た.
で, 今日はデバ地下のお寿司で昼御飯!の気分だったが, 期待したお寿司がさっぱりでがっくり. 失望は期待の2乗に比例する. 今日は早く寝よう.
Reverse engineering
エントリーしてみたが, 最初は何をやっていいのかさっぱり分からんかった. なんとか1問目はできたけどtopはもう終わってる. 凄いな.
Xbyak 2.06公開
団子厨さんによる[rip + 32bit disp]アドレッシングモードサポート.
nobu-qさんによるMASMライクな@@, @f, @bサポート.
あとラベル名の局所化のための関数(inLocalLabel, outLocalLabel)追加.
『天涯の砦』(小川一水)
事故で爆発した宇宙ステーションの残骸に生き残った人たちの話. 後半の展開はちょっとハッピーエンドに持っていきすぎな感はあったが前半はかなりよかった.
ただ極限状態という割にはどこかのほほんとした印象が弱点. 古処誠二の『ルール』みたいな描写だったらもっとよかったかもしれない(読むのがいたたまれなくなるかもしれんけど).
また凄まじく激しい雷雨. 一瞬停電も起きた. その10分ほど前にサーバの電源を落としておいて助かった.
rejit
自分から振っておきながらレスポンス遅れてごめんなさい. ここ1~2カ月ほとんど頭が働いていないので(慢性的に激しく眠い),
自分が作ってるやつのバグがとれず, 誰か(名指ししようかと思ったけど我慢する)に直してもらおうと思って
恥さらしときます.
正規表現→木構造→Cによるmatchの流れと正規表現用VM上への変換からx86 nativeへの変換の二つの流れ.
Cによるmatchでは()によるグループ化あたりまで実装してるんだけど, バックトラックがうまく行ってない(Exp1::match)ところがある(テスト実行でエラーになるやつ).
VM変換ではgreedyが未実装だけどこれはそんなに難しくないだろうと思ってる. 無駄なジャンプの削除最適化は後の楽しみ.
とにかくバックトラックのバグがとれないので困ってる状況.
ITpro Challenge!覗きに行く.
grub開発者の奥地さんは同じ大学の人だったのかあ, とか思った. 後で聞くと大学のときに私が一度アセンブラか何かのマニュアルを貸したことがあるらしい. 驚いた.
言われてみればそんなことがあった気がする. しかし誰に貸したのか, そもそも奥地さんとは接点が無かったはずなのに何故貸すことになったのかさっぱり覚えていない.
ん? もしかしてKMC(私自身は所属していない)の知り合いつながり?
昔
御意見は光成滋生<herumi@nifty.com>までお願いします