仅使用ANSI C,有没有办法以毫秒或更多精度测量时间?我正在浏览time.h但我只发现了第二个精确功能.
我想知道某个函数在我的C++程序中执行多长时间才能在Linux上执行.之后,我想进行速度比较.我看到了几个时间功能,但结果来自于boost.计时:
process_user_cpu_clock, captures user-CPU time spent by the current process
Run Code Online (Sandbox Code Playgroud)
现在,我不清楚我是否使用上述功能,我将获得CPU花在该功能上的唯一时间吗?
其次,我找不到任何使用上述功能的例子.任何人都可以帮我如何使用上述功能?
PS:现在,我std::chrono::system_clock::now()用来在几秒钟内获得时间,但由于每次CPU负载不同,这给了我不同的结果.
真实的CPU频率和C语言中的clock_t(单位是时钟节拍)之间有什么关系?
假设我有下面一段 C 代码,它测量 CPU 运行循环所消耗的时间for。
但由于 CLOCKS_PER_SEC 在 C 标准库中是一个常量值(基本上是 1000,000),我想知道该clock函数如何测量程序在具有不同 CPU 频率的不同计算机上运行时所消耗的实际 CPU 周期(对于我来说)笔记本电脑,它是 2.6GHz)。
如果它们不相关,CPU 计时器在上述场景中如何工作?
#include <time.h>
#include <stdio.h>
int main(void) {
clock_t start_time = clock();
for(int i = 0; i < 10000; i++) {}
clock_t end_time = clock();
printf("%fs\n", (double)(end_time - start_time) / CLOCKS_PER_SEC);
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我编写了以下代码来测量对任何数据进行排序的时间。我得到的结果很奇怪,例如在某些情况下为负时间,并且对于相同的数据集没有得到任何一致的结果(我知道这不会完全相同)。请让我知道哪里出了问题或如何正确测量时间。
#include<stdio.h>
#include<sys/time.h>
void bubble(int a[],int n)
{
int i,j,flag,temp;
for(i=0;i<n-1;i++)
{
flag=0;
for(j=0;j<n-i-1;j++)
{
if(a[j]>a[j+1])
{
flag=1;
a[j]=a[j]+a[j+1];
a[j+1]=a[j]-a[j+1];
a[j]=a[j]-a[j+1];
}
}
if(flag==0)
break;
}
}
int main()
{
int n,a[100000],i;
printf("Enter the size of array:");
scanf("%d",&n);
for(i=0;i<n;i++)
a[i]=rand()%100000; //average case
//a[i]=i; //best case
//a[i]=n-1-i; //worst case
/*
printf("The UNsorted array is:\n");
for(i=0;i<n;i++)
printf("%d ",a[i]);
printf("\n\n");
*/
int st,et;
struct timezone tz;
struct timeval tv;
gettimeofday(&tv,NULL);
st=tv.tv_usec;
bubble(a,n);
gettimeofday(&tv,NULL);
et=tv.tv_usec;
printf("Sorting time: %d micro seconds\n",et-st);
/*
printf("\nThe sorted array …Run Code Online (Sandbox Code Playgroud) 我研究了几个主题,以期获得有关如何使用C或C ++制作可靠时钟的一些想法。但是,我还看到一些函数使用处理器的滴答声和每秒滴答声来计算最终结果,我认为这对像我这样拥有自动超频功能的CPU可能是个问题。我还看到其中一个在一段时间后重置,因此不是很可靠。
这个想法是要制作一个(最好是跨平台的)时钟,就像游戏中的时钟一样,其精度要优于第二个时钟,以便能够将“当前会话”中的经过时间与最后保存的时间相加该程序。这将是计算在没有游戏内时钟的主机游戏上花费的时间,以及从长远来看可能将其集成到实际PC游戏中的时间。
它应该能够在不占用过多或全部CPU时间(或多核CPU为单核时间)的情况下运行,因为仅将所有这些资源用于时钟以及在具有自动-超频(否则可能会导致结果不准确)。
我现在想在其中实现此功能的程序看起来像这样,但是我可能会用C重新编码(因为我必须回到学习如何用C ++编码的方式):
#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{
cout << "In game" << endl;
system("PAUSE");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
顺便说一句,我仍然需要摆脱特定于Windows的PAUSE功能,但是我认为可以通过一个简单的“ while(char!='\ n')”循环来解决。
我已经浏览过的内容:
(编辑:额外的研究,特别是对于C实现:
问题在于尚不清楚上述提到的某些方法(例如Boost或SDL2)在自动超频方面是否表现正常。
TL; DR:我应该使用什么跨平台功能在C / C ++中创建一个精确的,亚秒级的精确计数器,该计数器可以在多核和/或自动超频处理器上工作?
提前致谢。
我正在评估我的项目的网络+渲染工作负载。
程序连续运行一个主循环:
while (true) {
doSomething()
drawSomething()
doSomething2()
sendSomething()
}
Run Code Online (Sandbox Code Playgroud)
主循环每秒运行 60 多次。
我想查看性能故障,每个程序需要多少时间。
我担心的是,如果我打印每个程序的每个入口和出口的时间间隔,
这会导致巨大的性能开销。
我很好奇什么是衡量性能的惯用方法。
日志打印是否足够好?
c ×4
c++ ×2
clock ×2
benchmarking ×1
cpu-cycles ×1
optimization ×1
performance ×1
portability ×1
posix ×1
profiling ×1