Co masz na optymalizację pod kątem? [Zamknięte]

19

Mówiąc ogólnie, do jakiego rodzaju optymalizacji zazwyczaj dążysz przy projektowaniu oprogramowania?

Czy jesteś typem, który woli zoptymalizować swój projekt

  • Czas opracowywania (tj. Szybki do napisania i / lub łatwiejszy do utrzymania)?
  • Czas przetwarzania
  • Miejsce w pamięci (RAM, DB, Disc itp.)

Oczywiście jest to bardzo subiektywna rodzaju problemy są rozwiązane, a terminy zaangażowany, więc chciałbym usłyszeć o powodach, które sprawiają Ci wybrać jedną formę optymalizacji nad drugą.

Jason Whitehorn
źródło
Wszystkie trzy powyższe, ale chcę wrzucić ogólność (która dotyczy utrzymania). Jeśli wziąć swój czas, aby zaprojektować naprawdę efektywną strukturę danych powszechnie stosowaną do wymaganiom oprogramowania, na przykład, i dokładnie go przetestować, to będzie ci służyć przez wiele lat, uniemożliwiając tym samym konieczności pisania wiele struktur więcej danych ściśle dostosowanych do rozwiązania indywidualne problemy.

Odpowiedzi:

40

Konserwacja

Następnie w razie potrzeby profilowania i optymalizacji pod kątem szybkości. Rzadko kiedykolwiek miałem potrzebę przechowywania - przynajmniej nie w ciągu ostatnich 10 lat. Wcześniej zrobiłem.

Tim
źródło
8
+1, jeśli optymalizacji dla konserwacji na początek, to będzie łatwiejsze, aby zoptymalizować pod kątem szybkości lub składowania później, jeśli okaże się to konieczne.
Carson63000
Nadal musisz przynajmniej wziąć pod uwagę czas przetwarzania i pamięć, aby nie wybrać wyjątkowo nadmiernego podejścia.
@ Thorbjørn, jeśli optymalizujesz czas programisty, prawdopodobnie (bardziej niż prawdopodobne) wybierasz algorytmy, które są łatwiejsze do odczytu / zapisu w danym języku. Dopiero później, i tylko wtedy, gdy wydajność staje się problemem, należy zarówno do (jak to powiedział @Tim) podnieść profilera.
Jason Whitehorn
@Jason, nie zgadzam się. Należy zapoznać się z charakterystyką wydajności wybranych algorytmów, aby wybrać odpowiednią implementację. Tj wyborze ArrayList, kiedy trzeba je przede wszystkim dla patrząc ZIP-kodów nie może skalować dobrze.
1
@ Thorbjörn, ja nie zgadzam się z tobą. W rzeczywistości, myślę, że masz rację, że należy zwrócić uwagę na algorytmach pod ręką. Sądzę jednak, że różnią się między sobą opinie, że moim zdaniem pomysł na wybór algorytmów jest czymś poznanym przez doświadczenie i ustalonym dopiero, gdy pojawia się problem. Masz rację w swoim punkcie, ja po prostu nie widzi potrzeby, aby zoptymalizować za to kosztem kod mniej czytelny / już w realizacji.
Jason Whitehorn
27

Czas rozwoju

Przetwarzanie i przechowywanie jest tani. Twój czas nie jest.

Wystarczy, aby pamiętać:

To nie znaczy zrobić złą robotę pisania kodu tylko szybko skończyć. Oznacza to napisać kod w sposób, który ułatwia szybki rozwój. To także zależy wyłącznie od twoich przypadków użycia. Jeśli jest to proste, dwa lub trzy strona strona internetowa z formularza kontaktowego prawdopodobnie nie trzeba używać ramy PHP. Kilka obejmuje i skrypt Mailer przyspieszy rozwój. Jeśli zamiast tego planujesz stworzyć elastyczną platformę, na której możesz się rozwijać i dodawać nowe funkcje, warto poświęcić czas na odpowiednie jej rozplanowanie i odpowiednie kodowanie, ponieważ przyspieszy to przyszły rozwój.

