2017-01-22 6 views
0

私は、Honrerの方法とNaiveの方法の2つの異なる方法で多項式を評価するプログラムを持っています。私はそれぞれの実行時間を見ようとしていますが、どの順番で関数を呼び出すかによって、時間の変化が呼び出されます。たとえば、私はHornerメソッドを最初に置くと時間がかかります。私は最初に純粋な方法で試してみました。 Hornerメソッドは、素朴なメソッドが入れ子になったループを持つループが1つしかないので、はるかに高速でなければなりません。だから、私はそれがクロノ・ライブラリーの時計を使う方法でなければならないと思った。私はhigh_resolution_clockとsystem_clockの両方を試しましたが、同じことが起こります。どんな助け/コメントも歓迎されます。クロノの高解像度のクロックが矛盾した時間を与えていますか?

#include <cstdlib> 
#include <iostream> 
#include <chrono> 
#include "Polynomial.h" 

int main(int argc, char** argv) { 

    double c[5] = {5, 0, -3, 1, -8}; 
    int degree = 4; 
    Polynomial obj(c, degree); 

    auto start = std::chrono::high_resolution_clock::now(); 

    std::cout<<"Horner Evaluation: " << obj.hornerEval(-2)<<", "; 

    auto elapsed = std::chrono::high_resolution_clock::now() - start; 
    auto duration = std::chrono::duration_cast<std::chrono::nanoseconds>(elapsed).count(); 
    std::cout<< duration << " nanoseconds "<<std::endl; 


    auto start2 = std::chrono::high_resolution_clock::now(); 

    std::cout<<"Naive Evaluation: " << obj.naiveEval(-2)<<", "; 

    auto elapsed2 = std::chrono::high_resolution_clock::now() - start2; 
    auto duration2 = std::chrono::duration_cast<std::chrono::nanoseconds>(elapsed2).count(); 

    std::cout<< duration2 << " nanoseconds "<<std::endl; 
} 
+3

かなりの時間をかけて 'std :: cout'と思っています。測定にI/O時間を含めるべきではありません。 –

+1

1)最適化が有効になっていることを確認してください。 2)各ベンチマークを数千回実行する。 3)ベンチマークに標準時を含めないでください。 –

+0

私はそれをしたと信じています...私は彼らが両方ともはるかに速く走って取り出した。ありがとう。 – Matt

答えて

2

すべてのコードを入力していませんが、説明からはキャッシュ効果があるようです。 最初の方法を実行すると、CPUキャッシュは低温です(メモリからのデータにCPUキャッシュがまだ設定されていないため)処理に時間がかかります(メモリはキャッシュに比べて遅い)。 2番目のメソッドが呼び出されたとき、それはすべて(またはデータサイズに最も依存する)キャッシュキャッシュ内ですでに利用可能なデータが暑いです。

解決策 - 測定よりも、キャッシュをウォームアップするためにタイミング部分の外で両方のメソッドを最初に呼び出します。

+3

通常、少なくとも数千回それを実行し、実際の数値を得るために最初の100程度を投げるべきです。 – NathanOliver

+0

この場合、動作しますが、普遍的な解決策ではありません - 同じ "メソッド呼び出し時間依存性"すべてのラウンドは異なるメモリアドレスを参照します。 – Anty

+0

それは私が起こっているかもしれないと思ったものですが、私は技術的な言葉にはまだ十分に精通していません。そして私の教授は、これらの行に沿って何かを言ったと私は信じています。ありがとう! – Matt

0

すでに言われているように、おそらくキャッシュに何かがあると思われます。プリフェッチャは、naiveEvalメソッドでどのメモリをキャッシュにロードするかを判断する方がいいかもしれません。ここでは、ベンチマーキングでのコールドスタートの影響に関するexapmleに関する詳細情報のためのC++コードのベンチマークについて説明します:https://www.youtube.com/watch?v=zWxSZcpeS8Q

+0

ああそうです。ありがとう! – Matt

関連する問題