Възможно ли е да забавите времето във виртуалната машина на 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% CPU. (Или използвайте сървър, който се справя със задачата) Ако процесорът ви е някъде близо до 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
Наздраве, това наистина може да е полезно! :Д - person Chris Dennett; 02.05.2011

Не съм напълно сигурен дали това е, което искате, но с библиотеката Joda-time можете спре времето напълно. Така че извикванията към new Date() или new DateTime() в Joda-time непрекъснато ще връщат едно и също време.

Така че бихте могли в една нишка да "спирате времето" с това извикване:

DateTimeUtils.setCurrentMillisFixed(System.currentTimeMillis());

Тогава вашата нишка може да заспи, да речем, 5000ms и след това да извика:

// 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