W bezpośrednim porównaniu do czasu przetwarzania i przechowywania, skłaniam się ku szybszym czasie rozwoju. Korzysta z collectionutils odejmowania Funkcja pamięci najszybsze i najbardziej efektywne metody odejmowania kolekcje? Nie! Ale to szybszy czas rozwoju. Jeśli napotkasz wydajności lub pamięci zatorów można rozwiązać te później. Optymalizacja przed wiesz, co musi być zoptymalizowany jest stratą czasu i to co mi opowiada przeciw.

Josh K
źródło
4
Prawo Moore'a zakończony około dwa lata temu. Może to być czas, aby zacząć myśleć o współbieżności i korzystania z tych dodatkowych rdzeni. To jedyny sposób, w jaki zamierzamy uzyskać tanie cykli zegara w przyszłości.
Robert Harvey
3
Za prawidłowe, Prawo Moore'a jest jeszcze silny z podwojeniem liczby tranzystorów w układzie scalonym co około 2 lat, co jest, co jest umożliwienie umieszczania wielu rdzeni na jednej matrycy. Co zakończył jest „darmowy lunch” z coraz zwiększającej się liczby cykli na sekundę.
Dominique McDonnell
1
„Przetwarzanie i przechowywanie jest tanie.” Pamięć podręczna procesora oraz prędkości magistrali nie są. Są one główną wydajność wąskich gardeł dzisiaj.
mojuba
3
Całkowicie się z tym zgadzam. Utrzymanie kod czytelny, przy użyciu odpowiednich narzędzi do tego zadania, i przylegającą do Twojego spółki uzgodnionych standardów znacznie skrócić czas spędzony rzeczywiście wpisując kod do komputera, oszczędzając firmie mnóstwo pieniędzy. Jesteś czas jest lepiej wydać inżynierię niż pisanie.
Matt DiTrolio
1
@Bill: Albo jeśli robisz osadzony, gdzie można mieć twarde limity, które znacząco zwiększają koszty produktów, jeśli ich przekraczać. Lub do oprogramowania serwera, czasem - jeśli ktoś może poprawić przetwarzania na serwerach Google o 1%, to byłoby trochę oszczędności.
David Thornley
12

Doświadczenie użytkownika.

To jedyna wartość, która ma znaczenie dla Twojego klienta.

Czas rozwój jest mniej ważne. Mogę napisać w pełni funkcjonalną aplikację wiersza poleceń o wiele szybciej niż GUI, ale jeśli pani Jane nie może wymyślić, jak sprawić, by wypluła raporty, których chce, jest to bezużyteczne.

Konserwacja jest mniej ważne. Mogę naprawić aa huśtawkę naprawdę szybko, ale jeśli jest w środku lasu, użytkownicy nie mogą go znaleźć.

Czas przetwarzania jest mniej ważny. Jeśli zrobię samochód, który idzie od 0 do prędkości światła w ciągu 60 sekund, użytkownicy nie mogą sterować.

Estetyka jest mniej ważna. Mogę namalować Mona Lisa, ale jeśli ona jest ukryta za ścianą nikt nie dostaje się z nią zobaczyć.

User Experience jest jedyną wartością, która ma znaczenie. Złożenia wniosku, który robi dokładnie to, co użytkownik chce w sposób użytkownik spodziewa jest ostatecznym osiągnięciem.

Malfist
źródło
Niestety Joeri, ja trochę poniosło w moim edycji.
Malfist
To jest coś dla społeczności wiki, prawda? ;)
Joeri Sebrechts
8

Jest tylko jedna rzecz, aby zoptymalizować i jest:

Co klienci chcą

Czy Twoi klienci potrzebują najszybciej programu możliwe? Optymalizacja pod kątem szybkości.

Czy Twoi klienci potrzebują absolutnej niezawodności? Optymalizacja za to.

Nie muszą to wydana jutro albo będzie bezużyteczny? Optymalizacja pod względem szybkości rozwoju.

Działa na niezwykle maleńkim urządzeniu zasobów ograniczone? Optymalizacja dla tych zasobów.

DJClayworth
źródło
Jedynym haczykiem jest to, że często nie wiedzą, czego chcą, albo mają oczekiwania co do tego, co jest możliwe i pomocny.
Tim Williscroft
1
A kiedy zapytałem tę serię pytań wielokrotnego wyboru, najczęściej będzie po prostu usłyszeć „tak” :-)
Jason Whitehorn
1
Nie powiedziałem, że to było łatwe. A przynajmniej jeśli pytasz, jest szansa, dostaniesz użytecznej odpowiedzi.
DJClayworth
5

