我正在开发一个需要详细计时信息的C ++应用程序,直到毫秒级。
我们打算使用time()
中的标准<ctime>
函数将时间收集到第二准确度。我们还想收集自time()
给出的最后一秒后经过的毫秒数。
有谁知道获取此信息的便捷方法?
答案 0 :(得分:11)
Boost.DateTime具有毫秒和纳秒表示 IF 底层平台支持它们。虽然它使用特定于平台的代码,但它会将这些详细信息保留在您的代码之外。
如果这是一个大问题,他们确实有另一种方法可以做到平台无关的亚秒级分辨率。 This page下面几段谈到了如何做到这一点。
(来自页面)
例如,假设我们想要使用表示十分之一秒的计数来构造。也就是说,每个刻度都是0.1秒。
int number_of_tenths = 5;
//create a resolution independent count -- divide by 10 since there are
//10 tenths in a second.
int count = number_of_tenths*(time_duration::ticks_per_second()/10);
time_duration td(1,2,3,count); //01:02:03.5 //no matter the resolution settings
答案 1 :(得分:8)
此问题没有可移植的解决方案,因为ANSI C没有定义标准的毫秒精确时间函数。如果您使用的是Windows,则可以使用GetTickCount(),timeGetTime()或QueryPerformanceCounter()/ QueryPerformanceFrequency()。请记住,这些具有不同的准确性和不同的运行时成本。
其他操作系统还有其他类似的功能;我不确定它们是不是我的头脑。
答案 2 :(得分:3)
GetTickCount * nix中的gettimeofday Windows中的QueryPerformanceCounter可以获得更好的分辨率(尽管GetTickCount应该这样做)
答案 3 :(得分:2)
英特尔处理器的高分辨率,低开销时序
如果您使用的是英特尔硬件,请按以下步骤阅读CPU实时指令计数器。它将告诉您自处理器启动以来执行的CPU周期数。这可能是您可以获得的最佳粒度计数器。
请注意,这是CPU周期数。在linux上,您可以从/ proc / cpuinfo获取CPU速度并除以获得秒数。将其转换为double是非常方便的。
当我在我的盒子上运行时,我得到了
11867927879484732 11867927879692217 it took this long to call printf: 207485
这是提供大量详细信息的Intel developer's guide。
#include < stdio.h > // stackoverflow bug: pre tag eats the filenames,
#include < stdint.h > // so i had to put spaces in the angle brackets
inline uint64_t rdtsc() {
uint32_t lo, hi;
__asm__ __volatile__ (
"xorl %%eax, %%eax\n"
"cpuid\n"
"rdtsc\n"
: "=a" (lo), "=d" (hi)
:
: "%ebx", "%ecx");
return (uint64_t)hi << 32 | lo;
}
main()
{
unsigned long long x;
unsigned long long y;
x = rdtsc();
printf("%lld\n",x);
y = rdtsc();
printf("%lld\n",y);
printf("it took this long to call printf: %lld\n",y-x);
}
答案 4 :(得分:2)
如果你在Unix上, gettimeofday()将返回秒和微秒,直到系统时钟的分辨率。
int gettimeofday(struct timeval *tv, struct timezone *tz);
struct timeval {
time_t tv_sec; /* seconds */
suseconds_t tv_usec; /* microseconds */
};
答案 5 :(得分:2)
正如其他人所说,没有一种可移植的方式来做到这一点。
我的工作(在msvc ++和linux / g ++上)是我使用以下在Windows上使用QueryPerformanceCounter并在Linux上使用gettimeofday的类。它是一个计时器类,可以让您获得两次调用之间的经过时间。您可能希望对其进行修改以满足您的需求。
#if defined(_MSC_VER)
# define NOMINMAX // workaround un bug dans windows.h qui define des macros
// "min" et "max" qui entrent en conflit avec la STL.
# include <windows.h>
#else
# include <sys/time.h>
#endif
namespace Utils
{
/**
* Implémente un chronométre qui mesure le temps etre deux appels.
*/
class CTimer
{
private:
# if defined(_MSC_VER)
LARGE_INTEGER m_depart;
# else
timeval m_depart;
# endif
public:
/**
* Démarre le timer.
*
* Cette fonction sert à démarrer le timer. Si le timer est déja
* démarrer, elle le redémarre simplement.
*/
inline void start()
{
# if defined(_MSC_VER)
QueryPerformanceCounter(&m_depart);
# else
gettimeofday(&m_depart, 0);
# endif
};
/**
* Retourne le nombre de secondes depuis le départ du timer.
*
* @return Nombre de secondes écoulés depuis le départ du timer
*/
inline float GetSecondes() const
{
# if defined(_MSC_VER)
LARGE_INTEGER now;
LARGE_INTEGER freq;
QueryPerformanceCounter(&now);
QueryPerformanceFrequency(&freq);
return (now.QuadPart - m_depart.QuadPart) / static_cast<float>(freq.QuadPart);
# else
timeval now;
gettimeofday(&now, 0);
return now.tv_sec - m_depart.tv_sec + (now.tv_usec - m_depart.tv_usec) / 1000000.0f;
# endif
};
};
}
答案 6 :(得分:1)
#include <ctime>
clock_t elapsed = static_cast<double>(clock() / CLOCKS_PER_SEC);
过去将是经过的处理器时间,以秒为单位。
分辨率取决于操作系统,但在大多数系统上通常优于毫秒分辨率。
答案 7 :(得分:0)
(c)time.h
标题中没有的内容需要特定于操作系统的方法。我相信所有这些方法都是第二种解决方案。
你在做什么操作系统?
答案 8 :(得分:-1)
如果这是针对Windows的话,请查看QueryPerformanceCounter方法。
答案 9 :(得分:-1)
英特尔的Threading Building Blocks library具有此功能,但TBB目前仅适用于英特尔和克隆(即,它不适用于SPARC,PowerPC,ARM等)。