Как я могу ограничить вычислительную мощность, предоставляемую конкретной программе?

Я разрабатываю на ноутбуке с двухъядерным процессором amd 1,8 ГГц, но люди часто запускают мои программы на гораздо более слабых системах (например, 300 МГц ARM).

Я хотел бы смоделировать такие слабые среды на своем ноутбуке, чтобы я мог наблюдать, как работает моя программа. Это интерактивное приложение.

Я посмотрел на qemu и знаю, как настроить среду, но это немного болезненно, и я не видел точного заклинания переключателей, которое мне нужно, чтобы заставить qemu имитировать более слабый процессор.

У меня есть виртуальный бокс, но не похоже, что я могу виртуализировать менее 1 полного хост-процессора.

Я знаю о http://cpulimit.sourceforge.net/, который использует sigstop и sigcont, чтобы попытаться ограничить процессор. данный процесс, но я беспокоюсь, что это не совсем точное изображение более слабого процессора.

Любые идеи?


person jonr    schedule 17.01.2011    source источник
comment
а как насчет повторения процесса? или щелкните правой кнопкой мыши и установите приоритет процесса или как он называется в вашей ОС?   -  person The Surrican    schedule 18.01.2011
comment
это не будет иметь ожидаемого эффекта. это просто сделает процесс самым медленным на машине в любой момент времени, что все равно может означать, что он работает быстрее, чем 300 МГц.   -  person jonr    schedule 18.01.2011
comment
Для какого языка и платформы это?   -  person James Black    schedule 18.01.2011
comment
С++. Я разрабатываю в Linux, но программа работает на различных архитектурах и ОС (Windows, OSX, PSP, потенциально iPhone/iPad).   -  person jonr    schedule 18.01.2011


Ответы (3)


Если ваш процессор 1800 МГц, а ваша цель 300 МГц, и ваш код выглядит следующим образом:

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() – это высокочастотный таймер вашей ОС.

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


редактировать: Или как насчет этого? Создайте второй процесс, который запускает первый и присоединяется к нему как отладчик, затем периодически приостанавливает его и возобновляет по алгоритму выше.

person Blindy    schedule 17.01.2011
comment
Это разумный подход, за исключением: а) он касается только интерактивной части программы. загрузка ресурсов по-прежнему будет происходить с нормальной скоростью. б) У меня есть несколько таких петель, разбросанных по коду (их почти невозможно унифицировать). Но я все еще могу использовать это, если не появится другое решение. - 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-to-IDE стоит около нуля) . Также цена такой машины составляет 50 долларов США / 40 евро.

(Я использовал его для имитации медленной машины на базе ARM для нашей домашней системы автоматизации, которая, как планируется, сможет работать даже на самых маленьких и медленных системах Linux. Тем временем мы выбрали небольшой и медленный компьютер для домашней автоматизации. цели: GuruPlug. Он имеет около 1,2 ГБ быстрого процессора.)

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

person ern0    schedule 17.01.2011