在尝试构建一个对延迟敏感的应用程序时,需要每秒发送100条消息,每条消息都有时间字段,我们要考虑优化gettimeofday.首先想到的是rdtsc基于优化.有什么想法吗 ?还有其他指针吗?返回的时间值所需的准确度以毫秒为单位,但如果该值偶尔与接收器不同步1-2毫秒,则不是很大.试图比62纳秒的gettimeofday做得更好
在我测试的两个系统上(一个32位的Ubuntu 12.04服务器和一个64位的Ubuntu 13.10 VM),time()给出的纪元以来的秒数可能与gettimeofday()不同.
具体来说,虽然我在调用time() 后调用gettimeofday(),但返回的值time()有时小于tv_sec返回的值gettimeofday().
这显然发生在时钟滚动到新的秒钟之后.
这导致了我的一些代码中的错误,这些代码期望time()和gettimeofday()的秒可以互换.
示例代码演示此问题:
#include <stdio.h>
#include <time.h>
#include <sys/time.h>
int main()
{
time_t start = time(NULL);
int same = 0;
int different = 0;
int max_usec = 0;
while (1) {
time_t t;
struct timeval tv;
gettimeofday(&tv, NULL);
t = time(NULL);
if (t < tv.tv_sec) {
different++;
if (tv.tv_usec > max_usec) {
max_usec = tv.tv_usec;
}
} else { …Run Code Online (Sandbox Code Playgroud) 我正在编写一个便携式Socket类,它支持发送和接收的超时...为了实现这些超时我正在使用select()....但是,我有时需要知道我被阻止了多长时间里面select()当然在Linux上我通过gettimeofday()在我打电话之前和之后调用select()然后timersub()用来计算delta来实现...
鉴于select()Windows接受struct timeval它的超时,我应该用什么方法来取代Windows上的gettimeofday()?
有人可以帮我在Windows XP上使用Visual Studio C++ 2008的gettimeofday()函数吗?这是我在网上找到的代码:
#include < time.h >
#include <windows.h>
#if defined(_MSC_VER) || defined(_MSC_EXTENSIONS)
#define DELTA_EPOCH_IN_MICROSECS 11644473600000000Ui64
#else
#define DELTA_EPOCH_IN_MICROSECS 11644473600000000ULL
#endif
struct timezone
{
int tz_minuteswest; /* minutes W of Greenwich */
int tz_dsttime; /* type of dst correction */
};
int gettimeofday(struct timeval *tv, struct timezone *tz)
{
FILETIME ft;
unsigned __int64 tmpres = 0;
static int tzflag;
if (NULL != tv)
{
GetSystemTimeAsFileTime(&ft);
tmpres |= ft.dwHighDateTime;
tmpres <<= 32;
tmpres |= ft.dwLowDateTime;
/*converting file time to …Run Code Online (Sandbox Code Playgroud) 我真的不想描述,因为我想要在不同的简单功能上做很多不同的小基准测试.对于我的生活,我找不到一种方法来记录C++中的毫秒数,顺便说一句,我正在使用Linux.
你能否建议以毫秒为单位获取系统时钟的方法(如果我找不到简单的方法,我可以用几秒钟来解决......)以及它们包含在哪个标题中?
我已经尝试了谷歌,php.net和php邮件列表的档案,但我找不到我想要的东西.也许这是显而易见的,或者也许没有人想知道这个......
多年来,我一直使用microtime()来获取当前时间,包括微秒.但是,有人在手册页中的一句话中指出:"此功能仅在支持gettimeofday()系统调用的操作系统上可用."
PHP的gettimeofday()表明了同样的情况:"这是gettimeofday(2)的接口."
但是......那么什么样的系统没有这个系统调用?一些谷歌搜索提供了许多C程序员试图在Windows上的C中获得gettimeofday()实现,因为它似乎不包括它.但PHP的microtime()和gettimeofday()似乎在Windows上运行得很好(至少我可以使用的方框).此外,我似乎无法在网络上的任何地方找到PHP代码,似乎在调用它之前检查microtime()或gettimeofday()的存在,并且必须有许多PHP程序员在Windows上工作盒子......
我是否应该忽略手册中的句子并且只相信这两个函数始终可用?或者是否有另一种跨平台方式来获取系统时间,包括微秒,而不使用microtime()或gettimeofday()?或者两个函数是否总是存在,但是如果没有gettimeofday()系统调用可用,那么就不给我微秒?
编辑1:
"Returns the current Unix timestamp with microseconds.
This function is only available on operating systems that
support the gettimeofday() system call."
Run Code Online (Sandbox Code Playgroud)
也许这有点澄清了我的观点.
Java在 Linux上System.nanoTime()的单调实现依赖于操作系统上CLOCK_MONOTONIC可用的事实。如果它不可用,它会回退到gettimeofday这可能导致在使用nanoTime. 例如,以下测试可能会失败。
long t1 = System.nanoTime();
long t2 = System.nanoTime();
assert t2 >= t1
Run Code Online (Sandbox Code Playgroud)
在哪些情况下CLOCK_MONOTONIC可能在服务器上不可用?假设CLOCK_MONOTONIC时钟在所有现代 Linux 服务器上都可用是否合理?
我有一个程序来计算pub-sub模型中对象的延迟.我已将以下函数用于时间戳:
uint64_t GetTimeStamp() {
struct timeval tv;
gettimeofday(&tv,NULL);
return tv.tv_sec*(uint64_t)1000000+tv.tv_usec;
}
Run Code Online (Sandbox Code Playgroud)
延迟测量为发布者和订阅者的时间戳差异.所以,我担心测量的延迟单位.是几秒钟还是几微秒?
我正在编写一些 C 代码,它实现了一个三重嵌套 for 循环来计算矩阵乘法,同时使用 OpenMP 对其进行并行化。我试图准确地测量从 for 循环开始到结束所花费的时间。到目前为止,我一直在使用 gettimeofday(),但我注意到有时感觉它没有准确记录执行 for 循环所花费的时间。似乎是在说它比实际花费的时间更长。
这是原始代码:
struct timeval start end;
double elapsed;
gettimeofday(&start, NULL);
#pragma omp parallel for num_threads(threads) private(i, j, k)
for(...)
{
...
for(...)
{
...
for(...)
{
...
}
}
}
gettimeofday(&end, NULL);
elapsed = (end.tv_sec+1E-6*end.tv_usec) - (start.tv_sec+1E-6*start.tv_usec)
Run Code Online (Sandbox Code Playgroud)
这是使用clock_gettime()的相同代码:
struct timespec start1, finish1;
double elapsed1;
clock_gettime(CLOCK_MONOTONIC, &start1);
#pragma omp parallel for num_threads(threads) private(i, j, k)
for(...)
{
...
for(...)
{
...
for(...)
{
...
}
}
}
clock_gettime(CLOCK_MONOTONIC, &finish1);
elapsed1 …Run Code Online (Sandbox Code Playgroud) 我正在阅读 OSTEP 的single.dvi章节。在作业部分,它说:
\n\n\n您\xe2\x80\x99必须考虑的一件事是计时器的精度和准确度。您可以使用的典型计时器是
\ngettimeofday();\n阅读手册页以获取详细信息。您\xe2\x80\x99 将看到gettimeofday()\n返回自 1970 年以来以微秒为单位的时间;然而,这并不意味着计时器精确到微秒。测量连续调用\ngettimeofday()以了解计时器的精确度\n;这将告诉您必须运行多少次空系统调用\n测试\xe2\x80\x99 迭代才能获得良好的测量结果。如果\ngettimeofday()对您来说不够精确,您可以考虑\nrdtsc使用 x86 计算机上可用的指令
我编写了一些代码来测试调用函数的成本,gettimeofday()如下所示:
#include <stdio.h>\n#include <sys/time.h>\n\n#define MAX_TIMES 100000\n\nvoid m_gettimeofday() {\n struct timeval current_time[MAX_TIMES];\n int i;\n for (i = 0; i < MAX_TIMES; ++i) {\n gettimeofday(¤t_time[i], NULL);\n }\n printf("seconds: %ld\\nmicro_seconds: %ld\\n", current_time[0].tv_sec, current_time[0].tv_usec);\n printf("seconds: %ld\\nmicro_seconds: %ld\\n", current_time[MAX_TIMES - 1].tv_sec, current_time[MAX_TIMES - 1].tv_usec);\n printf("the average time of a gettimeofday function call is: %ld us\\n", (current_time[MAX_TIMES - …Run Code Online (Sandbox Code Playgroud) gettimeofday ×10
c ×6
clock ×3
linux ×3
time ×3
c++ ×2
benchmarking ×1
java ×1
microtime ×1
openmp ×1
optimization ×1
php ×1
select ×1
visual-c++ ×1
winapi ×1
windows ×1