[プログラミング]進歩しない自分

mixiopenGLコミュで三角形に内包する点の判定の話になっていて、ぼーっと見ていたのだけど、これって適当に作ったらマイクロソフトさんが一生懸命作った判定関数D3DXIntersectTriよりどんくらい速いんだろうと思ってやってみる。作るのは3角形abcと同一平面にある点pがabcの中にあるか外にあるかを判定する関数。対するマイクロソフトさんのD3DXIntersectTriは3次元空間において、ある点pから伸びる線が三角形abcと交差するかどうかを調べ、その距離とuvを返すというゴージャスなもの。つかこれ使えばレイトレとか簡単だな...
で、乱数で作った三角形とpの交差判定を1000回繰り返す調査をしたら、なんと俺の作った関数は超早い!。まさに光速!あまりに速いので、なにもしないで3角形を初期化するだけの速度を計ったら、それよりも速いw。なにもしないより早いということは、相対性理論によりタイムマシンを作ったことになるのではないか?
正確に時を計るためにQueryPerformanceCounterというCPUカウンタを計測してもやはり速い...の、ノーベル賞
まぁ最適化のせいなんですけどね。関数を呼ぶだけで使ってなかったので、なにもしてませんでした....なにもしないと早くなるってのおかしいけど。

int a=0;
for(...){
初期化();
a += 俺様の関数();
}
printf("%d\n",a);//これ重要

と、最後表示するようにしたら計測できた。最適化はするけど何もしないのはダメっていうオプションないんだろうか。きっとあるんだろうなぁ。俺様の関数()の中は最適化してこのループだけはしないとか。まぁ表示すりゃいいんだけど。
ちなみにちゃんと測定した結果、これだけの機能のアドバンテージをいただきつつ、1コール
D3DXIntersectTri:189カウント
自作関数:176カウント
という情けない結果に。やっぱマイクロソフトはいろいろずるいことをやって高速化してるに違いない。
とか書いてさすがにと思い、最大限の最適化とかいうオプションONにしたら139まで早くなった。全くチューニングしてないし、そんなもんか。でもいろいろ苦労するくらいなら、誰かが苦労して作ったものを使うに限るなぁとつくづく思う金曜日。
つかなんか昔も同じことやった気がする。進歩してないのか、ボケがはじまったのか。

追記

その後も色々やってみて思ったのは、昔printfを入れると動いたり動かなかったりするバグに死ぬほど悩まされたことがあるけど、これが原因だったんだなぁ。最近じゃデバッガが優秀なのか俺が優秀なのかトンと出会わなくなったのですっかり忘れてたが、すっきりした。

さらに追記

139は悔しいので最適化して76になった。これなら寝れる。
二度と使わないようないつか使うような気がするので自分用倉庫。最近自分の日記を自分で検索することが多いので

inline float dot2(D3DXVECTOR3 *a, D3DXVECTOR3 *b)
{
	return a->x * b->x + a->z * b->z;// y成分は無視
}
// 三角形 a-b-c平面にvからy軸にそって射影した点v.xzは三角形の内部にあるか
bool myIntersect(D3DXVECTOR3 *a,	D3DXVECTOR3 *b,	D3DXVECTOR3 *c,	D3DXVECTOR3 *v,
			D3DXVECTOR3 *r,	float *d1,float *d2,float *d3) // ダミー
{	
	D3DXVECTOR3 ab = *b - *a;// y=0平面に投影し考える。
	D3DXVECTOR3 ac = *c - *a;// 以降y成分は全部無視
	D3DXVECTOR3 ap = *v - *a;
	D3DXVECTOR3 Nab(ab.z, 0, -ab.x);// 左に90度回す

	float turn = dot2(&Nab, &ac);	// ABCが左回りか?
	if (turn==0)	return false;		// 三角形の面積0

	float q = dot2(&Nab, &ap) * turn;
	if (q<0)	return false;
	D3DXVECTOR3 bc = *c - *b;
	D3DXVECTOR3 ba = *a - *b;
	D3DXVECTOR3 bp = *v - *b;
	D3DXVECTOR3 Nbc(bc.z, 0, -bc.x);
	q = dot2(&Nbc, &bp) * turn;
	if (q <0)	return false;
	D3DXVECTOR3 ca = *a - *c;
	D3DXVECTOR3 cb = *b - *c;
	D3DXVECTOR3 cp = *v - *c;
	D3DXVECTOR3 Nca(ca.z, 0, -ca.x);
	q = dot2(&Nca, &cp) * turn;
	if (q<0)	return false;
	return true;
}