1. ホーム
  2. c++

[解決済み] C++でコードスニペットの実行時間を計算する方法

2022-08-05 23:20:33

質問

C++のコードスニペットの実行時間を秒単位で計算する必要があります。それは、WindowsまたはUnixマシンのいずれかで動作する必要があります。

私はこれを行うために、以下のコードを使用します。(インポート前)

clock_t startTime = clock();
// some code here
// to compute its execution duration in runtime
cout << double( clock() - startTime ) / (double)CLOCKS_PER_SEC<< " seconds." << endl;

しかし、小さな入力やa = a + 1のような短いステートメントでは、"0 seconds"という結果が出ます。0.0000001秒とかそんな感じなんでしょうかね。

そういえば System.nanoTime() はこの場合、かなりうまく動作することを覚えています。しかし、私は、同じ機能を clock() 関数から同じ機能を得ることはできません。

解決策はあるのでしょうか?

どのように解決するのですか?

私が書いたこの関数を使うことができます。この関数で GetTimeMs64() を呼び出すと、システムクロックを使って unix のエポックから経過したミリ秒を返します - ちょうど time(NULL) と同じですが、単位はミリ秒です。

WindowsとLinuxの両方で動作し、スレッドセーフです。

粒度はWindowsでは15ミリ秒、Linuxでは実装に依存しますが、通常は同じく15ミリ秒です。

#ifdef _WIN32
#include <Windows.h>
#else
#include <sys/time.h>
#include <ctime>
#endif

/* Remove if already defined */
typedef long long int64; typedef unsigned long long uint64;

/* Returns the amount of milliseconds elapsed since the UNIX epoch. Works on both
 * windows and linux. */

uint64 GetTimeMs64()
{
#ifdef _WIN32
 /* Windows */
 FILETIME ft;
 LARGE_INTEGER li;

 /* Get the amount of 100 nano seconds intervals elapsed since January 1, 1601 (UTC) and copy it
  * to a LARGE_INTEGER structure. */
 GetSystemTimeAsFileTime(&ft);
 li.LowPart = ft.dwLowDateTime;
 li.HighPart = ft.dwHighDateTime;

 uint64 ret = li.QuadPart;
 ret -= 116444736000000000LL; /* Convert from file time to UNIX epoch time. */
 ret /= 10000; /* From 100 nano seconds (10^-7) to 1 millisecond (10^-3) intervals */

 return ret;
#else
 /* Linux */
 struct timeval tv;

 gettimeofday(&tv, NULL);

 uint64 ret = tv.tv_usec;
 /* Convert from micro seconds (10^-6) to milliseconds (10^-3) */
 ret /= 1000;

 /* Adds the seconds (10^0) after converting them to milliseconds (10^-3) */
 ret += (tv.tv_sec * 1000);

 return ret;
#endif
}