Czy istnieje sposób na wolniejsze uruchamianie programu w języku C ++ przez zmianę parametrów systemu operacyjnego w systemie Linux? W ten sposób chciałbym zasymulować, co się stanie, jeśli ten konkretny program będzie działał na naprawdę wolniejszej maszynie.
Innymi słowy, szybsza maszyna powinna zachowywać się jak wolniejsza maszyna dla tego konkretnego programu.
nice
to polecenie obniżające priorytet planowania. Różne starożytne, stosunkowo surowe. Możesz przyjrzeć się priorytetom planowania, ale jeśli maszyna nie jest zajęta wykonywaniem innych czynności, program nadal będzie działał szybko. Więc prawdopodobnie nie pomoże to wystarczająco.Odpowiedzi:
nice
(i / lubrenice
). Możesz to również zrobić programowo za pomocąnice()
wywołania systemowego. Nie spowolni to szybkości wykonywania per se, ale sprawi, że program planujący Linuksa przydzieli mniej (i prawdopodobnie krótsze) przedziałów czasu wykonywania, częstsze wywłaszczanie, itp. Zobacz Planowanie procesów (rozdział 10) Zrozumienie jądra Linuksa aby uzyskać więcej informacji na temat planowania .cpufreq-set
polecenia.sched_yield()
, które przyniesie kwantowe wyniki innym procesom, w krytycznych dla wydajności częściach programu (wymaga zmiany kodu).malloc()
,free()
,clock_gettime()
itp używając LD_PRELOAD i zrobić jakieś głupie rzeczy jak nagrać kilka milionów cykli procesora zrep; hop;
, wkładka bariera pamięci itd. W ten sposób spowolnić program na pewno. (Zobacz tę odpowiedź, aby zobaczyć przykład, jak zrobić niektóre z tych rzeczy).-O0
I włączając asercje (tj-DDEBUG
.).Mam nadzieję, że to pomoże.
źródło
-ggdb3
) nie spowalnia wykonywania pliku binarnego. Po prostu go powiększa.QEMU to emulator procesora dla systemu Linux. Debian ma na to pakiety (wyobrażam sobie, że większość dystrybucji będzie). Możesz uruchomić program w emulatorze i większość z nich powinna obsługiwać spowolnienie. Na przykład Miroslav Novak ma łatki spowalniające QEMU.
Alternatywnie, możesz skompilować krzyżowo na inny CPU-linux (arm-none-gnueabi-linux itp.), A następnie zlecić QEMU przetłumaczenie tego kodu do uruchomienia.
Miła propozycja jest prosta i może działać, jeśli połączyć je z innym procesem, który pochłonie cpu.
Nie powiedziałeś, czy potrzebujesz grafiki, plików i / lub we / wy sieci? Czy wiesz coś o klasie błędu, której szukasz? Czy jest to sytuacja wyścigu, czy też kod po prostu źle działa w siedzibie klienta?
Edycja: Możesz także użyć sygnałów takich jak STOP i KONT, aby uruchomić i zatrzymać program. Może to również zrobić debugger. Problem polega na tym, że kod działa z pełną prędkością, a następnie zostaje zatrzymany. Większość rozwiązań z programem planującym Linuksa będzie miała ten problem.
Był jakiś rodzaj analizatora wątków firmy Intel afair. Widzę informacje o wydaniu Vtune . To jest Vtune, ale byłem prawie pewien, że istnieje inne narzędzie do analizy wyścigów gwintów.Zobacz: Intel Thread Checker , który może sprawdzić niektóre warunki wyścigu wątków. Ale nie wiemy, czy aplikacja jest wielowątkowa?źródło
Zastosowanie
cpulimit
:Jest w repozytoriach Ubuntu. Właśnie
Oto kilka przykładów użycia go w już uruchomionym programie:
źródło
źródło
Jeśli chcesz tylko zasymulować swój program, aby przeanalizować jego zachowanie na naprawdę powolnej maszynie, możesz spróbować uruchomić cały program jako
thread
inny program główny .W ten sposób możesz nadać priorytet temu samemu kodowi z różnymi priorytetami w kilku wątkach jednocześnie i zbierać dane z analizy. Wykorzystałem to podczas tworzenia gier do analizy przetwarzania klatek.
źródło
Użyj uśpienia lub poczekaj w kodzie. Nie jest to najjaśniejszy sposób, ale akceptowalny w każdym rodzaju komputera z różnymi prędkościami.
źródło
Najprostszym możliwym sposobem byłoby zawinięcie głównego kodu uruchamialnego w pętlę while ze snem na końcu.
Na przykład:
Jak ludzie będą wspominać, nie jest to najdokładniejszy sposób, ponieważ kod logiczny będzie nadal działał z normalną prędkością, ale z opóźnieniami między uruchomieniami. Zakłada się również, że kod logiczny działa w pętli.
Ale jest zarówno prosty, jak i konfigurowalny.
źródło