0

次のコード セグメントがあります。

struct timeval start, end;
gettimeofday(&start, NULL);
//code I'm timing
gettimeofday(&end, NULL);
long elapsed = ((end.tv_sec-start.tv_sec)*1000000 + end.tv_usec-start.tv_usec);
ofstream timeFile;
timeFile.open ("timingSheet.txt");
timeFile << fixed << showpoint;
timeFile << setprecision(2);
timeFile << "Duration: " << elapsed << "\n";
timeFile.close();

経過したマイクロ秒数を出力します。ただし、この行を変更すると

long elapsed = ((end.tv_sec-start.tv_sec)*1000000 + end.tv_usec-start.tv_usec);

これに:

long elapsed = ((end.tv_sec-start.tv_sec)*1000000 + end.tv_usec-start.tv_usec)/1000000.0;

負の値を取得します。なぜこれが起こるのですか?

4

2 に答える 2

1

double:1000000.0で除算し、整数型にキャストバックします。

すべての開始変数と終了変数がint(またはlong)であると仮定すると、doubleにキャストしてから、longに戻すという厄介なキャストがあります。

試す:

double elapsed = (double)(end.tv_sec-start.tv_sec) + (double)(end.tv_usec-start.tv)/1000000.0;
于 2012-05-15T20:21:14.877 に答える
1

ここSOのどこかから借りたタイミングクラスを使用します。

#include <time.h>
#include <sys/time.h>
#include <iomanip>
#include <iostream>

using namespace std;

class Timer 
{
private:

timeval startTime;

public:

  void start()
  {
    gettimeofday(&startTime, NULL);
  }

  double stop()
  {
    timeval endTime;
    long seconds, useconds;
    double duration;

    gettimeofday(&endTime, NULL);

    seconds  = endTime.tv_sec  - startTime.tv_sec;
    useconds = endTime.tv_usec - startTime.tv_usec;

    duration = seconds + useconds/1000000.0;

    return duration;
  }

  static void printTime(double duration)
  {
    cout << setprecision(6) << fixed << duration << " seconds" << endl;
  }
};

例えば:

Timer timer = Timer();
timer.start();
long x=0;
for (int i = 0; i < 256; i++)
  for (int j = 0; j < 256; j++)
    for (int k = 0; k < 256; k++)
      for (int l = 0; l < 256; l++)
        x++;
timer.printTime(timer.stop());

利回り11.346621 seconds

私のハッシュ関数プロジェクトでは、次のようになります。

Number of collisions: 0
Set size: 16777216
VM: 841.797MB
22.5810500000 seconds
于 2012-05-15T20:41:14.707 に答える