Есть ли способ запустить программу на С++ медленнее, изменив любые параметры ОС в Linux? Таким образом, я хотел бы симулировать, что произойдет, если эта конкретная программа будет работать на реальной медленной машине.
Другими словами, более быстрая машина должна вести себя как более медленная машина для этой конкретной программы.
nice
(и/или renice
). Вы также можете сделать это программно, используя системный вызов nice()
. Это не замедлит скорость выполнения как таковое, но сделает планировщик Linux меньшим (и, возможно, короче) временным фреймворком времени, вытесняет чаще и т.д. См. Планирование процесса (глава 10) "Понимание ядра Linux" для получения более подробной информации о планировании.cpufreq-set
.sched_yield()
, который даст квант другим процессам, в критичных для производительности частях вашей программы (требуется код изменение).malloc()
, free()
, clock_gettime()
и т.д., используя LD_PRELOAD, и делать некоторые глупые вещи например, записать несколько миллионов циклов процессора с помощью rep; hop;
, вставить блокировки памяти и т.д. Это наверняка затормозит программу. (См. этот ответ для примера того, как сделать некоторые из этих материалов).-O0
и включения утверждений (т.е. -DDEBUG
).Надеюсь, что это поможет.
-ggdb3
) не замедляет выполнение двоичного -ggdb3
. Это просто делает его больше.
QEMU - это эмулятор процессора для Linux. У Debian есть пакеты для него (я думаю, большинство дистрибутивов будет). Вы можете запустить программу в эмуляторе, и большинство из них должно поддерживать замедление работы. Например, Мирослав Новак имеет патчи для замедления QEMU.
В качестве альтернативы вы можете перекрестно скомпилировать другой CPU-linux (arm-none-gnueabi-linux и т.д.), а затем выполнить QEMU этот код для запуска.
Хорошее предложение простое и может работать, если вы объедините его с другим процессом, который будет потреблять процессор.
nice -19 test &
while [ 1 ] ; do sha1sum /boot/vmlinuz*; done;
Вы не сказали, нужна ли вам графика, файл и/или сетевой ввод-вывод? Вы знаете что-то о классе ошибки, которую вы ищете? Является ли это условием гонки или код плохо работает на сайте клиента?
Изменить: Вы также можете использовать такие сигналы, как STOP и CONT, чтобы запустить и остановить свою программу. Отладчик также может это сделать. Проблема в том, что код работает на полной скорости, а затем останавливается. У большинства решений с планировщиком Linux будет эта проблема. У Intel был какой-то анализатор потоков. Я вижу Примечания к выпуску Vtune. Это Vtune, но я был уверен, что есть еще один инструмент для анализа расчётов потоков. Смотрите: Intel Thread Checker, который может проверять для некоторых условий гонки нитей. Но мы не знаем, является ли приложение многопоточным?
Используйте cpulimit
:
Cpulimit - это инструмент, который ограничивает использование процессором процесса (выражается в процентах, а не в процессорном времени). Полезно управлять пакетными заданиями, когда вы не хотите, чтобы они потребляли слишком много циклов процессора. Цель состоит в том, чтобы предотвратить запуск процесса более чем на определенное время. Он не изменяет параметры хорошего значения или других параметров планирования, но реальное использование ЦП. Кроме того, он способен адаптироваться к общей загрузке системы, динамически и быстро.
Управление используемой суммой процессора выполняется, отправляя сигналы SIGSTOP и SIGCONT POSIX в процессы.
Все дочерние процессы и потоки указанного процесса будут иметь один и тот же процент CPU.
Это в репозиториях Ubuntu. Просто
apt-get install cpulimit
Вот несколько примеров того, как использовать его в уже запущенной программе:
Ограничьте процесс "bigloop" исполняемым именем до 40% CPU:
cpulimit --exe bigloop --limit 40 cpulimit --exe /usr/local/bin/bigloop --limit 40
Ограничьте процесс с помощью PID до 55% CPU:
cpulimit --pid 2960 --limit 55
Если вы просто хотите имитировать свою программу для анализа ее поведения на действительно медленной машине, вы можете попробовать сделать вашу программу в качестве thread
другой основной программы.
Таким образом, вы можете приоритезировать один и тот же код с разными приоритетами в нескольких потоках одновременно и собирать данные вашего анализа. Я использовал это в разработке игр для анализа обработки кадров.
Самый простой способ сделать это - обернуть ваш основной исполняемый код в цикл while со сном в конце его.
Например:
void main()
{
while 1
{
// Logic
// ...
usleep(microseconds_to_sleep)
}
}
Как упоминают люди, это не самый точный способ, так как ваш логический код будет работать на нормальной скорости, но с задержками между прогонами. Кроме того, он предполагает, что ваш логический код - это то, что выполняется в цикле.
Но он прост и настраивается.
Используйте сон или подождите внутри своего кода. Это не самый яркий способ сделать, но приемлемый для всех видов компьютеров с разной скоростью.