ゆっくりプログラム高速化

http://d.hatena.ne.jp/w_o/20130206#1360077118
を書いたときに、よく考えたら、重箱すみつつきばっかやってて、普通にプログラムの書きかたの説明とか書いたことないな、とふと思って、
https://twitter.com/tanakmura/status/298898528145666048
とか書いたら、まあ、いくらかゲタはかせれば65535と言ってもいいくらいのRTしてもらったので、なんか書こうと思ったがせっかくだから動画にしようと思って、

http://www.nicovideo.jp/watch/sm20127515
こういうのを作った。


まあ作った感想としては、作業量の割に内容薄すぎるから、これだけ作業するやる気があったら、普通に文章書いたほうが明らかに良さげだし、そもそもそれだけ気力あるならコード書けよという感じだった。


でも、作業Aのやる気は作業Bのやる気と等価変換できるわけではないので、そういうわけでもないというか、まあコード書くよりくだらない文章書いてるほうがやる気あるとかアレなのでもうプログラマはやめようと思った。


とりあえず何かに開眼するかもしれないのであと二回くらいは頑張ろうと思う。そっから先はやる気次第。


作業開始してから二週間かかってるので多分隔週ぐらいになると思う。

最適化オプション付けないでmath.hをインクルードしないときのsinの挙動

遅いのが謎だが…
レジスタの初期値が辛い値になってるかと思ったけど、

__declspec(noinline) int
a(int v)
{
    return cos(v);
}

int main()
{
    int i;
    __int64 b,e;

    a(100);

    b = __rdtsc();
    for (i=0; i<100; i++) {
        if (1) {
            __asm {
                pxor xmm0, xmm0;
                pxor xmm1, xmm1;
                pxor xmm2, xmm2;
                pxor xmm3, xmm3;
                pxor xmm4, xmm4;
                pxor xmm5, xmm5;
                pxor xmm6, xmm6;
                pxor xmm7, xmm7;
            }
        }

        a(0);
    }
    e = __rdtsc();

    printf("%lld\n", e-b);
}

こういうのでもmath.h入れないほうが遅い。


math.hなし(35000clkぐらい)

_a	PROC
; File c:\users\w0\test\cl\sin.c
; Line 5
	push	ebp
	mov	ebp, esp
; Line 6
	mov	eax, DWORD PTR _v$[ebp]
	push	eax
	call	_cos
	add	esp, 4
; Line 7
	pop	ebp
	ret	0


あり。(3500clkぐらい)

_a	PROC
; File c:\users\w0\test\cl\sin.c
; Line 5
	push	ebp
	mov	ebp, esp
	sub	esp, 8
; Line 6
	cvtsi2sd xmm0, DWORD PTR _v$[ebp]
	sub	esp, 8
	movsd	QWORD PTR [esp], xmm0
	call	_cos
	add	esp, 8
	fstp	QWORD PTR tv72[ebp]
	movsd	xmm0, QWORD PTR tv72[ebp]
	cvttsd2si eax, xmm0
; Line 7
	mov	esp, ebp
	pop	ebp
	ret	0

いや引数スタックだからxmmレジスタ関係ないだろ。しかし寒くて手が動かんのでまあいいや…多分スタックに変な値のってるとかそれ系だろ…