C++ C++,计时器,毫秒 #包括 #包括 #包括 使用名称空间std; 双差分时钟(时钟1、时钟2) { 双diffticks=时钟1-2; 双diffms=(diffticks)/(时钟每秒/1000); 返回diffms; } int main() { 时钟启动=时钟(); 对于(int i=0;i++) { 如果(i==10000)中断; } clock_t end=clock(); cout
首先你应该减去结束-开始,而不是相反。C++ C++,计时器,毫秒 #包括 #包括 #包括 使用名称空间std; 双差分时钟(时钟1、时钟2) { 双diffticks=时钟1-2; 双diffms=(diffticks)/(时钟每秒/1000); 返回diffms; } int main() { 时钟启动=时钟(); 对于(int i=0;i++) { 如果(i==10000)中断; } clock_t end=clock(); cout,c++,timer,C++,Timer,首先你应该减去结束-开始,而不是相反。 文档中说,如果值不可用,clock()返回-1,您检查过了吗? 编译程序时使用什么优化级别?如果启用优化,编译器可以有效地完全消除循环。问题似乎是循环太短。我在我的系统上尝试了它,它给出了0个刻度。我检查了diffticks是什么,它是0。将循环大小增加到100000000,因此没有问题iceable时滞,我得到-290作为输出(错误——我认为diffticks应该是clock2-clock1,所以我们应该得到290而不是-290)。我还尝试在分区中将“1
文档中说,如果值不可用,clock()返回-1,您检查过了吗?
编译程序时使用什么优化级别?如果启用优化,编译器可以有效地完全消除循环。问题似乎是循环太短。我在我的系统上尝试了它,它给出了0个刻度。我检查了diffticks是什么,它是0。将循环大小增加到100000000,因此没有问题iceable时滞,我得到-290作为输出(错误——我认为diffticks应该是clock2-clock1,所以我们应该得到290而不是-290)。我还尝试在分区中将“1000”改为“1000.0”,但没有成功
使用优化编译确实会删除循环,因此您不必使用它,也不必让循环“做点什么”,例如,增加循环体中循环计数器以外的计数器。至少GCC是这样做的。乍一看,您似乎是在从较小的值中减去较大的值。您调用:
#include <iostream>
#include <conio.h>
#include <ctime>
using namespace std;
double diffclock(clock_t clock1,clock_t clock2)
{
double diffticks=clock1-clock2;
double diffms=(diffticks)/(CLOCKS_PER_SEC/1000);
return diffms;
}
int main()
{
clock_t start = clock();
for(int i=0;;i++)
{
if(i==10000)break;
}
clock_t end = clock();
cout << diffclock(start,end)<<endl;
getch();
return 0;
}
但diffclock的定义如下:
diffclock( start, end );
除此之外,它可能与您转换单位的方式有关。使用1000转换为毫秒在本页上有所不同:
这里有几个问题。第一个问题是,在传递到
diffclock()时,您显然切换了启动和停止时间
函数。第二个问题是优化。任何启用了优化的合理智能编译器都会简单地丢弃整个循环,因为它没有任何副作用。但即使解决了上述问题,程序也很可能打印0。如果你试图想象每秒执行数十亿次操作,那么抛出复杂的d现代CPU采用的无序执行、预测和大量其他技术,即使是一个CPU也可能会优化循环。但即使它没有优化循环,你也需要大量超过10K的迭代才能使其运行更长时间。你可能需要程序运行一两秒钟才能得到clock()
反映任何东西
但最重要的问题是clock()
本身。该函数不适用于任何时间的性能测量。它所做的是为您提供程序使用的处理器时间的近似值。除了任何给定实现可能使用的近似方法的模糊性质之外(因为标准不要求有任何具体内容),POSIX标准还要求每秒时钟数
等于1000000
,与实际分辨率无关。换句话说,不管时钟有多精确,也不管CPU运行的频率是多少。简单地说,这是一个完全无用的数字,因此是一个完全无用的函数它仍然存在的唯一原因可能是历史原因。所以,请不要使用它
为了实现您所寻找的目标,人们习惯于以用于读取的相应CPU指令的名称来读取也称为“RDTSC”的指令。然而,如今,这也基本上是无用的,因为:
getch()
要保持终端打开,我假设您使用的是Windows。不幸的是,您没有clock\u gettime()
,最接近的是性能计数器API:
double diffclock( clock_t clock1, clock_t clock2 ) {
double diffticks = clock1 - clock2;
double diffms = diffticks / ( CLOCKS_PER_SEC / 1000 );
return diffms;
}
对于一个可移植的解决方案,最好的选择是C++11,但大多数工业级编译器(GCC、Clang、MSVC)都支持它
下面是一个如何使用它的示例。请注意,因为我知道我的CPU将以超过毫秒的速度以整数的方式执行10000次增量,所以我将其更改为微秒。我还将计数器声明为volatile
,希望编译器不会对其进行优化
BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency);
BOOL QueryPerformanceCounter(LARGE_INTEGER *lpPerformanceCount);
希望有帮助。祝你好运!注意:这在c++11之后可用 您可以使用std::chrono库。 chrono有两个区
#include <ctime>
#include <chrono>
#include <iostream>
int main()
{
volatile int i = 0; // "volatile" is to ask compiler not to optimize the loop away.
auto start = std::chrono::steady_clock::now();
while (i < 10000) {
++i;
}
auto end = std::chrono::steady_clock::now();
auto elapsed = std::chrono::duration_cast<std::chrono::microseconds>(end - start);
std::cout << "It took me " << elapsed.count() << " microseconds." << std::endl;
}
$ g++ -std=c++11 -Wall -o test ./test.cpp && ./test
It took me 23 microseconds.
#include <chrono>
using namespace std::chrono;
auto start = high_resolution_clock::now();
auto stop = high_resolution_clock::now();
auto duration = duration_cast<microseconds>(stop - start);
cout << duration.count() << endl;