Czas przetwarzania

czas mojego autora nie jest tanie. Co przychodzi odchodzi.


Właśnie zaktualizowałem aplikację, z której korzystam w zeszłym roku. Byli całkowicie przepisany aplikację, a chłopiec był to powolny. W końcu musiałem kupić nowy komputer, aby szybko go uruchomić. Gwarantuję, że nie był tani, ale mój czas jest cenniejszy.

użytkownik1842
źródło
Ciekawe podejście do czasu przetwarzania. Chcesz podzielić się rodzajem tworzonych aplikacji? Jestem zaintrygowany.
Jason Whitehorn
1
Czas przetwarzania jest ważny, jeśli działasz na wielu komputerach. Na przykład, jeśli jest to wybór między spędzeniem dodatkowych 2 miesięcy na optymalizacji lub uaktualnieniem 10 000 komputerów do nowszego sprzętu, w takim przypadku czas programisty nie wygrywa. Ale oczywiście jest to kompromis. Jeśli prowadzisz tylko na pół tuzina serwerów, czas dewelopera prawdopodobnie wygrywa w tej sprawie.
Dean Harding,
1
@Jason, mam teraz łatwą pracę z Excelem i VBA w konglomeracji arkuszy kalkulacyjnych (które szybko się kondensuję). Moi użytkownicy pracują w pokoju obok, i daj mi znać, jeśli mam jakieś problemy. Moja perspektywa wynika z korzystania z komputerów przez trzydzieści lat, a obserwowanie aplikacji ciągle się rozdęwa, zmuszając aktualizacje zbyt rekompensujące. Wiem, że deweloperzy mogą zrobić lepiej, po prostu dostać w zwyczaju pisanie wydajnego kodu.
+10 za wydajny kod. To zdecydowanie zbyt często pomijane, zwłaszcza w programowaniu modułowej. Każdy moduł działa z rozsądną prędkością, ale suma wszystkich może być strasznie powolna.
Joris Meys
4

I zazwyczaj nachylona do ograniczenia zużycia pamięci i przydziały. Wiem, że to stara szkoła, ale:

  • Większość kodu piszę non-wyrzucenie jest silnie równoległe. Oznacza to, że nadmierna alokacja pamięci i aktywność odśmiecania zserializują wiele kodu, który w przeciwnym razie byłby równoległy. Oznacza to również, że będzie dużo niezgody na wspólnej magistrali pamięci.
  • Moim podstawowym językiem jest D, który nie ma jeszcze dobrego wsparcia dla wersji 64-bitowej (choć jest to naprawiane).
  • Ja pracuję z dość dużych zbiorów danych w sposób regularny.
dsimcha
źródło
+1 do pracy, aby zapobiec bloatware. Programy wykorzystujące pamięci są złe programy.
Programy wykorzystujące pamięci można uruchomić na systemach 64-bitowych, w zasadzie. Tak właśnie zrobiliśmy, gdy jedna z naszych aplikacji napotkała problemy z pamięcią (zgodnie z prawem używa dużej ilości pamięci). Pierwszy punkt jest ważny, gdy pocisk jest wydajność.
David Thornley
2

Powiedziałbym zoptymalizować stronę wydajności, przy czym efektywność zdefiniowana jako kompromis między czasem rozwoju, przyszłej konserwacji, łatwość doświadczenia i zasobów zużytą. Jako deweloper trzeba pogodzić wszystkie z nich, aby utrzymać pewien rodzaj równowagi.

Jak osiągnąć równowagę? Cóż, najpierw trzeba ustalić kilka stałych, takich jak to, co jest termin, jaki sprzęt aplikacja zostanie uruchomiona i na jakiego typu osoby będą go używać. Bez znajomości tych nie można ustanowić właściwą równowagę i priorytety, gdzie jest to potrzebne.

Na przykład, jeśli jesteś rozwijanie aplikacji serwera na potężną maszynę warto kompromis wydajności wydajności, aby zapewnić trafisz nieruchomego termin. Jednakże, jeśli deweloper aplikacja, która musi szybko reagować na działania użytkownika (myślę gry wideo), a następnie trzeba priorytet rutynowych wejściowego, aby zapewnić, że nie jest laggy.

