D言語のインラインアセンブラ練習
D言語のインラインアセンブラをちょっと触ってみた。
0から2*10^9-1までの総和を(mod 2^32で)求めるプログラム
test()が普通の方法。asmtestがインラインアセンブラを使用。
import std.date ; void test(){ uint i; uint s; for(i=0;i<2000000000;i++){ s+=i; } printf("%u\n",s); } void asmtest(){ uint s; asm{ mov EAX,0; mov ECX,1999999999; L1:; add EAX,ECX; loop L1; mov s,EAX; } printf("%u\n",s); } void main(){ int starttime; starttime=getUTCtime(); test(); printf("time = %d\n", getUTCtime()-starttime); starttime=getUTCtime(); asmtest(); printf("time = %d\n", getUTCtime()-starttime); }
実行結果
321730048 time = 6047 321730048 time = 1750
EAXとECXの値を壊しているのはもしかしたらまずいのかも知れない。