Можно ли замедлить время в виртуальной машине Java?

Можно ли замедлить время в виртуальной машине Java в соответствии с использованием ЦП путем модификации исходного кода OpenJDK? У меня есть сетевая симуляция (от Java до ns-3), которая использует реальное время и слабо синхронизируется с настенными часами. Однако, поскольку я запускаю так много клиентов в моделировании, загрузка ЦП достигает 100%, и жесткие гарантии относительно того, сколько времени события в симуляторе должны обрабатываться, не поддерживаются (т. е. большое количество очень поздних событий). Таким образом, симуляция достигает максимума около 40 узлов при большом сетевом трафике, и даже тогда это немного сомнительно. Идеальным решением было бы замедлить время в зависимости от процессора, но я не уверен, как это сделать успешно. Меньшее решение состоит в том, чтобы просто замедлить время в несколько раз (линзирование времени?).

Если кто-то может дать некоторые рекомендации, исходный код соответствующего файла (для Windows) находится по адресу http://pastebin.com/RSQpCdbD. Я попытался изменить некоторые части файла, но мои результаты не очень успешны.

Заранее спасибо,
Крис


person Chris Dennett    schedule 01.05.2011    source источник
comment
как именно вам нужно время для работы и почему?   -  person Thorbjørn Ravn Andersen    schedule 02.05.2011
comment
Я предлагаю вам профилировать ваше приложение, чтобы оно использовало ЦП гораздо меньше, чем 100%. (Или используйте сервер, который подходит для этой задачи) Если ваш ЦП почти на 100% даже ненадолго, ваша симуляция будет очень сложной (особенно, если у вас есть сетевой трафик)   -  person Peter Lawrey    schedule 02.05.2011
comment
В основном мне нужно ослабить ограничение в реальном времени.   -  person Chris Dennett    schedule 02.05.2011
comment
опечатка: *ограничение.   -  person Chris Dennett    schedule 02.05.2011
comment
Весь сетевой трафик моделируется, я запускаю множество имитируемых клиентов с установленными приложениями, используя симулятор ns-3.   -  person Chris Dennett    schedule 02.05.2011


Ответы (2)


Вы можете посмотреть VirtualBox, который позволяет Ускорение или замедление гостевых часов из командной строки.

person trashgod    schedule 01.05.2011
comment
Ура, это действительно может быть полезно! :D - person Chris Dennett; 02.05.2011

Я не совсем уверен, что это то, что вам нужно, но с библиотекой Joda-time вы можете полностью остановить время. Таким образом, вызовы new Date() или new DateTime() в Joda-time будут постоянно возвращать одно и то же время.

Итак, вы могли бы в одном потоке «остановить время» с помощью этого вызова:

DateTimeUtils.setCurrentMillisFixed(System.currentTimeMillis());

Тогда ваш поток может спать, скажем, 5000 мс, а затем вызывать:

// advance time by one second
DateTimeUtils.setCurrentMillisFixed(System.currentTimeMillis() + 1000);

Таким образом, при условии, что ваше приложение делает все, что оно делает, в зависимости от времени в системе, это будет «замедлять» время, устанавливая время на одну секунду вперед каждые 5 секунд.

Но, как я уже сказал... я не уверен, что это будет работать в вашей среде.

person alpian    schedule 01.05.2011
comment
Точно не будет :) Требуется модификация времени на уровне VM (Hotspot). Единственная альтернатива — запустить его в виртуализированном виде и изменить хост Xen, но я считаю, что это проще. - person Chris Dennett; 02.05.2011