2016-08-11 9 views
0

私は同じことをする2つの異なる方法を書いています。どちらが速く実行されるかを比較したいと思います。もちろん、ベンチマークは常に可能ですが、プログラムのベンチマークはマシンごとに異なる可能性があり、多くの外部要因の影響を受ける可能性があります。どのようにベンチマーキングなしでより速く計算することができますか?私の考えは、あなたがプログラムで行われたすべての作業の時間を合計するということです。これは標準的なことですか?あなたがベンチマークしたときに、エラーの余地がたくさんあるようです。プログラムの理論速度を計算しますか?

+0

[アルゴリズムの複雑さ](https://en.wikipedia.org/wiki/Analysis_of_algorithms)の調査です。 – Phylogenesis

+2

これは、それぞれの操作がどのように解釈されるか、どのオブジェクトが作成されるかといった深い知識が必要なので、これはRubyプログラムにとっては非常に難しいと思います。私は多くの反復でベンチマークを行うのが最善の方法だと思います。 – Albin

+0

また、ベンチマークが標準ですね。 – thesecretmaster

答えて

3

私の考えは、プログラムで行われたすべての操作の時間を合計することです。

はい、ベンチマーク以外の方法では、これらの時間を簡単に/確実に把握することはできません。

これらの時間は、以前にプログラムで(またはシステム全体で)発生したことの動的コンテキストに依存するという問題があります。 CPUは複雑なビーストであり、キャッシュ効果(データキャッシュと命令キャッシュ)が主な要因になることがよくあります。分岐予測もそうです。 Why is it faster to process a sorted array than an unsorted array?

アセンブリ言語での小さなループの静的解析が可能です。例えばAgner Fog's microarchictecture pdf and instruction tablesに基づいて、キャッシュミスがないと仮定して、単純なループがインテルハスウェルで実行できる繰り返し回数を正確に予測できます。それを越えて、ますます推測が増えていきます。

Rubyのような高レベルのインタプリタ言語でのパフォーマンスは、コードのチューニングに多くの時間を費やしている専門家にとっては多分予測可能かもしれませんが、「これはこのマイクロ秒数がかかる」ということはほとんどありません。それより少し速い」

2

アルゴリズムの複雑さは、アルゴリズムの理論的な速度比較を提供します。

あなたの質問は任意のプログラムについてですが、プログラムはアルゴリズムの集合以上のものです。

プログラムの実行速度は、実行しているコンテキスト(I/O、オペレーティングシステム(マルチタスクまたはハードウェア)、ハードウェア)によって異なります。

したがって、ベンチマークの定義である測定の束に統計情報以外の方法はありません。