Skoro kupowanie mocy obliczeniowej jest znacznie tańsze niż w przeszłości, to czy znajomość algorytmów i efektywność stają się coraz mniej ważne? Oczywiste jest, że chciałbyś uniknąć nieskończonej pętli, więc nie wszystko idzie. Ale jeśli masz lepszy sprzęt, czy możesz mieć gorsze oprogramowanie?
efficiency
Quora Feans
źródło
źródło
Odpowiedzi:
Bardzo podoba mi się przykład z książki Wprowadzenie do algorytmów , który ilustruje znaczenie wydajności algorytmu:
Porównajmy dwa algorytmy sortowania: sortowanie wstawiane i scalanie . Ich złożoność wynosi odpowiednio i . Zwykle sortowanie scalone ma większy stały współczynnik, więc załóżmy . O ( n log n ) = c 2 nO ( n2)) = c1n2) c 1 < c 2O ( n logn ) = c2)n lgn do1< c2)
Aby odpowiedzieć na twoje pytanie, oceniamy czas wykonania szybszego komputera (A) z uruchomionym algorytmem sortowania wstawiania względem wolniejszego komputera (B) z uruchomionym algorytmem sortowania po scaleniu.
Przyjmujemy:
Tak więc przy tych założeniach trzeba
107
dla komputera B.
Komputer, który jest 1000 razy wolniejszy, może rozwiązać problem 17 razy szybciej. W rzeczywistości przewaga sortowania będzie jeszcze bardziej znacząca i będzie rosła wraz z rozmiarem problemu. Mam nadzieję, że ten przykład pomoże odpowiedzieć na twoje pytanie.
Nie chodzi jednak o złożoność algorytmu. Dzisiaj jest prawie niemożliwe, aby uzyskać znaczne przyspieszenie tylko dzięki użyciu maszyny o wyższej częstotliwości procesora. Ludzie muszą projektować algorytmy dla systemów wielordzeniowych, które dobrze skalują się. Jest to również trudne zadanie, ponieważ wraz ze wzrostem liczby rdzeni zwiększa się również narzut (na przykład w celu zarządzania dostępem do pamięci). Tak więc uzyskanie liniowego przyspieszenia jest prawie niemożliwe.
Podsumowując, dzisiejszy projekt wydajnych algorytmów jest tak samo ważny jak wcześniej, ponieważ ani wzrost częstotliwości, ani dodatkowe rdzenie nie zapewnią przyspieszenia w porównaniu do tego, które zapewnia efektywny algorytm.
źródło
Przeciwnie. W tym samym czasie, gdy sprzęt staje się tańszy, odbywa się kilka innych zmian.
Po pierwsze, ilość danych do przetworzenia rośnie wykładniczo. Doprowadziło to do badania quasilinearnych algorytmów czasu i obszaru dużych zbiorów danych . Pomyśl na przykład o wyszukiwarkach - muszą one obsługiwać duże ilości zapytań, przetwarzać duże ilości danych i robić to szybko. Algorytmy są ważniejsze niż kiedykolwiek.
Po drugie, obszar uczenia maszynowego staje się silny i pełen algorytmów (choć innego rodzaju niż to, czego uczysz się na licencjacie). Obszar ten kwitnie i co jakiś czas wymyślany jest naprawdę nowy algorytm, który znacznie poprawia wydajność.
Po trzecie, algorytmy rozproszone stały się ważniejsze, ponieważ napotykamy przeszkodę w zwiększaniu szybkości przetwarzania procesora . W dzisiejszych czasach moc obliczeniowa jest zwiększana przez zrównoleglanie , a to wymaga dedykowanych algorytmów.
Po czwarte, aby zrównoważyć rosnącą moc procesorów, nowoczesne paradygmaty programowania wykorzystują metody maszyn wirtualnych do zwalczania luk bezpieczeństwa. To spowalnia te programy o znaczny czynnik. Dodając do tej zagadki, Twój system operacyjny inwestuje więcej czasu procesora w dzwonki i gwizdy, pozostawiając mniej czasu procesora dla twoich programów, co może obejmować algorytmy wymagające procesora, takie jak kompresja wideo i dekompresja. Chociaż sprzęt jest szybszy, nie jest wykorzystywany tak skutecznie.
Podsumowując, wydajne algorytmy są niezbędne do obsługi dużych ilości danych; pojawiają się nowe rodzaje algorytmów w dziedzinie sztucznej inteligencji ; algorytmy rozproszone stają się coraz bardziej popularne; a moc procesora jest wykorzystywana mniej wydajnie z różnych powodów (ale głównie dlatego, że komputery stają się coraz wydajniejsze). Algorytmy nie są jeszcze martwe.
źródło
Znajomość algorytmów to znacznie więcej niż pisanie szybkich algorytmów.
Daje ci także metody rozwiązywania problemów (np. Dziel i zwyciężaj, programowanie dynamiczne, zachłanność, redukcja, programowanie liniowe itp.), Które możesz zastosować, gdy zbliżasz się do nowego i trudnego problemu. Odpowiednie podejście zwykle prowadzi do kodów, które są prostsze i znacznie szybsze do napisania. Więc muszę się nie zgodzić z odpowiedzią Kevina, ponieważ kody, które nie są starannie ułożone, są często nie tylko powolne, ale także skomplikowane. Podoba mi się ten cytat Davida Parnasa:
(Oczywiście musimy również łączyć algorytmy z metodami projektowania oprogramowania, aby pisać dobre kody).
Znajomość algorytmów mówi nam również, jak organizować dane, abyś mógł je łatwiej i wydajniej przetwarzać za pomocą struktur danych.
Co więcej, daje nam to sposób na oszacowanie wydajności twojego podejścia i zrozumienie kompromisów między kilkoma różnymi podejściami pod względem złożoności czasowej, złożoności przestrzeni i złożoności kodów. Znajomość tych kompromisów jest kluczem do podjęcia właściwej decyzji w ramach ograniczeń zasobów.
Jeśli chodzi o znaczenie wydajności oprogramowania, zacytuję prawo Wirtha:
Larry Page niedawno stwierdził, że oprogramowanie robi się dwa razy wolniejsze co 18 miesięcy, a tym samym wyprzedza prawo Moore'a.
źródło
Tak , są „względnie” mniej ważne w szerokim przemyśle. Edytor tekstu może być „wystarczająco szybki” i może nie wymagać wielu ulepszeń. Duża część wysiłków IT polega na upewnieniu się, że komponent A napisany w Javie współpracuje z komponentem B napisanym za pomocą C komunikuje się poprawnie za pośrednictwem kolejki komunikatów napisanej w Cobolu (lub coś takiego), lub aby wprowadzić produkt na rynek itp
Ponadto architektura się skomplikowała. Kiedy miałeś proste stare proste procesory, w których miałeś 1 instrukcję na cykl i pisałeś w asemblerze, optymalizacje były „łatwe” (wystarczyło policzyć liczbę instrukcji). Obecnie nie masz prostego procesora, ale w pełni potokowy, superskalarny, niedziałający procesor z nazwami rejestrów i wielopoziomową pamięcią podręczną. I nie piszesz w asemblerze, ale w C / Java / etc. gdzie kod jest skompilowany / JITed (zwykle w celu lepszego kodu, niż ty lub ja napisalibyśmy w asemblerze), lub w Pythonie / Ruby / ... gdzie kod jest interpretowany i dzieli Cię kilka poziomów abstrakcji od maszyny. Mikrooptymalizacje są trudne i większość programistów osiąga efekt odwrotny.
Nie , są one tak samo ważne w badaniach, jak i w kategoriach „absolutnych” . Istnieją obszary, w których szybkość jest ważna, ponieważ operują na dużej ilości danych. W tej skali złożoność ma znaczenie, jak pokazuje przykład Pavla.
Istnieją jednak inne przypadki - obniżanie algorytmów jest nadal opcją wybraną, gdy liczy się prędkość (HPC, urządzenia wbudowane itp.). Znajdziesz na wielu uniwersytetach grupy specjalizujące się w kompilatorach i / lub optymalizacji oprogramowania. Na przykład prosta zamiana kolejności w pętli może uzyskać tysiąckrotne przyspieszenie tylko dlatego, że efektywnie wykorzystuje pamięć podręczną - chociaż może to być przykład z granicy, luka między pamięcią procesora rośnie 1000 razy w ciągu ostatnich 30 lat. Również architektura komputerowa jest częścią CS. Dlatego wiele ulepszeń szybkości obliczeń jest w rzeczywistości częścią ogólnego pola CS.
Po stronie przemysłowej - gdy masz klaster HPC, liczy się szybkość, ponieważ pojedynczy program może działać przez kilka dni, miesięcy lub lat. Nie tylko trzeba płacić rachunek za prąd, ale czekanie może również kosztować pieniądze. Możesz rzucić dwa razy więcej sprzętu, ale 700 mln $ nie może być uważane za drobną zmianę dla wszystkich oprócz największych firm - w takich przypadkach programiści są tańszą opcją i jeśli przepisanie programu na nowy język oznacza tylko „małe” przyspieszenie - mogą rozważ to.
Również prędkość może oznaczać lepszy UX. Wiele recenzji systemu operacyjnego na telefony komórkowe mówi, który z nich jest „szybszy” i chociaż można to zrobić za pomocą „sztuczek”, z pewnością jest to obszar badań. Ponadto chcesz szybciej uzyskać dostęp do swoich danych i szybko robić to, czego potrzebujesz. Czasami oznacza to, że możesz zrobić więcej - w grach masz do zrobienia wszystko 0,017s, a im szybciej, tym więcej cukierków możesz włożyć.
źródło
To ciekawa dyskusja. I mamy tutaj kilka rzeczy do obejrzenia.
Informatyka teoretyczna - jest to nauka ewoluująca, co oznacza, że wraz z upływem czasu znajdziemy nowe i lepsze sposoby rozwiązywania problemów, co oznacza na przykład ulepszone algorytmy wyszukiwania i sortowania.
Większe społeczności / większe biblioteki - Ponieważ wiele osób wykonało wiele pracy, możemy po prostu bazować na ich pracy i korzystać z algorytmów, które już stworzyli, a nawet zakodowali. Biblioteki te będą aktualizowane z czasem, umożliwiając nam automatyczny dostęp do wydajniejszych programów / algorytmów.
Rozwój - myślę, że teraz mamy problem. Wielu programistów nie jest informatykami, więc piszą kod, aby rozwiązać problemy biznesowe, a nie techniczne / teoretyczne, i byliby tak samo zadowoleni z sortowania bąbelkowego, jak na przykład szybkiego sortowania. I tutaj szybkość sprzętu pozwala złym programistom uciec od używania złych algorytmów i złych praktyk kodowania. Pamięć, szybkość procesora, miejsce do przechowywania te rzeczy nie są już poważnymi problemami, a co kilka miesięcy rzeczy stają się większe, szybsze i tańsze. Mam na myśli spojrzenie na nowe telefony komórkowe. Są teraz bardziej zaawansowane niż komputery / serwery mainframe z lat 70. i 80. Więcej pamięci, więcej mocy obliczeniowej, szybsza pamięć.
Interfejs użytkownika i dane - interfejs użytkownika / interfejs użytkownika i dane są obecnie uważane za ważniejsze niż super wydajny kod w większości dziedzin rozwoju. Szybkość staje się więc problemem, gdy użytkownik musi długo czekać. Jeśli damy użytkownikowi dobry wygląd, a on otrzyma dobrą odpowiedź z aplikacji, jest szczęśliwy. A jeśli firma wie, że wszystkie dane są bezpiecznie przechowywane, mogą je odzyskać i nimi manipulować w dowolnym momencie, nie obchodzi ich, ile miejsca potrzebuje.
Muszę więc powiedzieć, że wydajni programiści nie są już ważni ani potrzebni, po prostu bardzo niewiele firm / użytkowników nagradza ludzi za to, że są super wydajnymi programistami, a ze względu na to, że sprzęt jest lepszy, uciekamy od bycia mniej wydajny. Ale są jeszcze ludzie, którzy koncentrują się na wydajności i dzięki duchowi wspólnoty wszyscy zyskują z czasem.
źródło
Kilka innych punktów widzenia na to interesujące i głębokie pytanie, które podkreślają interdyscyplinarne i przekrojowe aspekty tego zjawiska. Dai cytuje prawo Wirtha w swojej odpowiedzi:
Istnieją ciekawe podobieństwa tego pomysłu do zjawisk obserwowanych w ekonomii. Należy zauważyć, że ekonomia ma wiele głębokich powiązań z informatyką, np. W harmonogramie powiedzmy, w którym ograniczone zasoby (np. Wątki itp.) Są przydzielane na żądanie za pomocą algorytmów „równoważenia obciążenia”. Innym przykładem jest tak zwana kolejka producent-konsument. Aukcje.
Także np. Lista praw tytułowych, Wikipedia :
Istnieje pewne silne podobieństwo do paradoksu Jevona, który zaobserwowano we wzroście zużycia energii po tym, jak bardziej wydajne silniki parowe Watt zaczęły zastępować konstrukcję Newcomen, ale zwiększyło się użycie lub rozprzestrzenianie się silników:
Analogia jest taka, że sprzęt jest zasobem, a oprogramowanie przypomina zużycie zasobów (inaczej podaż kontra popyt). Tak więc oprogramowanie i sprzęt (i postępy w każdym z nich) istnieją nieco w ściśle sprzężonej symbiotycznej pętli sprzężenia zwrotnego, w pewnym sensie koewoluującej . Istnieje wiele złożonych i powiązanych ze sobą czynników wpływających na tę grę, np .:
źródło
Nie, głównie biorąc pod uwagę złożoność przestrzeni! Pojemność zwykłego komputera rośnie wykładniczo.
źródło