long getTiming()
{
long start = someGetTimeFunction();
executeSomething();
return someTimeFunction() - start;
}
无论时间功能我用的东西表现不佳,这似乎增加显著的开销。我试过gettimeofday(),clock_gettime()与CLOCK_MONOTONIC, CLOCK_PROCESS_CPUTIME_ID和CLOCK_THREAD_CPUTIME_ID,我试过了一些装配,我发现here致电rdtsc。
随着各50万来看,这些都是他们的成本:
[INFO] [ OK ] X.TimeGetTimeOfDay (1165 ms)
[INFO] [ OK ] X.TimeRdtscl (1208 ms)
[INFO] [ OK ] X.TimeMonotomicGetTime (1536 ms)
[INFO] [ OK ] X.TimeProcessGetTime (1575 ms)
[INFO] [ OK ] X.TimeThreadGetTime (1522 ms)
这是在MacBook Pro上运行CentOS 5的虚框VM。
由于我需要计算增量,我不需要绝对时间。并且不存在比较在smp系统上的不同核心或CPU上获得的时间的风险。
我可以做得更好吗?
这里是我的测试案例:
TEST(X, TimeGetTimeOfDay)
{
for (int i = 0; i < 500000; i++) {
timeval when;
gettimeofday(&when, NULL);
}
}
TEST(X, TimeRdtscl)
{
for (int i = 0; i < 500000; i++) {
unsigned long long when;
rdtscl(&when);
}
}
TEST(X, TimeMonotomicGetTime)
{
for (int i = 0; i < 500000; i++) {
struct timespec when;
clock_gettime(CLOCK_MONOTONIC, &when);
}
}
TEST(X, TimeProcessGetTime)
{
for (int i = 0; i < 500000; i++) {
struct timespec when;
clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &when);
}
}
TEST(X, TimeThreadGetTime)
{
for (int i = 0; i < 500000; i++) {
struct timespec when;
clock_gettime(CLOCK_THREAD_CPUTIME_ID, &when);
}
}
下面是我从here得到了RDTSC。
inline void rdtscl(unsigned long long *t)
{
unsigned long long l, h;
__asm__ __volatile__ ("rdtsc" : "=a"(l), "=d"(h));
*t = ((unsigned long long)l)|(((unsigned long long)h) <<32);
}
2014-09-21
marathon
+3
所以你观察**的开销高达每个呼叫** 0.00315ms。如果某物快得多,甚至接近那个执行时间,那么它真的很快。你确定这实际上有问题吗? (我不确定普通个人电脑实际上可以使用更小的时间间隔。) –
2014-09-21 00:44:43
+1
您应该阅读[时间(7)](http://man7.org/linux/man-pages/man7/time.7.html)并安排您的基准测试功能运行时间超过100毫秒。 –
2014-09-21 00:50:56
+0
@BaummitAugen我计时的功能差不多一样快,而且他们确实在工作。所以通过计时这些,我增加了100%的开销。我希望能做得更好。 –
2014-09-21 15:41:33