Dan Diplo
źródło
2

Jakąkolwiek technologię wirtualizacji używam

Pamiętam czasy, kiedy systemy z więcej niż 512 MB pamięci RAM zostały uznane krwawienie krawędzi? Dni spędzam na pisaniu kodu do przeora.

Pracuję głównie na programach niskiego poziomu, które działają w uprzywilejowanej domenie w środowisku Xen. Nasz pułap dla uprzywilejowanej domeny wynosi 512 MB, pozostawiając resztę pamięci RAM dla naszych klientów. Typowe jest dla nas ograniczenie uprzywilejowanej domeny tylko do jednego rdzenia procesora.

Oto ja, pisząc kod, który będzie działał na nowym serwerze o wartości 6 000 $, a każdy program musi (najlepiej) działać w ramach pułapu przydzielonego 100 kb lub całkowicie unikać dynamicznego przydzielania pamięci.

Zwięźle, zoptymalizować dla:

  • Ślad pamięci
  • Sortuje (gdzie większość mojego kodu spędza większość czasu)

Muszę też być niezwykle sumienny, jeśli chodzi o czas oczekiwania na zamki, oczekiwanie na I / O lub po prostu czekać w ogóle. Znaczna ilość mojego czasu idzie do poprawy istniejących bibliotek gniazd bez blokowania i patrząc na bardziej praktycznych metod zamka swobodnego programowania.

Każdego dnia uważam, że to trochę ironiczne, że piszę kod, tak jak 15 lat temu, na systemach, które zostały zakupione w zeszłym miesiącu ze względu na postęp technologiczny.

Jest to typowe dla każdego, kto pracuje na platformach osadzonych, a także, choć nawet wielu z tych, co najmniej 1GB do ich dyspozycji. Jak podkreśla Jason, jest to również typowe podczas pisania programów uruchamianych na urządzeniach mobilnych. Lista jest długa, kioski, ciency klienci, ramki do zdjęć itp.

Zaczynam myśleć, że ograniczenia sprzętowe naprawdę oddzielne programistów od ludzi, którzy mogą sprawić, że praca coś nie dbając, co faktycznie zużywa. Martwię się (głosujcie, jeśli trzeba), jakie języki to całkowicie abstrakcyjne sprawdzanie typów i pamięci do zbiorowej puli zdrowego rozsądku, która (kiedyś) była dzielona między programistów różnych dyscyplin.

Tim pocztowe
źródło
1
+1 dla kąta druku pamięć stóp. Nigdy nie kodowałem przeciw konkretnym ograniczeniom, z którymi masz do czynienia, ale usuwam pierwszą część dotyczącą Xen i zastępuję ją iPhone'em i wiem dokładnie, skąd pochodzisz :-)
Jason Whitehorn
2

Winiki wyszukiwania

Jako naukowiec pomyślałem, że powinienem podzielić się tym, co optymalizuję. Należy pamiętać, że to nie jest to samo, co dla optymalizacji krótszym czasie rozwoju. Często oznacza to, że praca może wspierać pewne pytanie badawcze, ale nie być otrzymana, polerowane produkt. Może to być postrzegane jako problem z jakością i może wyjaśniać, dlaczego wielu twierdzi, że (akademiccy) informatycy nie mają żadnego doświadczenia w „prawdziwym świecie”. (Np, „nie wiedzą, jak stworzyć dostawie produktu inaczej?” )

Jest to linia w porządku. Jeśli chodzi o wpływ, chcesz, aby Twoja praca była wykorzystywana i cytowana przez innych, a gra Iceberg Effect Joela wchodzi w grę: odrobina połysku i połysk może przejść długą drogę. Ale jeśli nie tworzysz podstaw do budowania innych projektów, możesz po prostu nie być w stanie uzasadnić czasu poświęconego na dostarczenie produktu.

Macneil
źródło
1
  1. Projekt
    • niskie sprzęgło, modułowe
    • zwięzły dobrze zdefiniowane obszary funkcjonalne
    • dobrze udokumentowane
    • ciągły Refactor dla cruft
  2. Utrzymanie
    • powtarzalne budować i debugowania
    • testy jednostkowe
    • testy regresji
    • kontrola źródła

... potem wszystko inne

... w końcu, optymalizacji pod kątem wydajności ;-)

