Czy ważne jest, aby rozwiązanie było skuteczne?

9

Rozwiązuję wiele problemów, głównie z Top Coder. Otrzymam odpowiedzi na wiele, ale najczęściej kończy się to nieefektywnym rozwiązaniem.

W rzeczywistych implementacjach - czy naprawdę ważne jest, aby rozwiązanie problemu było skuteczne? Jeśli tak, jak mogę to poprawić?

Mrówki
źródło
4
Czy pytasz z punktu widzenia konkursu lub rzeczywistego wdrożenia?
rjzii
@RobZ: W rzeczywistych implementacjach
Ant
1
„świat rzeczywisty” obejmuje wiele obszarów. Osadzony? Aplikacje serwerowe? Aplikacje mobilne? Oprogramowanie komputerowe dla jednego użytkownika? Symulacje naukowe? Odpowiedzi na nie niekoniecznie są dla nich takie same.
David Thornley,

Odpowiedzi:

34

Najlepszym rozwiązaniem jest to, które jest (w kolejności rosnącego znaczenia) wydajne, łatwe w utrzymaniu i wykonane .

^^^ To jedyna rzecz, którą naprawdę musisz wziąć z tej odpowiedzi. ^^^

Wydajność jest ważna . Może trochę mniej niż kiedyś z powodu naszej obfitości sprzętu, ale wydajność jest cechą . W konkursie wydajność jest oczywiście ważna. Powinieneś wiedzieć, jak napisać wydajny kod. Co ważniejsze, powinieneś znać najlepsze praktyki, które pozwolą na uzyskanie wydajnego, dobrze działającego kodu bez poświęcania terminowości lub łatwości konserwacji aplikacji. To właśnie tam głębokość doświadczenia z platformą i językiem zwraca wiele korzyści.

Jednak ważniejsze (w 95% przypadków) jest posiadanie gotowego, łatwego do utrzymania rozwiązania. Bez gotowego produktu , to nie ma znaczenia, w jaki sposób efektywny lub utrzymaniu rozwiązanie. Jeśli śledzenie i naprawianie błędu lub dodawanie nowej funkcji zajmuje Ci wyjątkowo dużo czasu, nie ma znaczenia, jak skuteczne jest to rozwiązanie. Ale wydajność i wydajność są bez wątpienia ważne, bez względu na to, co ktoś może powiedzieć.

Mike Cellini
źródło
3
Tak. A strasznie nieefektywny program, który jest zarówno poprawny, jak i wykonany, daje ci coś, na czym możesz przetestować swoje ulepszenia.
Mike Sherrill „Cat Recall”
1
Najważniejszą częścią tego jest znajomość najlepszych praktyk w zakresie wydajności, szczególnie w tworzeniu baz danych, w których osobiście stawiam wydajność ponad łatwość konserwacji. Użytkownicy desperacko dbają o wydajność. Często widziałem, że o bardziej wydajnym kodzie mówi się, że jest trudniejszy w utrzymaniu, ale tylko z powodu braku zrozumienia przez programistę bardziej wydajnego kodu na początku, gdy tylko zapoznasz się z technikami, przejdziesz do tych technik jako pierwszego wyboru i stają się łatwiejsze w utrzymaniu, ponieważ rozumiesz, dlaczego działają.
HLGEM
@HLGEM Jeśli była jakaś część tej odpowiedzi, którą chciałbym wzmocnić jako ogólną zasadę (oprócz pierwszego wiersza), zna ona najlepsze praktyki pisania wydajnego kodu. I masz rację, że ważny jest wydajny SQL.
Mike Cellini
8

Zgadzam się z Mikiem Cellinim, jedyne co chciałbym dodać to.

Czy coś jest „wystarczająco wydajne”? Na przykład z punktu widzenia użytkownika nie ma dużej różnicy między funkcją, która kończy się w 0,00001 sekundy, a tą, która kończy się w 0,1 sekundy, chociaż jedna jest znacznie bardziej wydajna niż druga. Funkcja, która kończy się w ciągu 10 minut, nie różni się tak bardzo (dla użytkownika) od funkcji, która kończy się w ciągu 12 minut. W obu przypadkach użytkownik dostawałby filiżankę kawy lub zajął się innym zadaniem.

