Почему прошедшее время равно 0?

Я сделал программу, которая разворачивает циклы и измеряет время, необходимое для сортировки массива, но проблема в том, что иногда программа развернутого цикла дает мне ответ 0 за наносекунды, а этого просто не может быть. Я пробовал это и с MONOTONIC, но просто не помогает. Вот мой код:

    #include <stdio.h>
    #include <time.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <math.h>
    #include <unistd.h>
    #define BILLION  1000000000L
    int main()
    {
        char buf[500];
        int numberOfElements = 10;
        int currentTest = 1;
        int randomArray[numberOfElements];
        int minIndex;
        int minValue;
        struct timespec requestStart;
        struct timespec requestEnd;
        long int recordStartTime;
        long int recordEndTime;
        long int elapsedTime;
        FILE *arrangedArray;
        FILE *stopwatch;
        sprintf(buf,"place to store file/Stopwatch.txt", currentTest);
        stopwatch = fopen(buf, "a+");
        struct stat st = {0};
        sprintf(buf, "the place where you stored the stopwatch file", currentTest);
        if (stat(buf, &st) == -1)
        {
            sprintf(buf, "the place where you stored the stopwatch file", currentTest);
            mkdir(buf);
        }
        sprintf(buf, "the place where you store this program/ArrangedArray.txt", currentTest);
        arrangedArray = fopen(buf, "w+");
        randomArray[0] = 7045;

        randomArray[1] = 4949;

        randomArray[2] = 24507;

        randomArray[3] = 6071;

        randomArray[4] = 11820;

        randomArray[5] = 11710;

        randomArray[6] = 11168;

        randomArray[7] = 11234;

        randomArray[8] = 11863;

        randomArray[9] = 2683;

        clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &requestStart);
        recordStartTime = requestStart.tv_nsec + requestStart.tv_sec * BILLION;
        minIndex = 0;

        minIndex = 1;

        minIndex = 9;

        minValue = randomArray[9];

        randomArray[9] = randomArray[0];

        randomArray[0] = 2683;

        minIndex = 1;

        minIndex = 2;

        minIndex = 3;

        minValue = randomArray[3];

        randomArray[3] = randomArray[2];

        randomArray[2] = 6071;

        minIndex = 3;

        minIndex = 4;

        minIndex = 5;

        minIndex = 6;

        minIndex = 9;

        minValue = randomArray[9];

        randomArray[9] = randomArray[3];

        randomArray[3] = 7045;

        minIndex = 4;

        minIndex = 5;

        minIndex = 6;

        minValue = randomArray[6];

        randomArray[6] = randomArray[4];

        randomArray[4] = 11168;

        minIndex = 5;

        minIndex = 7;

        minValue = randomArray[7];

        randomArray[7] = randomArray[5];

        randomArray[5] = 11234;

        minIndex = 6;

        minIndex = 7;

        minValue = randomArray[7];

        randomArray[7] = randomArray[6];

        randomArray[6] = 11710;

        minIndex = 7;

        minIndex = 8;

        minIndex = 9;

        clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &requestEnd);
        recordEndTime = (requestEnd.tv_nsec + requestEnd.tv_sec * BILLION);
        elapsedTime = recordEndTime - recordStartTime;
        sprintf(buf, "%li\n", elapsedTime);
        fputs(buf, stopwatch);
        sprintf(buf, "%i\n", randomArray[0]);
        fputs(buf, arrangedArray);
        sprintf(buf, "%i\n", randomArray[1]);
        fputs(buf, arrangedArray);
        sprintf(buf, "%i\n", randomArray[2]);
        fputs(buf, arrangedArray);
        sprintf(buf, "%i\n", randomArray[3]);
        fputs(buf, arrangedArray);
        sprintf(buf, "%i\n", randomArray[4]);
        fputs(buf, arrangedArray);
        sprintf(buf, "%i\n", randomArray[5]);
        fputs(buf, arrangedArray);
        sprintf(buf, "%i\n", randomArray[6]);
        fputs(buf, arrangedArray);
        sprintf(buf, "%i\n", randomArray[7]);
        fputs(buf, arrangedArray);
        sprintf(buf, "%i\n", randomArray[8]);
        fputs(buf, arrangedArray);
        sprintf(buf, "%i\n", randomArray[9]);
        fputs(buf, arrangedArray);

        fclose(arrangedArray);
        fclose(stopwatch);
        return 0;
    }

person Erlandas Aksomaitis    schedule 08.11.2016    source источник
comment
Ваше время может быть 0, потому что тактов часов не было. Прочтите этот вопрос об измерении времени выполнения.   -  person Weather Vane    schedule 08.11.2016
comment
Я предполагаю, что большая часть вашего кода будет оптимизирована, потому что она бесполезна. (установка minIndex без использования его между ними, например)   -  person Kami Kaze    schedule 08.11.2016
comment
В дополнение к предыдущим комментариям: между двумя вызовами clock_gettime очень мало кода, поэтому, даже если он не оптимизирован, прошедшее время может быть слишком коротким, чтобы его можно было измерить.   -  person Jabberwocky    schedule 08.11.2016
comment
мммммммм, хорошо, спасибо, я целую неделю пытался получить точные измерения на C, и я подумал, что оптимизация сделает измерения очень маленькими, но я не ожидал этого :D. Я провел такой же эксперимент на Java. Алгоритм развернутой сортировки занял 18000 наносекунд, в то время как развернутая сортировка того же кода заняла 3000 наносекунд. Ну, что ж, спасибо   -  person Erlandas Aksomaitis    schedule 08.11.2016
comment
при компиляции всегда включайте все предупреждения. Затем исправьте эти предупреждения. (для gcc при минимальном использовании: -Wall -Wextra -pedantic Я также использую: -Wconversion -std=gnu99) Компилятор выдаст длинный список проблем с размещенным кодом. Настоятельно рекомендуем исправить эти проблемы, прежде чем даже думать о попытке запустить код.   -  person user3629249    schedule 10.11.2016
comment
эта строка: sprintf(buf,"place to store file/Stopwatch.txt", currentTest); характерна для многих проблем с размещенным кодом. Параметр 'currentTest' передается в sprintf(), но строка формата: `место для хранения файла/Stopwatch.txt' не имеет '%d' для вставки параметра в строку формата.   -  person user3629249    schedule 10.11.2016
comment
при вызове (большинства) системных функций: всегда проверяйте возвращаемое значение, чтобы убедиться, что операция прошла успешно. т.е. fopen(), mkdir(), clock_gettime()   -  person user3629249    schedule 10.11.2016
comment
Вот что я получил, включив все предупреждения и c99 ||=== Файл сборки: нет цели ни в одном проекте (компилятор: неизвестен) ===| ||предупреждение: параметр командной строки '-Wzero-as-null-pointer-constant' действителен для C++/ObjC++, но не для C| ||=== Сборка завершена: 0 ошибок, 1 предупреждений (0 минут, 0 секунд)) ===|   -  person Erlandas Aksomaitis    schedule 10.11.2016
comment
плюс использовался текущий тест, но я просто упростил каталог, чтобы другие люди понимали, как я храню вещи. Неважно, где я их храню, поэтому я не думаю, что это проблема. fopen(), mkdir() все успешно, насчет clock_gettime() я не уверен... Я проверю   -  person Erlandas Aksomaitis    schedule 10.11.2016
comment
Я включил все опции и исправил проблему wzero, было всего три ошибки и две из них были из-за того, что две переменные не использовались. (Так и было задумано) Не ​​думаю, что там проблема.   -  person Erlandas Aksomaitis    schedule 10.11.2016