[ADP開発日誌]Ver0.60アルファ版のリリース(フィボナッチ数例を求めるプログラムの実行速度の改善)

バージョンが0.5Xから0.6に変わりましたが、機能的には特に変わりません。
前回のリリースから継続的に実行性能の強化をしてまして、だいぶ速くなったので一旦リリースします。
 
どこまで速くなったかですが、ADP 0.60と各ブラウザとのフィボナッチ数列を求めるプログラムの実行時間の比較を行います。
ちなみに、JavaScriptのコードですが、こちらにあるコードを使わせていただきました。
ADP側のコードは、以下のとおりです(高速化のためには元のソースも変更する必要がありましたので前とは若干変わっています)。
+fib(0,0),!;
+fib(1,1),!;
+fib($x,$y),fib($x - 1, $f1),fib($x - 2, $f2), $y == $f1 + $f2, !;
,fib(28).printn;
 
◆マシン
・CPU  Core i7-980X
・メモリ 24GB(DDR3-1066 4GB × 6)
・OS   Windows 7 Ulitimate (x64)
 
◆結果
28のフィボナッチ数列を求める時間
IE8(64ビット版)368ミリ秒
FireFox 3.6.13167ミリ秒
Google Chrome 8.0.552.2249ミリ秒
ADP 0.60226ミリ秒
 
ADP 0.60の結果ですが、IE8以上、FireFox3.6未満という結果になりました。個人的にはまだまだ不満足ですが、競争が激しくなったブラウザのJavaScriptとそう遜色がない結果になっているのでひとまず納得しておきます。
またGoogle Chromeの結果が突出していますが、これはJITコンパイラが利いているかと思います。この手のベンチマークの結果を誤解してほしくないので書いておきますとどんなプログラムも常にGoogle Chromeが突出して速いと言っているわけではござませんので結果を丸々鵜呑みにしないように注意してください
(実際の体感速度は皆様が使ってみて判断してください・・・)。

で、ここまでくると
『いったいどこまで速くなるのか?』
と疑問に思われるでしょう。というわけで、アセンブラ(正確にはインラインアセンブラ)のコードと実行結果を載せます。
#include <iostream>
using namespace std;

#if 0
int __fastcall fib(int f)
{
	if ( f == 0 ) return f;
	if ( f == 1 ) return f;
	return fib(f-1) + fib(f-2);
}
#else
extern "C" {
int __declspec(naked) __fastcall fib(int f)
{
	__asm push	esi
	__asm mov	eax, ecx
	__asm cmp	ecx, 0
	__asm je	_return
	__asm cmp	ecx, 1
	__asm je	_return
	__asm dec	ecx
	__asm call  fib
	__asm mov   esi, eax
	__asm dec	ecx
	__asm call	fib
	__asm add	eax, esi
	__asm add	ecx, 2
_return:
	__asm pop	esi
	__asm ret
}
}
#endif

int main(int argc, _TCHAR* argv[])
{
	clock_t c = clock();
	cout << "fib = " << fib(28) << endl;
	cout << "Execute time is = " << (clock()-c)*1000.0/CLOCKS_PER_SEC << endl;
	return 0;
}
 
プリプロセッサでアセンブラコードが動くようにしていますが、コードはC言語との比較もできるようにCのコードも掲載しています。Visual Studio 2008でコンパイル実行できます。実行時間は4m秒でした。ちなみに、フィボナッチ数例自体を高速に求める方法は他にあります。以前の例のようにADPキャッシュを使えば数ミリ秒になります。ここでは再起関数の呼び出し回数を変えないようにして各プログラミング言語自体が持つ基本的な速度について比較できるようにしています。
2011-01-10 | コメント:0件

コメントをどうぞ


『不適切なコメントへの対応』を一読下さい。
現在コメントは承認制となっております。

Previous Page | Next Page