Widziałem wydajność jako „wydajnego użytkownika”, a nie wydajnego algorytmu.

Jaydee
źródło
Zasadą, którą słyszałem, jest 20% poprawa, którą użytkownik może zauważyć. Oba wydają się kwalifikować, myślę, że użytkownik może poczuć różnicę w czasie reakcji między .1 a .00001 sekund.
Chris Pitman
Chris, możesz mieć rację, że użytkownik może zauważyć różnicę między tymi dwoma systemami obok siebie, ale czy jeden system sprawiłby, że użytkownik byłby znacznie bardziej wydajny w swojej pracy? Moja obserwacja (robię to od ponad 25 lat) jest taka, że ​​oba systemy umożliwiłyby użytkownikowi wykonanie tej samej ilości pracy w danym czasie.
Jaydee
2

Ogólnie rzecz biorąc, najważniejszym rozwiązaniem problemu będzie to, które faktycznie istnieje i jest ważne dla przypadków, w których istnieją dla twojego problemu. Innymi słowy, unikaj przedwczesnej optymalizacji, dopóki nie dowiesz się, że masz nieefektywny kod lub wydajny kod, który musi być szybszy.

Nie zapominaj również, że najlepszym rozwiązaniem dla Twojej aplikacji może nie być ogólne rozwiązanie przypadku. Sprawa i punkt, kilka lat temu profesor dał naszej klasie problem, w którym mieliśmy wydrukować pierwsze 10 liczb danego typu (przepraszam, moja pamięć zawodzi mnie co do rodzaju, ale była to jedna z bardziej niezwykłych liczb klasy) i dostaliśmy test, aby sprawdzić, czy liczba jest danego typu. Taki był zakres problemu, który nam powiedziano, i powiedziano nam, że był to następny dzień, a najbardziej wydajne rozwiązanie otrzymało pełny kredyt. Następujący wykład profesor podsumował wyniki:

  • Niektórzy uczniowie korzystali z prostej pętli i podanego wzoru, aby sprawdzić, czy liczby są prawidłowe i wyświetlały je, powoli, ale wykonali zadanie, O (n ^ 3).
  • Inni studenci przeprowadzili badania i znaleźli formułę, która lepiej sprawdzała, czy dana liczba jest poprawna, programy te działały znacznie szybciej, O (n ^ 2).
  • Jeden uczeń wykorzystał wolną formułę do wygenerowania wartości, a następnie skopiował je do stałej tablicy w kodzie i wyświetlił jej zawartość, O (n).

Ostateczne rozwiązanie zostało ocenione przez profesora jako najbardziej wydajne. Okazuje się, że problem był w rzeczywistości ćwiczeniem polegającym na pełnym zrozumieniu problemu, a nie tylko wychodzeniu i znajdowaniu najskuteczniejszego rozwiązania.

Chodzi o to, że jeśli chodzi o znalezienie skutecznego rozwiązania problemu, zazwyczaj lepiej jest poświęcić czas, aby upewnić się, że naprawdę rozumiesz, na czym polega problem, zanim odejdziesz i napiszesz kod lub spróbujesz zoptymalizować kod. Jeśli możesz przechowywać zestaw wartości referencyjnych w stałej tablicy, lepiej jest robić to z punktu widzenia wydajności niż próbować napisać jakiś wymyślny algorytm.

Podobnie nie zapominaj, że w przypadku większości aplikacji jedynymi osobami, które zwykle widzą nieefektywny kod (gdy nie jest to niepotrzebnie nieefektywny!), Są sami programiści. Jeśli napiszesz czysty kod, który robi dokładnie to, co musi zrobić, istnieje prawdopodobieństwo, że przez większość czasu użytkownicy nie zauważą problemów z wydajnością podczas pracy z twoim programem i po prostu optymalizują części, o których wspominają. ty.

rjzii
źródło
2

Zależy to od struktury konkursu, ale generalnie tak: wydajność jest kwestią rozważaną przez większość czasu, zgodnie z ich dokumentacją . Czasami, jak w późniejszym linku, musisz polować, ale cytuj:

