Według Wikipedii reguła optymalizacji programu 90/10 stwierdza, że „90% czasu wykonania programu spędza się na wykonywaniu 10% kodu” (patrz drugi akapit tutaj ).
Naprawdę tego nie rozumiem. Co to dokładnie znaczy? Jak 90% czasu wykonania można poświęcić tylko na wykonanie 10% kodu? A co z pozostałymi 90% kodu? Jak można je wykonać w zaledwie 10% czasu?
optimization
theory
program
Rakshith Ravi
źródło
źródło
a++; for(i=0;i<100;i++){b++;} for(i=0;i<100;i++){print(xyz);}
. Pewnie, że pierwsza pętla for wydaje dużo więcej niż pierwsza instrukcja, ale druga pętla for spędza około 1000 razy więcej czasu niż pierwsza instrukcja, ale nie wykonuje . To spędza ona czeka na druk . Istnieje więc różnica między czasem poświęconym na wykonanie a czasem, za który odpowiedzialny jest kod .Odpowiedzi:
W grze obowiązują dwie podstawowe zasady:
Reguła 90/10 nie jest dosłownie prawdą. Różni się w zależności od programu (i wątpię, czy istnieją jakieś podstawy do konkretnych liczb 90 i 10; ktoś prawdopodobnie wyciągnął je z powietrza). Ale chodzi o to, że jeśli chcesz, aby Twój program działał szybciej, prawdopodobnie tylko niewielka liczba linii ma znaczenie, aby tak się stało. Identyfikacja wolnych części oprogramowania jest często największą częścią optymalizacji.
Jest to ważny wgląd i oznacza, że decyzje, które wydają się sprzeczne z intuicją nowego dewelopera, często mogą być prawidłowe. Na przykład:
źródło
To nie jest prawo natury, ale praktyczna zasada zrodzona z szerokiego doświadczenia. Jest również znany jako reguła 80/20 i jest tylko przybliżeniem.
Pętle, gałęzie i inna kontrola przepływu.
Każde miejsce, które ma if, będzie miało jedną gałąź, która jest podejmowana częściej niż druga gałąź. W ten sposób więcej czasu na wykonanie przeznacza się na tę część programu, a nie na drugą część.
Każde miejsce, które ma pętlę, która działa więcej niż jeden raz, ma kod, który jest wykonywany więcej niż otaczający kod. Dlatego spędza się tam więcej czasu.
Jako przykład rozważ:
Tutaj
print("Oh No!")
będą one działać maksymalnie raz, a często nigdy, podczas gdyDoWork(i)
wystąpią około miliona razy.źródło
Pętle
Kusi mnie, aby się tam zatrzymać! :-)
Rozważ ten program
Linia 1 jest wykonywana raz, podczas gdy linia 3 jest wykonywana 10 razy. Patrząc kolejno na każdą linię
Dwie linie odpowiadają za 83% czasu wykonania (przy założeniu, że uruchomienie wszystkich linii zajmuje mniej więcej tyle samo. Zatem 40% programu zajmuje> 80%.
W przypadku większej liczby przykładów z prawdziwego świata wzrasta to, więc tylko niewielka liczba linii stanowi znaczną część czasu pracy.
Reguła 90/10 (lub, jak to się czasem mówi 80/20), jest „praktyczną zasadą” - tylko w przybliżeniu prawdziwą.
Zobacz także zasadę Pareto
źródło
Ponieważ pytano tylko o czas wykonania, ten przykład może być pomocny:
Mówiąc poważniej, oznacza to, że w prawdziwym kodzie prawie zawsze wywołuje się ciężką funkcję w pętli (zamiast
sleep(90);
), a przez pozostałe 10% czasu wykonuje się obliczenia jednoprzebiegowe.Innym przykładem jest obsługa błędów w niektórych usługach HA. Każda wysoce dostępna usługa jest zaprojektowana do pracy przez nieograniczony czas w normalnych warunkach. Działa normalnie przez 99% czasu, ale czasami w przypadku błędu uruchamia obsługę błędów i odzyskiwanie, które mogą być jeszcze bardziej logicznie złożone niż sama usługa.
źródło
Rozumowanie 90/10 oznacza, że niewielka część twojego kodu będzie powtarzana lub używana częściej niż inne. Jest to często używane do sugerowania, że powinieneś skoncentrować 90% wysiłków związanych z programowaniem / optymalizacją na 10% kodu.
Pomyśl o zwykłym procesorze tekstu, takim jak Microsoft Word lub OpenOffice :
To powiedzenie jest również używane w naukach o zarządzaniu ... To jest lekcja życia ... Znaczenie: skoncentruj większość wysiłków tam, gdzie daje to więcej rezultatów.
źródło
Wyobraź sobie taki program:
Zauważ, że jest tutaj 11 linii, w których 3 z 11 to pętla for, gdzie ile czasu spędza się na tym raczej małym kawałku kodu? Trochę, podczas gdy pozostałe 8 wierszy drukuje tylko jeden znak. Dlatego strzeż się, że chociaż jakiś kod może być krótki, to nie mówi ci, jak często jest wykonywany i ile czasu to zajmie.
źródło
Oprócz zapętlania, jak wspomniano w innych świetnych odpowiedziach, należy również wziąć pod uwagę zasady OSUSZANIA. Dobrze napisany kod zorientowany obiektowo zawiera wiele części wielokrotnego użytku. Te części, które są ponownie używane, z definicji są używane co najmniej dwa razy częściej niż coś, co jest wykonywane tylko raz. Jeśli masz dużo kodu OO, potencjalnie możesz wielokrotnie wykorzystywać kilka klas i metod, a kilka innych fragmentów kodu tylko raz.
Jak wspomniano w innych odpowiedziach, prawdopodobnie lepiej jest poświęcić wysiłek, aby kod, który jest używany częściej, był lepszy niż ulepszanie kodu, który jest używany tylko raz.
źródło
To nie jest reguła, to tylko koleś, który zredagował Wikipedię z kilkoma liczbami wyciągniętymi z powietrza i nazwał to regułą. Porównaj z zasadą Pareto, która jest bardziej utrwalona w innych kontekstach. Chciałbym zobaczyć, jakie badania zostały przeprowadzone (jeśli w ogóle) na temat dokładności tej „reguły”.
Ale w zasadzie odpowiedź na twoje pytanie brzmi: niektóre kody są wykonywane znacznie częściej niż inne. Pętle są często tego przyczyną. Innymi przyczynami są czasochłonne połączenia, np. Do zewnętrznych zasobów, takich jak usługi sieciowe lub nośniki danych.
źródło
Jest to reinterpretacja „zasady Pareto”, która stwierdza: „w przypadku wielu zdarzeń około 80% skutków pochodzi z 20% przyczyn.”, Znanej również jako zasada 80/20. Ta zasada jest stosowana głównie do ekonomii, więc ma sens, aby była przeznaczona do programowania.
To tylko wzorzec obserwowany przez długi czas.
Oto bardzo fajny film o takich wzorach, a także wyjaśnia zasadę Pareto.
https://www.youtube.com/watch?v=fCn8zs912OE&ab_channel=Vsauce
źródło