Jak spowolnić komputer (do celów testowych)? [Zamknięte]

20

Jak większość ludzi się zgadza, zachęcanie programistów do tworzenia szybkiego kodu poprzez udostępnianie im powolnych maszyn nie jest dobrym pomysłem . Ale pytanie ma sens. Moja maszyna deweloperska jest szybka, więc czasami piszę kod, który jest niepokojąco nieefektywny, ale staje się to widoczne dopiero podczas uruchamiania go na maszynach innych ludzi.

Jakie są dobre sposoby na tymczasowe spowolnienie maszyny z turbodoładowaniem? Pojęcie „prędkości” obejmuje kilka czynników, na przykład:

  • Częstotliwość taktowania procesora.
  • Ilość rdzeni procesora.
  • Ilość pamięci podręcznej i procesora.
  • Prędkość różnych autobusów.
  • Dysk I / O.
  • GPU.
  • itp.
Joonas Pulakka
źródło
34
Naciśnij przycisk „Turbo”… nie, czekaj.
LennyProgrammers,
6
Oto źródło problemu: „Niepokojąco nieefektywny”. zmień swój zwyczaj kodowania
Darknight
16
@Darknight: Nie, to nie tak. Musisz najpierw zrobić to dobrze, a potem szybko, jeśli to konieczne . Aby wiedzieć, co zoptymalizować, musisz przetestować i dowiedzieć się, na czym polega problematyczna część. Dokonywanie rzeczy tak szybko, jak to możliwe w pierwszej kolejności jest marnowanie Twojego czasu - i prawdopodobnie strata robi to dobrze .
Joonas Pulakka,
1
Cóż, częściowo się zgadzam. Jeśli jednak masz na początku wydajny nawyk kodowania; wtedy, gdy „poprawiasz działanie”, możesz później poświęcić mniej czasu na „przyspieszanie”.
Darknight,
4
@Darknight: Myślę, że @Joonas zadaje bardzo rozsądne pytanie. Pomysł, że wystarczy „zmienić nawyk kodowania”, nie jest realistyczny. Oto przykład: ( stackoverflow.com/questions/926266/... ) ORAZ pomysł, że możesz po prostu ustawić czas na wolniejszej maszynie bez IDE, zakłada, że ​​to wystarczy, aby znaleźć błędy wydajności. Wiele osób mówi o profilowaniu, ale robienie tego (z powodzeniem) to inna sprawa. Co naprawdę by mi pomogło (i myślę, że inni) jest tym, o co prosi Joonas.
Mike Dunlavey,

Odpowiedzi:

39

Uruchom testy na maszynie wirtualnej z ograniczoną pamięcią i tylko jednym rdzeniem.

Stare maszyny, które ludzie mogą nadal mieć, to głównie rzeczy z epoki Pentium 4. To nie jest tak nierealne - teraz sam go używam. Wydajność pojedynczego rdzenia na wielu obecnych komputerach zwykle nie jest znacznie lepsza i może być gorsza. W każdym razie wydajność pamięci RAM jest ważniejsza niż wydajność procesora, a ograniczając ją nieco ostrzej niż w przypadku starego P4 o pojemności 1 GB, nieco to rekompensujesz.

W przeciwnym razie, jeśli chcesz wydać trochę pieniędzy, kup netbooka. Przeprowadź na tym testy.

Steve314
źródło
1
Lub starszy laptop.
Problem z maszynami wirtualnymi polega na tym, że żadna z nich (AFAIK) nie obsługuje portu IEEE 1394 (firewire). Niektóre z moich programów używają kamer połączonych z firewire, więc ...
Joonas Pulakka
prawdziwe pozwalają przypisać dowolne urządzenie PCI do VM
Javier
3
Może to być zadanie dla Xena - maszyna wirtualna nie ma hosta O / S, ale sama jest najwyższą warstwą. Ma mocno uniksową historię, ale może teraz obsługiwać zastrzeżone systemy operacyjne. Ale nigdy go nie użyłem i nie wiem, ile masz kontroli nad wydajnością i zasobami poszczególnych maszyn wirtualnych.
Steve314,
1
+1 Maszyna wirtualna jest wysoce przestrajalna i zapewnia dokładnie środowisko, w którym testujesz. W tym celu korzystam z VMWare.
Gary Rowe,
11

Sposobem na zauważenie znacznej nieefektywności algorytmu jest profilowanie kodu. Sposób na złapanie nadużywania pamięci to najpierw zrozumienie, ile pamięci ma Twój cel, a następnie odpowiednie zaprojektowanie i regularne testowanie w tym środowisku.

Jeśli piszesz kod wątkowy, testowanie na wielu komputerach o różnych prędkościach procesora pomoże wyróżnić określone błędy związane z taktowaniem w obsłudze wątków, ale agresywne testowanie jednostkowe logiki wątków jest koniecznością.

Michael Shaw
źródło
1
Nie, profilowanie nie złapie nieefektywności algorytmu. Pokaże Ci, gdzie program spędza czas, jeśli chcesz go przyspieszyć, ale nie, jeśli musisz go przyspieszyć.
David Thornley,
Myślę, że brakuje mi tutaj rozróżnienia. Jeśli masz na myśli, że profilowanie nie powie Ci, JEŻELI nie jesteś optymalny, tylko tam, gdzie spędzasz cykle procesora, zgadzam się. To wymaga doświadczenia, aby dokonać takiego osądu.
Michael Shaw,
4
@David Thornley & @Ptolemy: Myślę, że nieefektywność algorytmu lub punkty krytyczne są drugorzędne w stosunku do podstawowego problemu: „Czy to jest zbyt wolne, czy nie?” To subiektywne, ale także najważniejsze pytanie. Jeśli w praktyce nie jest powolny, to co zrobić, jeśli Twój algorytm jest nieefektywny? Robi to, co musi! Lub jeśli program wydaje się zbyt wolny, niezależnie od wysoce optymalnych algorytmów, może być konieczna zmiana podejścia (architektura? Język programowania? Coś!). Posiadanie wysoce optymalnych algorytmów nie usprawiedliwia powolności programu :-)
Joonas Pulakka
1
Aby ujawnić nieefektywność algorytmu, do testowania używaj progresywnych zestawów danych.
rwong,
10

Wszystko, co zrobisz, aby spowolnić maszynę, byłoby prawdopodobnie włamaniem.

Oto kilka sugestii:

  • Używaj maszyn wirtualnych
  • Profiluj kod na swoim komputerze, szukając wąskich gardeł
  • Użyj starej maszyny do „testowania wydajności”
Jason
źródło
@matt co to znaczy?
Johnny
1
@johnny: Mam na myśli, że mam głos, ponieważ Jason zasugerował profilowanie aplikacji, która, mam nadzieję, znalazłaby źródło szyjek butelek wydajności bez potrzeby przechodzenia na wolniejszy system.
Matt Ellen,
4

Uświadomcie sobie, że to dość stare pytanie, ale dla każdego innego w tej sytuacji; możesz spróbować CPUKiller. Zasadniczo jest to niewielka aplikacja, którą można skonfigurować tak, aby zużywała różne% procesora. http://www.cpukiller.com/

Dave
źródło