Скрипт Python в Windows не использует время между точками измерения - PullRequest
0 голосов
/ 12 января 2019

Я создал небольшую программу для передачи файлов (клиент / сервер) с помощью сокетов. В моей функции отправки я измерил время, необходимое для выполнения некоторых задач, чтобы оценить среднюю скорость передачи.

while (l):
    start_time = time.time()
    self.__sendData(l)
    acc += len(l)
    self.__setProgress(acc)
    l = f.read(1024)
    elapsed_time = time.time() - start_time
    print("longitud: " + str(len(l)))
    print("total: " + str(elapsed_time))
    self.__setSpeed(len(l), elapsed_time)

Здесь вы можете видеть, что у меня есть переменная acc (umulator) для расчета общего прогресса передачи. Я прочитал следующие 1024 байтов файла и вычислил время, необходимое для выполнения этих операций. Моя функция __setSpeed просто вычисляет среднюю скорость, используя самые последние 50 мгновенные скорости.

Этот отлично работает в Linux , никаких проблем. Однако, когда я запустил это в Windows, я обнаружил следующий вывод:

enter image description here

Как видите, очень часто time for transfer and file read равен zero. Я не могу понять, почему это происходит, потому что:

  1. Я мог бы себе представить (только предположение), что в Windows файл может быть помещен в буфер, поэтому readtime файла становится равным 0. Хорошо.
  2. Функция sendData может быть очень быстрой, так как она очень мала. Хорошо, но на самом деле ноль?
  3. Кроме того, мы должны добавить некоторые действительно небольшие суммы для выполнения других команд, таких как управляющие структуры, внутри моих функций и т. Д.

Так что в основном у меня два вопроса:

  1. Почему это происходит? Должен ли я использовать другой метод для его измерения?
  2. Какой метод будет точным и подходит для использования как в ОС , Windows и Linux?

1 Ответ

0 голосов
/ 13 января 2019

В Windows time.time основано на GetSystemTimeAsFileTime. Мы можем получить разрешение этих часов с time.get_clock_info. Для системных часов она вызывает GetSystemTimeAdjustment. Разрешение по умолчанию составляет 15,625 мс:

>>> time.get_clock_info('time').resolution
0.015625

time.perf_counter должен решить вашу проблему. В Windows он основан на QueryPerformanceCounter. Чтобы получить разрешение этих часов, get_clock_info звонит QueryPerformanceFrequency. Обычно это 100 нс:

>>> time.get_clock_info('perf_counter').resolution
1e-07
...