Различное поведение system_clock на windows и linux - PullRequest
1 голос
/ 12 марта 2019

Для данной программы я получаю разные результаты в Windows (VS 17) по сравнению с Linux-машиной (gcc 4.8).

#include "CrossDevelopment.h"
using namespace std;

int main()
{

    for (auto i = 0; i < 3; i++)
    {
//chrono::high_resolution_clock::time_point start_time = chrono::high_resolution_clock::now();
chrono::system_clock::time_point start_time = chrono::system_clock::now();

        for (auto i = 0; i < 50; i++) {
        int a = 10;
        int b = 5;
        int c = a + b;
                c += 10;
                c *= a;
                a *= b;

    }
//chrono::high_resolution_clock::time_point end_time = chrono::high_resolution_clock::now();
chrono::system_clock::time_point end_time = chrono::system_clock::now();
    auto elapsed_time = chrono::duration<double, micro>(end_time - start_time);


cout << "Difference of time " << elapsed_time.count() << " " << (end_time - start_time).count() 
<< " " << (chrono::duration_cast<chrono::nanoseconds>(end_time - start_time)).count() << endl;
}

getchar();
return 0;
}

Выход На Windows машине

Разница во времени 1 10 1000

Разница времени 0,7 7 700

Разница времени 0,7 7 700

На компьютере с Linux

Разница времени 0,806 806 806

Разница времени 0,6 600 600

Разница времени 0,542 542 542


Если вы видите последние столбцы, вы увидите разницу. Что не в случае high_resolution_clock.

1 Ответ

0 голосов
/ 12 марта 2019

Точность из system_clock::time-point не переносима на разных платформах.Но его можно легко проверить и / или преобразовать с известной точностью, как вы сделали в своем вопросе.

Самый простой способ проверить это - использовать мой date.h header :

#include "date/date.h"
#include <iostream>

int
main()
{
    using namespace std;
    using namespace std::chrono;
    using date::operator<<;
    auto start_time = system_clock::now();
    auto end_time = system_clock::now();
    cout << end_time - start_time << '\n';
}

На gcc это будет выводить что-то вроде:

1730ns

В Windows:

17[1/10000000]s

В macOS:

1µs

Объяснение:

На gcc system_clock::time_point имеет наносекундную точность, в Windows - 1/10'000'000 (100 нс), а на macOS - микросекундную точность.

Вы можете проверитьточность без заголовка date.h , взглянув на system_clock::duration::period::num и system_clock::duration::period::den, которые являются числителем и знаменателем дроби, которая задает длину в долях секунды, которую представляет каждый тик (1 и 10'000'000 в Windows).

Возможность распечатывать длительности с единицами измерения (например, date.h ) в настоящее время включена в черновую спецификацию C ++ 20.

...