我有这个程序打印2个不同实例之间的时差,但它打印精度为秒.我希望以毫秒为单位打印它,另一个以纳秒为单位进行打印.
//Prints in accuracy of seconds
#include <stdio.h>
#include <time.h>
int main(void)
{
time_t now, later;
double seconds;
time(&now);
sleep(2);
time(&later);
seconds = difftime(later, now);
printf("%.f seconds difference", seconds);
}
Run Code Online (Sandbox Code Playgroud)
我怎么能做到这一点?
我们想要计算玩家完成游戏所花费的时间.但是对于time.h,我们只能在几秒钟内计算出来.但这并不准确.是否有可能以毫秒为单位获得时间?什么是%?打印到?
在Darwin上,POSIX标准clock_gettime(CLOCK_MONOTONIC)计时器不可用.相反,最高分辨率的单调计时器是通过mach_absolute_time函数获得的mach/mach_time.h.
返回的结果可能是来自处理器的未调整的滴答计数,在这种情况下,时间单位可能是奇怪的倍数.例如,在具有33MHz滴答计数的CPU上,Darwin返回1000000000/33333335作为返回结果的确切单位(即,乘以该mach_absolute_time分数以获得纳秒值).
我们通常希望将精确刻度转换为"标准"(十进制)单位,但不幸的是,即使在64位算术中,绝对时间乘以分数也会溢出.这是苹果公司唯一的文件归属mach_absolute_time于(技术问答QA1398).1
我该如何编写正确使用的函数mach_absolute_time?
mach_timebase_info始终返回1/1作为缩放因子,因为CPU的原始滴答计数不可靠(动态速度步进),因此API会为您进行缩放.在PowerPC Mac上,mach_timebase_info返回1000000000/33333335或1000000000/25000000,因此Apple提供的代码每隔几分钟就会溢出一次.哎呀.我需要知道如何计算C代码中函数的时间(以纳秒为单位).我试着重复这个功能直到消耗几微秒.是否还有其他功能time.h可用于计算以纳秒为单位的时间?
我必须为大学编写一个非常简单的控制台程序,它必须测量输入所需的时间.
因此我clock()在前面和fgets()通话后使用.在我的Windows计算机上运行时,它工作得很好.然而,当我在我的朋友Mac-Book和Linux-PC上运行时,它给出了非常小的结果(只有几微秒的时间).
我在所有3 OS上尝试了以下代码:
#include <stdio.h>
#include <time.h>
#include <unistd.h>
void main()
{
clock_t t;
printf("Sleeping for a bit\n");
t = clock();
// Alternatively some fgets(...)
usleep(999999);
t = clock() - t;
printf("Processor time spent: %lf", ((double)t) / CLOCKS_PER_SEC);
}
Run Code Online (Sandbox Code Playgroud)
在Windows上,输出显示1秒(或使用时键入的时间fgets),另外两个操作系统显示的时间不超过0秒.
现在我的问题是为什么clock()在这些操作系统的实现上存在这样的差异.对于Windows来说,当线程处于休眠/等待状态时,时钟似乎仍在滴答作响,但对于Linux和Mac则不然?
编辑:感谢你们到目前为止的答案,所以这只是微软的错误实现.
有人可以回答我的上一个问题:
还有一种方法可以测量我想要使用C标准库在所有3个系统上测量的内容,因为它clock()似乎只在Windows上以这种方式工作吗?
我研究了几个主题,以期获得有关如何使用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 ++中创建一个精确的,亚秒级的精确计数器,该计数器可以在多核和/或自动超频处理器上工作?
提前致谢。
在 C# 中,我会启动 Stopwatch 类来对某些方法花费的时间进行一些快速而粗略的计时。
在 C++ 中与此等效的是什么?是否内置高精度定时器?
我试图找到一种方法来测量代码执行时间,而不使用下面列出的约束.
在我的要求中,它适用于具有非常严格一致性的嵌入式系统.
我所能找到的只是使用C标头,未经批准的Google C++编码标准或者提升标题,这些标题不在项目一致性范围之内.
我仔细查看了建议的帖子,这些帖子看起来很相似,却无法找到所需内容的答案.请帮忙!
约束条件不得使用以下内容,
C系统标题就像 sys/time.h
未经批准的标题,例如chronoGoogle C++风格指南https://google.github.io/styleguide/cppguide.html
目标平台是Linux
此样式检查器列出了未经批准的chrono ... https://github.com/google/styleguide/blob/gh-pages/cpplint/cpplint.py
所以,我想看看我的代码中的函数需要多长时间才能运行。(实时)。最初,我有这个:
clock_t begin = clock();
my_function();
clock_t end = clock();
double time_spent = (double)(end - begin);
Run Code Online (Sandbox Code Playgroud)
但显然,这种方法存在一些问题。
那么,获取函数运行时间的正确方法是什么?CPU 时间真的是正确的方法吗?我可以测量多精确?我在想纳秒级?
如何在C中获得当前时间(以毫秒为单位)?我正在做以下事情以便在几秒钟内获得时间:
struct tm ptm;
now = time(NULL);
localtime_r(&now,ptm);
myTime= (ptm->tm_hour * 3600) + (ptm->tm_min * 60) + (ptm->tm_sec);
Run Code Online (Sandbox Code Playgroud)
查看time.h,其中struct tm没有毫秒成员.
我正在尝试编写一个程序,根据系统的内部时钟生成一个随机数,这样我就不需要种子也不需要第一个值.必须从内部时钟获取第一个值,方法是将年,月,日,小时,分钟,秒转换为毫秒,并将它们添加到当前毫秒,以获得唯一编号(时间戳).有什么帮助在C中获得这些值?
我使用以下代码在 c 和 java 中实现并基准测试了以下函数。对于 c,我得到大约 1.688852 秒,而对于 java,只需要 0.355038 秒。即使我删除该sqrt函数,手动内联代码或更改函数签名以接受 6 个double坐标(以避免通过指针访问),c 时间流逝也不会改善太多。
我正在编译 c 程序,例如cc -O2 main.c -lm. 对于java,我使用默认的jvm选项(java 8,openjdk)在intellij idea中运行应用程序。
C:
\n#include <math.h>\n#include <stdio.h>\n#include <time.h>\n\ntypedef struct point3d\n{\n double x;\n double y;\n double z;\n} point3d_t;\n\ndouble distance(point3d_t *from, point3d_t *to);\n\nint main(int argc, char const *argv[])\n{\n point3d_t from = {.x = 2.3, .y = 3.45, .z = 4.56};\n point3d_t to = {.x = 5.678, .y = 3.45, .z = -9.0781};\n\n double …Run Code Online (Sandbox Code Playgroud)