Как мога да огранича процесорната мощност, дадена на конкретна програма?

Разработвам на лаптоп с двуядрен процесор amd 1,8 GHz, но хората често изпълняват програмите ми на много по-слаби системи (300 MHz ARM например).

Бих искал да симулирам такива слаби среди на моя лаптоп, за да мога да наблюдавам как работи програмата ми. Това е интерактивно приложение.

Разгледах qemu и знам как да настроя среда, но е малко болезнено и не видях точното заклинание на превключвателите, които ще ми трябват, за да накарам qemu да симулира по-слаб процесор.

Имам virtualbox, но не изглежда, че мога да виртуализирам по-малко от 1 пълен хост процесор.

Знам за http://cpulimit.sourceforge.net/, който използва sigstop и sigcont, за да се опита да ограничи процесора дадено на процес, но се притеснявам, че това всъщност не е точно изобразяване на по-слаб процесор.

Някакви идеи?


person jonr    schedule 17.01.2011    source източник
comment
добре какво ще кажете за прекратяване на процеса? или щракнете с десния бутон и задайте приоритет на процеса или както там се нарича във вашата ОС?   -  person The Surrican    schedule 18.01.2011
comment
това наистина няма да има желания ефект. това просто би направило процеса най-бавния на машината във всеки даден момент, което все още може да означава, че е по-бърз от 300 mhz.   -  person jonr    schedule 18.01.2011
comment
За кой език и платформа е това?   -  person James Black    schedule 18.01.2011
comment
C++. Разработвам в linux, но програмата се изпълнява на различни архитектури и операционни системи (windows, osx, psp, потенциално iphone/ipad).   -  person jonr    schedule 18.01.2011


Отговори (3)


Ако процесорът ви е 1800 MHz и целта ви е 300 MHz и вашият код е като този:

while(1) { /*...*/ }

можете да го пренапишете като:

long last=gettimestamp();
while(1)
{
   long curr=gettimestamp();
   if(curr-last>1000)                 // out of every second...
   {
      long target=curr+833;           // ...waste 5/6 of it
      while(gettimestamp()<target);
      last=target;
   }

   // your original code
}

където gettimestamp() е високочестотният таймер на вашата операционна система.

Можете да изберете да работите с по-малки стойности за по-плавно изживяване, да речем 83ms на всеки 100ms или 8ms на всеки 10ms и т.н. Колкото по-надолу слизате, толкова повече загуба на точност ще съсипе математиката ви.


edit: Или какво ще кажете за това? Създайте втори процес, който стартира първия и се свързва като дебъгер към него, след което периодично го спира и възобновява според горния алгоритъм.

person Blindy    schedule 17.01.2011
comment
Това е разумен подход, освен а) той се занимава само с интерактивната част на програмата. зареждането на ресурси все още ще се извършва с нормална скорост. b) Имам няколко от тези цикли, разпръснати из кода (почти невъзможно е да ги обединя). Но все още мога да използвам това, ако не се появи друго решение. - person jonr; 18.01.2011
comment
това по същество прави cpulimit.sf.net, но използвайки сигнали. ако трябваше да тръгна по този път, бих използвал cpulimit, тъй като е добре поддържан. - person jonr; 18.01.2011

Може да искате да разгледате емулатор, който е създаден за това. Например от Microsoft можете да намерите тази техническа бележка, http://www.nsbasic.com/ce/info/technotes/TN23.htm.

Без да знам повече за езиците, които използвате, и платформите е трудно да бъда по-конкретен, но бих се доверил на емулаторните програми да свършат добра работа при предоставянето на тестовата среда.

person James Black    schedule 17.01.2011

Избрах лаптоп PIIMMX-266 отнякъде и инсталирах минимален Debian на него. Това беше идеалното решение, докато не умря преди няколко седмици. Това е модел на Panasonic, който има нестандартен IDE конектор (не е 40-пинов, нито 44-пинов), така че не успях да заменя неговия твърд диск с CF (адаптерът CF към IDE струва почти нула) . Освен това цената на такава машина е 50 USD / 40 EUR.

(Използвах го, за да симулирам бавна ARM-базирана машина за нашата домашна авт. система, която е планирана да може да работи дори на най-малките най-бавни Linux системи. Междувременно ние избрахме малък и бавен компютър за домашна авт. цели: GuruPlug. Има около 1,2 GB бърз процесор.)

(Не съм запознат с QEMU, но ръководството казва, че можете да използвате KVM (виртуализация на ядрото), за да стартирате програми с естествена скорост; предполагам, че ако това е допълнителна функция, тогава може да се изключи, така че странно, но вярно, може да емулира x86 на x86.)

person ern0    schedule 17.01.2011