none
Снизилось разрешение функции GetSystemTimeAsFileTime()

    Вопрос

  • Я измерял быстродействие и точность нескольких API-функций получения времени на Windows (и, кстати, Linux, но это к делу не относится), замерял 10 дней назад и сегодня. Все замеры доступны по ссылке:

    https://github.com/bmstu-iu9/refal-5-lambda/issues/206

    Чтобы не переходить по ссылке, функция замера времени:

    void test_GetSystemTimeAsFileTime(void) {
      ULONGLONG now, prev, limit;
      unsigned long calls = 0, quanta = 0;
      GetSystemTimeAsFileTime((LPFILETIME) &prev);
      limit = prev + 10*1000*1000;        /* 100 ns */
      while (GetSystemTimeAsFileTime((LPFILETIME) &now), now <= limit) {
        ++calls;
        if (now != prev) {
          ++quanta;
          prev = now;
        }
      }
      printf(
        "Test GetSystemTimeAsFileTime()\n"
        "%ld calls of GetTickCount() per second, %f ns per call\n"
        "%ld quanta per second, %f us per quantum\n\n",
        calls, 1.0e9 / calls,
        quanta, 1.0e6 / quanta
      );
    }


    Машина: Intel® Core™ i5-2430M CPU @ 2.40GHz, 8 Гбайт ОЗУ, DDR3 1333 МГц, SSD, Windows 10 x64

    Версия Windows (команда ver):
    Microsoft Windows [Version 10.0.17134.648]
    сборка: 17134.648

    9 дней назад (26 марта 2019) разрешение функции GetSystemTimeAsFileTime() составляло ≈2000 тиков в секунду или 0,5 мс.

    Test GetSystemTimeAsFileTime()
    137165732 calls of GetTickCount() per second, 7.290451 ns per call
    2000 quanta per second, 500.000000 us per quantum

    Сегодня (4 апреля 2019) сделал тот же замер — разрешение у функции GetSystemTimeAsFileTime() оказалось таким же, как и у функции GetTickCount() — 64 тика в секунду или ≈16 мс на один тик:

    Test GetSystemTimeAsFileTime()
    96319845 calls of GetTickCount() per second, 10.382077 ns per call
    63 quanta per second, 15873.015873 us per quantum

    Позавчера (2 апреля 2019) делал замер на другой машине, разрешение было высоким:

    Test GetSystemTimeAsFileTime()
    260093062 calls of GetTickCount() per second, 3.844778 ns per call
    1000 quanta per second, 1000.000000 us per quantum

    Машина: Intel® Core™ i5-4590S CPU @ 3.00 GHz, 4,00 Гбайт ОЗУ, Windows 10 корпоративная.

    Почему снизилось разрешение — я не знаю. Обновлений, вроде, не приходило, настройки не менял.


    • Изменено Alexander Konovalov 4 апреля 2019 г. 5:44 Выделил замеры времени
    4 апреля 2019 г. 5:42

Ответы

  • Точность функции GetSystemTimeAsFileTime нигде не документирована, поэтому сказать определенно, какой она должна быть, и почему она изменяется таким образом, невозможно. Согласно Raymond Chen,  она использует системный таймер, и поэтому на ее точность должна оказывать влияние функция timeBeginPeriod (т.е, по умолчанию ~10 мс, вызов timeBeginPeriod(1); должен изменить до 1 мс, если такая точность конечно вообще поддерживается - это можно проверить с помощью timeGetDevCaps). У меня как ни крути, ваш тест показывает "999 quanta per second".


     

    • Помечено в качестве ответа Alexander Konovalov 11 апреля 2019 г. 5:53
    6 апреля 2019 г. 12:16
  • Я не уверен, связано ли это с вашим вопросом / вашей проблемой, но припоминается эта статья.
    • Помечено в качестве ответа Alexander Konovalov 11 апреля 2019 г. 5:53
    6 апреля 2019 г. 21:20

Все ответы

  • Точность функции GetSystemTimeAsFileTime нигде не документирована, поэтому сказать определенно, какой она должна быть, и почему она изменяется таким образом, невозможно. Согласно Raymond Chen,  она использует системный таймер, и поэтому на ее точность должна оказывать влияние функция timeBeginPeriod (т.е, по умолчанию ~10 мс, вызов timeBeginPeriod(1); должен изменить до 1 мс, если такая точность конечно вообще поддерживается - это можно проверить с помощью timeGetDevCaps). У меня как ни крути, ваш тест показывает "999 quanta per second".


     

    • Помечено в качестве ответа Alexander Konovalov 11 апреля 2019 г. 5:53
    6 апреля 2019 г. 12:16
  • Я не уверен, связано ли это с вашим вопросом / вашей проблемой, но припоминается эта статья.
    • Помечено в качестве ответа Alexander Konovalov 11 апреля 2019 г. 5:53
    6 апреля 2019 г. 21:20
  • Спасибо, VadimTagil и Petalvik!

    Не задумывался о том, что разрешение функций запроса времени может меняться.

    Из статьи на Хабре, которую мне посоветовал Petalvik, узнал про замечательную команду

    powercfg -energy duration 5

    и утилиту clockres от SysInternals.

    Сегодня с утра проверил разрешение GetSystemTimeAsFileTime(), получил 1000 тиков в секунду, тоже самое показала и clockres. Запустил powercfg, в отчёте нашёл программу, которая завысила частоту таймера. Ей оказалось облако InboxStorage. Прибил его, частота снизилась до 64 тиков в секунду.

    Ещё узнал о функции timeGetTime(), которую забыл протестировать в своём анализе: https://github.com/bmstu-iu9/refal-5-lambda/issues/206.

    11 апреля 2019 г. 5:51