При построении систем работы с событиями, одним из источников замедления работы может оказаться функция возврата точного времени. Особенно это актуально при использовании виртуализации или облаков.
Определение текущего источника
1 | cat /sys/devices/system/clocksource/clocksource0/current_clocksource |
Пример вывода:
1 2 | cat /sys/devices/system/clocksource/clocksource0/current_clocksource kvm-clock |
Для получение возможных источников используем команду:
1 | cat /sys/devices/system/clocksource/clocksource0/available_clocksource |
Пример:
1 2 | cat /sys/devices/system/clocksource/clocksource0/available_clocksource kvm-clock tsc hpet acpi_pm |
обычно самым быстрым оказывается tsc
устанавливаем источник командой
1 | echo tsc > /sys/devices/system/clocksource/clocksource0/current_clocksource |
Для тестирования будем использовать скрипт написанный на Java:
1 2 3 4 5 6 7 8 9 10 | public class TimeBench { public static void main(String[] args) { for (int i = 0; i < 100 * 1000 * 1000; i++) { long t0 = System.currentTimeMillis(); if (t0 == 87362) { System.out.println("Bingo"); } } } } |
Скрипт выполняет 100 миллионов вызовов операции System.currentTimeMillis, что достаточно для замеров.
вызов осуществляем командой
1 | time java TimeBench.java |
Пример работы для kvm-clock:
1 2 3 4 5 | time java TimeBench.java real 0m4.200s user 0m4.583s sys 0m0.048s |
Пример работы для tcs:
1 2 3 4 5 | time java TimeBench.java real 0m3.708s user 0m4.000s sys 0m0.080s |
Разница составила 0,5 секунды, для 100 миллионов операция, что в целом не значительно.