0

友人から提供されたコードのチャンクを最適化しようとしていますが、平均実行時間のベースラインが非常に不安定で、修正する理由/方法がわかりません。

コード:

#include <sys/time.h>
#include <time.h>
#include <stdio.h>
#include "wall.h" /* Where his code is */

int main()
{
    int average;
    struct timeval tv;
    int i;

    for(i = 0; i < 1000; i++) /* Running his code 1,000 times */
    {
        gettimeofday(&tv, NULL); /* Starting time */ 

        start(); /* Launching his code */ 

        int ret = tv.tv_usec; /* Finishing time */ 
        ret /= 1000; /* Converting to milliseconds */ 
        average += ret; /* Adding to the average */ 
    }
    printf("Average execution time: %d milliseconds\n", average/1000);  
    return 0;
}

5 つの異なる実行の出力:

  • 804 ミリ秒
  • 702ミリ秒
  • 394 ミリ秒
  • 642 ミリ秒
  • 705 ミリ秒

平均実行時間を取得するために複数の異なる方法を試しましたが、それぞれの方法で十分に正確な答えが得られないか、完全に不安定な答えが得られます。私は今何をすべきか迷っています。どんな助けでも大歓迎です!

これらのタイプのベンチマークはシステムに大きく依存することを知っているので、システムの仕様を以下にリストしました。

  • Ubuntu 12.10 x64
  • 7.8 GiB RAM
  • Intel Core i7-3770 CPU @ 3.40GHz x 8
  • GeForce GT 620/PCIe/SSE2

編集

ご意見をお寄せいただきありがとうございますが、自分で作成するのではなく、gprof を使用することにしました。ありがとう、もう一度!

4

2 に答える 2

5

あなたのセリフint ret = tv.tv_usec; /* Finishing time */は終了時間を教えてくれません。それはまだ開始時間です。2 番目の を作成し、それをstruct timeval呼び出しgettimeofdayて、2 つを比較する必要があります。

ただし、おそらくclock()を使用する方が簡単です。もちろん、コードのパフォーマンスを実際に分析したい場合は、プロファイラーを使用してください。

于 2013-04-17T22:40:38.373 に答える
1

ここには、ベンチマークしているコードが何を行っているかについての詳細がないことや、「gettimeofday()」を間違って (そしておそらく不適切に) 使用しているなど、いくつかの問題があります。

提案:

1) 「gettimeofday()」を使用しないでください:

http://blog.habets.pp.se/2010/09/gettimeofday-should-never-be-used-to-measure-time

2) gprof で「経過時間」を補足します。

http://www.cs.duke.edu/~ola/courses/programming/gprof.html

于 2013-04-17T22:41:52.433 に答える