Можно ли замедлить время на виртуальной машине Java? - PullRequest
1 голос
/ 02 мая 2011

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

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

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

Ответы [ 2 ]

1 голос
/ 02 мая 2011

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

0 голосов
/ 02 мая 2011

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

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

DateTimeUtils.setCurrentMillisFixed(System.currentTimeMillis());

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

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

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

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

...