Chrono Mock
ЯзыкРусский

Заставьте часы одного приложения идти быстрее

30-дневный пробный период истекает за 30 дней, если вы не можете сдвинуть время. Обычный совет — перевести системные часы вперёд, что требует прав администратора и тащит за собой все остальные программы на машине. Здесь вместо этого сдвигается один процесс.

Насколько быстро

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

МножительОдна настоящая минута становитсяДля чего полезно
x60часомпочасовые задания, тайм-ауты сессий, время жизни токенов
x1440суткамисуточные переходы, 30-дневный пробный период за полчаса
x4320030-дневным пробным периодомнаблюдать окончание всего пробного периода, пока вы это читаете
x525600годомгодовые продления, истечение сертификатов
x1000000примерно 1,9 годапотолок
# Начать с настоящего времени сейчас и идти сутки за минуту
chrono run "C:\apps\test.exe" --mode x1440

# Начать с выбранной даты и ускоряться от неё
chrono run "C:\apps\test.exe" --at 2027-12-01T09:00:00 --mode x1440

# Или вовсе остановить часы
chrono run "C:\apps\test.exe" --mode frozen
Запись сессии, управляющей другим приложением Windows. Левое окно — Chrono Mock: часы приложения на 2038-01-19 растут со скоростью, в шестьдесят раз превышающей настоящую, а настоящие часы рядом сдвигаются всего на несколько секунд. Правое окно — тестируемое приложение, собственная запись сессии которого показывает, что оно началось 2038-01-19 и работает уже минуты, тогда как в комнате прошло едва полминуты.
Настоящая сессия, управляющая настоящим приложением. Обратите внимание на правое окно: тестируемая программа записала собственный старт как 19 января 2038 года, а её сессия длится минуты, пока часы в комнате сдвинулись на секунды. Скорость меняется на ходу, без перезапуска чего бы то ни было.

То, на чём все попадаются: часов две

Ускорение настенных часов — того, что возвращают DateTime.Now и его аналоги, — само по себе не ускоряет обратный отсчёт. Это два разных вопроса, которые приложение может задать операционной системе, и множество программ измеряют «тридцать дней» вторым, а не первым.

Поэтому ось длительностей — счётчики тиков, задержки, ожидания и таймеры — это отдельный переключатель:

  • --scale-duration переводит на часы сессии также счётчики тиков, задержки сна и таймеры, а ожидания объектов считаются и сохраняют реальную длительность. Без него x1440 гонит календарь вперёд, а пятисекундный таймер по-прежнему длится пять реальных секунд - только таймер, заведённый на конкретные дату и время, следует за часами сессии в каждой сессии.
  • --scale-qpc дополнительно масштабирует высокоточный счётчик. Именно с него читают прошедшее время monotonic в Python 3.13+, Stopwatch в .NET и nanoTime в Java, и он выключен по умолчанию, потому что его масштабирование дестабилизировало отрисовку в тестах.

Если кажется, что множитель ничего не делает с обратным отсчётом, почти всегда дело в этом.

# Приложение-таймер: ускорить календарь И обратные отсчёты
chrono run "C:\apps\Timer.exe" --mode x60 --scale-duration

# Приложение на Python или .NET, измеряющее прошедшее время по высокоточному счётчику
chrono run "C:\apps\Job.exe" --mode x60 --scale-duration --scale-qpc

Смена скорости без перезапуска

Множитель можно менять посреди сессии, а часы при этом заново привязываются, а не перескакивают, так что они никогда не идут назад, когда скорость падает. Часами можно и просто перескочить — вперёд или назад, как это делает ноутбук после повторной синхронизации с сервером времени, а это тот случай, который ломает всё, что измеряет прошедшее время без защиты.

# Работать на x60, затем через две секунды переключиться на x1440
chrono run "C:\apps\test.exe" --mode x60 --set-after 2:1440

# Запустить, затем через пять секунд перебросить часы на выбранный момент
chrono run "C:\apps\test.exe" --jump-after 5:2028-01-01T00:00:00

Чего он не делает

  • Не трогает системные часы. В этом смысл, а не ограничение, — но это значит, что всё, что читает время с сервера, из базы данных или с другой машины, остаётся нетронутым, и аудит скажет вам, когда так случится.
  • Скачок меняет то, что видит приложение, а не то, когда оно просыпается. Задержки сна и таймеры, уже переданные ядру, сохраняют длительность, полученную при установке. Большинство приложений опрашивает часы, поэтому скачки на практике работают - но не во всех.
  • Время не замедляется. Множители — это целые числа от единицы и выше, плюс остановленные часы на нуле.

Дошло ли что-либо из этого до вашего приложения — не то, что стоит предполагать. Об этом скажет сессия →

Попробуйте