cmcginty
źródło
1

Jakość / testowanie

Optymalizacja do jakości, a w celu zapewnienia nie ma czasu na harmonogram rozwoju badań, zarówno jednostki badań i testów po funkcji i / lub etapów.

DBlackborough
źródło
1

To zależy od potrzeby twojego programu.

Większość z tego, co robię jest ograniczona w dużym stopniu poprzez przetwarzanie zdolność i pamięć, ale nie przejść przez bardzo wiele, jeśli w ogóle, istotnych zmian w przeciętnym roku.

Mam w przeszłości pracował przy projektach, gdzie kod jest często zmieniane tak konserwacji staje się coraz bardziej istotne w tych przypadkach.

W przeszłości pracowałem również nad systemami, w których ilość danych jest najważniejszym problemem, nawet na dysku do przechowywania, ale częściej rozmiar staje się problemem, gdy trzeba dużo przenosić dane lub zbyt wolno połączyć.

Rachunek
źródło
1

Elegancja .

Jeśli kod jest dobrze zaprojektowany, będzie miał kilka efektów:

  1. Będzie to łatwiejsze do utrzymania (cięcie kosztów dla klienta)
  2. Łatwiej będzie w celu optymalizacji (dla kompilatorów JIT lub pełnych)
  3. łatwiej będzie wymienić (jeśli myślisz o lepsze rozwiązanie)
Benjamin Chambers
źródło
0

czas rozwoju, absolutnie. Ja również optymalizację przepustowości, ale nie chodzę na binarny.

Christopher Mahan
źródło
0

Ponieważ wykonuję instalacje na wielu typach systemów, od komputerów mainframe IBM po komputery PC, najpierw optymalizuję pod kątem zgodności, następnie rozmiaru, a następnie szybkości.

Dave
źródło
0

To zależy

Jeśli pracujesz nad wbudowanym systemem przetwarzania wideo w czasie rzeczywistym, optymalizujesz szybkość przetwarzania. Jeśli pracujesz na edytorze tekstu, zoptymalizujesz go pod kątem czasu programowania.

Jednak we wszystkich przypadkach kod musi działać i musi być możliwy do utrzymania.

Dima
źródło
0

Wyrazistość moim zamiarem.

Chcę ktoś czyta mój kod, aby móc łatwo zobaczyć, jakie operacje starałem się powołać na domenie. Podobnie staram się minimalizować niepotrzebne śmieci (nawiasy klamrowe, słowa kluczowe „funkcyjne” w js itp.), Aby ułatwić skanowanie.

Oczywiście musisz to zrównoważyć utrzymywalnością. Uwielbiam pisać funkcje, które zwracają funkcje i wszelkiego rodzaju zaawansowane techniki, i robią one dalej mój cel, ale jeśli korzyść jest niewielka, popełniam błąd w kwestii trzymania się technik, które znają solidni programiści jr.

George Mauer
źródło
-6

Wszyscy

Czas przetwarzania

Dzisiejsze komputery są szybkie, ale daleko od tego, co wystarczy. Są tam wiele wiele sytuacji, w których wydajność jest krytyczna - jeśli nie strumieniowych serwerów multimedialnych.

Przechowywanie

Twój klient może mieć duży dysk, powiedzmy 1 TB. Które mogą być zajęte przez 1000 filmów HD, jeśli chcesz, aby była to usługa, to za mało, prawda?

Czas rozwoju

Więc nie jestem pewien, czy to liczyć jako „optymalizacja”, co mogę zrobić, to używam Java zamiast C ++ oraz rozwój dostać 10 razy szybciej. Czuję, że mówię to, co myślę bezpośrednio do komputera, bardzo prosto do przodu i totalnie kołysze!

BTW uważam, aby przyspieszyć rozwój Twój proces rozwoju należy wybrać java, nigdy nie zaśmieci jak pyton ... których roszczenia mogą skrócić czas ci DEV.

tactoth
źródło
Można znaleźć to przeczytać ciekawe: paulgraham.com/avg.html - omawia siłę języków programowania.
3
Przy ograniczonym czasie i budżecie nie możesz spędzać czasu na każdym z nich - musi być jakiś priorytet.
JBRWilkinson
@JRBWilkinson Cóż, powinno być każdorazowe
tactoth