在 C++/CLI 中计算时间
Counting time in C++/CLI
我有一个应用程序,我必须计算执行部分 C++ 函数和 ASM 函数的时间。实际上我有问题,我得到的时间很奇怪 - 0 或大约 15600。O 更频繁地发生。有时,执行后,时间看起来不错,但值不同于 0 和 ~15600。任何人都知道为什么会发生?以及如何解决它?
计算我的 C++ 应用程序执行时间的片段:
auto start = chrono::system_clock::now();
for (int i = 0; i < nThreads; i++)
xThread[i]->Start(i);
for (int i = 0; i < nThreads; i++)
xThread[i]->Join();
auto elapsed = chrono::system_clock::now() - start;
long long milliseconds = chrono::duration_cast<std::chrono::microseconds>(elapsed).count();
cppTimer = milliseconds;
我觉得不错。除了强制转换为 std::chrono::microseconds
并将其命名为 milliseconds
.
我用了好几个月的片段是:
class benchmark {
private:
typedef std::chrono::high_resolution_clock clock;
typedef std::chrono::milliseconds milliseconds;
clock::time_point start;
public:
benchmark(bool startCounting = true) {
if(startCounting)
start = clock::now();
}
void reset() {
start = clock::now();
}
// in milliseconds
double elapsed() {
milliseconds ms = std::chrono::duration_cast<milliseconds>(clock::now() - start);
double elapsed_secs = ms.count() / 1000.0;
return elapsed_secs;
}
};
// usage
benchmark b;
...
cout << "took " << b.elapsed() << " ms" << endl;
您所看到的是计时器的分辨率。显然,chrono::system_clock
在您的系统上每 1/64 秒或 15,625 微秒滴答一次。
由于您使用的是 C++/CLI 并且有可用的 .Net 库,我会改用 Stopwatch
class。它通常具有比 1/64 秒高得多的分辨率。
我有一个应用程序,我必须计算执行部分 C++ 函数和 ASM 函数的时间。实际上我有问题,我得到的时间很奇怪 - 0 或大约 15600。O 更频繁地发生。有时,执行后,时间看起来不错,但值不同于 0 和 ~15600。任何人都知道为什么会发生?以及如何解决它? 计算我的 C++ 应用程序执行时间的片段:
auto start = chrono::system_clock::now();
for (int i = 0; i < nThreads; i++)
xThread[i]->Start(i);
for (int i = 0; i < nThreads; i++)
xThread[i]->Join();
auto elapsed = chrono::system_clock::now() - start;
long long milliseconds = chrono::duration_cast<std::chrono::microseconds>(elapsed).count();
cppTimer = milliseconds;
我觉得不错。除了强制转换为 std::chrono::microseconds
并将其命名为 milliseconds
.
我用了好几个月的片段是:
class benchmark {
private:
typedef std::chrono::high_resolution_clock clock;
typedef std::chrono::milliseconds milliseconds;
clock::time_point start;
public:
benchmark(bool startCounting = true) {
if(startCounting)
start = clock::now();
}
void reset() {
start = clock::now();
}
// in milliseconds
double elapsed() {
milliseconds ms = std::chrono::duration_cast<milliseconds>(clock::now() - start);
double elapsed_secs = ms.count() / 1000.0;
return elapsed_secs;
}
};
// usage
benchmark b;
...
cout << "took " << b.elapsed() << " ms" << endl;
您所看到的是计时器的分辨率。显然,chrono::system_clock
在您的系统上每 1/64 秒或 15,625 微秒滴答一次。
由于您使用的是 C++/CLI 并且有可用的 .Net 库,我会改用 Stopwatch
class。它通常具有比 1/64 秒高得多的分辨率。