difftime возвращает 0, когда есть явная разница - PullRequest
4 голосов
/ 28 октября 2010

У меня есть следующая программа C99, которая измеряет выполнение простых операций деления относительно сложения.Однако функция difftime продолжает возвращать 0, хотя программе явно требуется несколько секунд для обработки runAddition и runDivision с iterations, установленным на 1 млрд.

#include <stdio.h>
#include <time.h>

void runAddition(long long iterations)
{
    long long temp;
    for (long long i = 1; i <= iterations; i++)
    {
        temp = temp + i;
    }
}

void runDivision(long long iterations)
{
    long long temp;

    // Start at 1 to avoid division by 0!
    for (long long i = 1; i <= iterations; i++)
    {
        temp = temp / i;
    }
}

int main()
{
    long long iterations = 1000000000;
    time_t startTime;

    printf("How many iterations would you like to run of each operation? ");
    scanf("%d", &iterations);

    printf("Running %d additions...\n", iterations);
    startTime = time(NULL);
    runAddition(iterations);
    printf("%d additions took %f seconds\n", iterations, difftime(time(NULL), startTime));

    printf("Running %d divisions...\n", iterations);
    startTime = time(NULL);
    runDivision(iterations);
    printf("%d divisions took %f seconds\n", iterations, difftime(time(NULL), startTime));
}

Ответы [ 5 ]

7 голосов
/ 28 октября 2010

Ваша строка формата ожидает int (%d) и double (%f).Ваши аргументы long long и double.Первую строку формата следует установить как %lld.

Когда вы помещаете аргументы в стеке для вызова printf, вы нажимаете long long, используя 8 байтов, и double, используя также 8 байтов.Когда функция printf читает строку формата, она ожидает сначала int на 4 байта и double на 8 байтов.printf правильно получает int, так как вы в порядке байтов, и первых четырех байтов вашего long long достаточно для представления значения.printf затем получает double, для которого он получает последние четыре байта long long, за которыми следуют первые четыре байта double.Поскольку последние четыре байта long long являются нулями, то, что printf считает двойным, начинается с четырех байтов со значением ноль, что приводит к очень крошечному значению для double в соответствии с двоичным представлением значений типа double.

2 голосов
/ 28 октября 2010

Попробуйте использовать %lld вместо %d в printf:

printf("%lld additions t
         ^^^

Работает нормально после этого изменения.

1 голос
/ 28 октября 2010

Сделайте темп volatile, чтобы он не был оптимизирован. Компилятор, вероятно, видит его как раздел / функцию без побочных эффектов.

0 голосов
/ 28 октября 2010

time () возвращает time_t с разрешением в одну секунду.

Время, необходимое для runDivision (), составляет менее одной секунды;Один миллиард операций на многоядерном ядре займет меньше секунды.

0 голосов
/ 28 октября 2010

Рассчитывает разницу в секундах между временем1 и временем2. Так, может быть, ваша разница во времени составляет менее 1 секунды?

Выведите ваше время начала и окончания для проверки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...