gettimeofday() C++ Несоответствие
Я делаю проект, который включает в себя сравнение языков программирования. Я вычисляю функцию Аккермана. Я тестировал Java, Python и Ruby и получал ответы от 10 до 30 миллисекунд. Но C++, кажется, занимает 125 миллисекунд. Это нормально, или это проблема с gettimeofday()
? Gettimeofday()
вовремя
Я тестирую на (виртуальной) Ubuntu Natty Narwhal 32-bit. У меня не маленькая вычислительная мощность (четырехъядерный процессор Intel Xeon 2,13 ГГц).
Мой код здесь:
#include <iostream>
#include <sys/time.h>
using namespace std;
int a(int m,int n) {
if (m == 0) {
return n + 1;
} else if (m > 0 and n == 0) {
return a(m-1,1);
} else if (m > 0 and n > 0) {
return a(m-1,a(m,n-1));
}
}
int main() {
timeval tim;
gettimeofday(&tim,NULL);
double t1 = tim.tv_usec;
int v = a(3,4);
gettimeofday(&tim,NULL);
double t2 = tim.tv_usec;
cout << v << endl << t2-t1;
return 0;
}
1 ответ
Предполагая, что вы говорите о разрешении возвращаемых данных (а), спецификация POSIX для gettimeofday
состояния:
Разрешение системных часов не указано.
Это связано с тем, что системы могут иметь различную пропускную способность для отслеживания небольших периодов времени. Даже стандарт ISO clock()
Функция включает в себя такие предупреждения.
Если вы говорите о том, сколько времени требуется для его вызова (a), стандарт не дает никаких гарантий относительно производительности в этом направлении. Реализация совершенно бесплатна, чтобы подождать 125 минут, прежде чем дать вам время, хотя я сомневаюсь, что такая реализация будет иметь большой успех на рынке:-)
В качестве примера ограниченного разрешения я набрал следующий код, чтобы проверить это:
#include <stdio.h>
#include <sys/time.h>
#define NUMBER 30
int main (void) {
struct timeval tv[NUMBER];
int count[NUMBER], i, diff;
gettimeofday (&tv[0], NULL);
for (i = 1; i < NUMBER; i++) {
gettimeofday (&tv[i], NULL);
count[i] = 1;
while ((tv[i].tv_sec == tv[i-1].tv_sec) &&
(tv[i].tv_usec == tv[i-1].tv_usec))
{
gettimeofday (&tv[i], NULL);
count[i]++;
}
}
printf ("%2d: secs = %d, usecs = %6d\n", 0, tv[0].tv_sec, tv[0].tv_usec);
for (i = 1; i < NUMBER; i++) {
diff = (tv[i].tv_sec - tv[i-1].tv_sec) * 1000000;
diff += tv[i].tv_usec - tv[i-1].tv_usec;
printf ("%2d: secs = %d, usecs = %6d, count = %5d, diff = %d\n",
i, tv[i].tv_sec, tv[i].tv_usec, count[i], diff);
}
return 0;
}
Код в основном записывает изменения за основное время, сохраняя счет того, сколько вызовов потребовалось для gettimeofday()
на время, чтобы действительно измениться. Это на моем новом ноутбуке i7 grunter, поэтому у него не хватает вычислительной мощности (счетчик показывает, как часто он мог звонить gettimeofday()
за каждый квант времени, около 5000 баллов).
Выход был:
0: secs = 1318554836, usecs = 990820
1: secs = 1318554836, usecs = 991820, count = 5129, diff = 1000
2: secs = 1318554836, usecs = 992820, count = 5807, diff = 1000
3: secs = 1318554836, usecs = 993820, count = 5901, diff = 1000
4: secs = 1318554836, usecs = 994820, count = 5916, diff = 1000
5: secs = 1318554836, usecs = 995820, count = 5925, diff = 1000
6: secs = 1318554836, usecs = 996820, count = 5814, diff = 1000
7: secs = 1318554836, usecs = 997820, count = 5814, diff = 1000
8: secs = 1318554836, usecs = 998820, count = 5819, diff = 1000
9: secs = 1318554836, usecs = 999820, count = 5901, diff = 1000
10: secs = 1318554837, usecs = 820, count = 5815, diff = 1000
11: secs = 1318554837, usecs = 1820, count = 5866, diff = 1000
12: secs = 1318554837, usecs = 2820, count = 5849, diff = 1000
13: secs = 1318554837, usecs = 3820, count = 5857, diff = 1000
14: secs = 1318554837, usecs = 4820, count = 5867, diff = 1000
15: secs = 1318554837, usecs = 5820, count = 5852, diff = 1000
16: secs = 1318554837, usecs = 6820, count = 5865, diff = 1000
17: secs = 1318554837, usecs = 7820, count = 5867, diff = 1000
18: secs = 1318554837, usecs = 8820, count = 5885, diff = 1000
19: secs = 1318554837, usecs = 9820, count = 5864, diff = 1000
20: secs = 1318554837, usecs = 10820, count = 5918, diff = 1000
21: secs = 1318554837, usecs = 11820, count = 5869, diff = 1000
22: secs = 1318554837, usecs = 12820, count = 5866, diff = 1000
23: secs = 1318554837, usecs = 13820, count = 5875, diff = 1000
24: secs = 1318554837, usecs = 14820, count = 5925, diff = 1000
25: secs = 1318554837, usecs = 15820, count = 5870, diff = 1000
26: secs = 1318554837, usecs = 16820, count = 5877, diff = 1000
27: secs = 1318554837, usecs = 17820, count = 5868, diff = 1000
28: secs = 1318554837, usecs = 18820, count = 5874, diff = 1000
29: secs = 1318554837, usecs = 19820, count = 5862, diff = 1000
показывая, что разрешение кажется не более тысячи микросекунд. Конечно, ваша система может отличаться от этого, суть в том, что это зависит от вашей реализации и / или среды.
(а) Если вы говорите о чем - то еще, о чем я не задумывался, вам, вероятно, следует конкретизировать свой вопрос немного подробнее. Мы довольно хороши здесь на SO, но мы не всезнающие.