gpt4 book ai didi

c++ - clock() 在两个位置返回相同数量的刻度

转载 作者:搜寻专家 更新时间:2023-10-31 00:35:43 26 4
gpt4 key购买 nike

我正在尝试学习如何使用 clock()。这是我的一段代码

int main()
{
srand(time(NULL));
clock_t t;
int num[100000];
int total=0;
t=clock();
cout<<"tick:"<<t<<endl;
for (int i=0;i<100000;i++)
{
num[i]=rand();
//cout<<num[i]<<endl;
}
for(int j=0;j<100000;j++)
{
total+=num[j];
}
t=clock();
cout<<"total:"<<total<<endl;
cout<<"ticks after loop:"<<t<<endl;
//std::cout<<"The number of ticks for the loop to caluclate total:"<<t<<"\t time is seconds:"<<((float)t)/CLOCKS_PER_SEC<<endl;
cin.get();
}

我得到的结果如下图所示。我不明白为什么即使中间有两个大循环,滴答计数也相同。

result

最佳答案

clock()函数具有有限分辨率。在 VC2013 上,它是每毫秒一次。 (您的系统可能会有所不同)。如果您调用 clock()在同一毫秒(或任何时间)内两次,您将获得相同的值。

<ctime>有一个常数 CLOCKS_PER_SEC它告诉你每秒有多少滴答声。对于 VC2012 为 1000。

** 更新 1 **

你说你在 Windows 中。这是一些特定于 Win 的代码,可获得更高的解析时间。如果我有时间,我会尝试做一些便携的事情。

#include <iostream>
#include <vector>
#include <ctime>
#include <Windows.h>

int main()
{
::srand(::time(NULL));

FILETIME ftStart, ftEnd;
const int nMax = 1000*1000;
std::vector<unsigned> vBuff(nMax);
int nTotal=0;

::GetSystemTimeAsFileTime(&ftStart);
for (int i=0;i<nMax;i++)
{
vBuff[i]=rand();
}
for(int j=0;j<nMax;j++)
{
nTotal+=vBuff[j];
}
::GetSystemTimeAsFileTime(&ftEnd);

double dElapsed = (ftEnd.dwLowDateTime - ftStart.dwLowDateTime) / 10000.0;
std::cout << "Elapsed time = " << dElapsed << " millisec\n";

return 0;
}

** 更新 2 **好的,这是可移植版本。

#include <iostream>
#include <vector>
#include <ctime>
#include <chrono>

// abbreviations to avoid long lines
typedef std::chrono::high_resolution_clock Clock_t;
typedef std::chrono::time_point<Clock_t> TimePoint_t;
typedef std::chrono::microseconds usec;

uint64_t ToUsec(Clock_t::duration t)
{
return std::chrono::duration_cast<usec>(t).count();
}

int main()
{
::srand(static_cast<unsigned>(::time(nullptr)));

const int nMax = 1000*1000;
std::vector<unsigned> vBuff(nMax);
int nTotal=0;

TimePoint_t tStart(Clock_t::now());
for (int i=0;i<nMax;i++)
{
vBuff[i]=rand();
}
for(int j=0;j<nMax;j++)
{
nTotal+=vBuff[j];
}
TimePoint_t tEnd(Clock_t::now());
uint64_t nMicroSec = ToUsec(tEnd - tStart);

std::cout << "Elapsed time = "
<< nMicroSec / 1000.0
<< " millisec\n";

return 0;
}

关于c++ - clock() 在两个位置返回相同数量的刻度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23320340/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com