Napisz czysty, przejrzysty i wydajny kod. Mimo że nie ma specjalnie dla tego elementu zamówienia, recenzenci prawdopodobnie lepiej zareagują na kod, który jest dla nich łatwy do odczytania i zrozumienia. Dzięki wydajnemu kodowi zyskujesz potencjalną przewagę wydajności w testach warunków skrajnych i testach porównawczych, a także prawdopodobne pochwały (i kilka dodatkowych punktów) od recenzentów.

Najlepszym sposobem na poprawienie tego jest napisanie wydajnego kodu, co już robisz. Nawet jeśli ukończysz pracę, poświęć czas na jej poprawę - nawet po zawodach - a to się opłaci.

Prawdopodobnie chcesz również zainwestować w teorię, na przykład książki na temat algorytmów , które mogą dać ci dwie rzeczy: bardziej wydajne narzędzia do rozwiązania konkretnego problemu oraz bardziej wydajne mechanizmy do identyfikacji problemu, który musisz rozwiązać.

Ponadto kursy informatyki są coraz częściej dostępne online i obejmują tło, które należy poprawić.

Daniel Pittman
źródło
Istnieje nowsza wersja instrukcji projektowania algorytmów. (11 lat między nimi). Czy coś jest nie tak z nowszym? Zwłaszcza, że ​​jest tańszy niż stary. Jeśli tak, być może należy to rozwiązać w swojej odpowiedzi.
Inżynier świata
Nie, właśnie wymieniłem pierwszą, którą znalazłem na Amazon, i nie zawracałem sobie głowy sprawdzeniem, czy była to druga edycja.
Daniel Pittman
1

To, jak efektywne musi być rozwiązanie, zależy od wielu czynników. Najważniejsze jest wiedzieć, czego chce Twój użytkownik. Oto kilka przykładów.

  1. Jeśli jesteś jedynym użytkownikiem bloku kodu, który działa dobrze dla Ciebie, prawdopodobnie nic ci nie jest.
  2. Jeśli twój program zostanie sprzedany, musisz mieć na uwadze platformę docelową. Przetestuj to na tej platformie. Jeśli program jest wyjątkowo wolny, musisz popracować nad zwiększeniem jego wydajności. Jeśli wydaje ci się to w porządku, przekaż go innym użytkownikom i sprawdź, czy się zgadzają.
  3. Być może program ma inne względy. Jeśli budujesz, powiedzmy, program oparty na serwerze, być może będziesz musiał bardzo ciężko pracować, aby program był jak najbardziej wydajny. Lub, jeśli działa na mikroprocesorze, upewnij się, że tam również działa.

Jak zwiększyć wydajność kodu:

  1. Pierwszym krokiem jest zorientowanie się, co zajmuje najwięcej czasu. Sztuką jest zrobienie czegoś zwanego kodowaniem profilującym. Sprawdź, co zajmuje najwięcej czasu i sprawdź, czy możesz znaleźć sposób, aby przyspieszyć działanie.
  2. Być może kluczowym czynnikiem ograniczającym jest pamięć. W takim przypadku poszukaj, co zajmuje duże fragmenty pamięci, i zobacz, jak możesz to zmniejszyć.

Do optymalizacji jest całe pole, ale dwie powyższe wskazówki powinny przynajmniej zacząć.

PearsonArtPhoto
źródło
1

Aby wziąć udział w konkursie, musisz zrozumieć, kim są sędziowie i na czym oni polegają - jeśli szukają świetnych programistów i nic więcej, dostaniesz uznanie za bardziej wydajny kod.

Z reguły w prawdziwym świecie nie ma to znaczenia. Jedną z kluczowych idei rozwoju oprogramowania jest „Nie optymalizuj tego, co nie wymaga optymalizacji”, a następnie „Optymalizuj tylko wtedy, gdy udowodniono, że jest to wymagane”

Wielu praktyków będzie argumentować, że prowadzi to do rozdętego, nieefektywnego kodu, którego nie można łatwo naprawić, aw niektórych przypadkach brzegowych (wokół których będą tłoczyć się, jakby to właśnie robiła większość programistów przez cały dzień) mają rację. Jednak niewiele projektów programistycznych ma zmierzone wyniki. „Wydajność: szybsza niż potrzeba, koszt: kogo to obchodzi, czas dostawy: kiedyś w tej dekadzie”, w prawdziwym świecie zwykle jest to „chcę tanie, chcę wczoraj, chcę to działa ".

mattnz
źródło