2010-12-28 16 views
7

Mój szef właśnie powiedział mi, że dowiedział się o szybkich algorytmach VB6 z książki i że najkrótszy sposób pisania rzeczy niekoniecznie jest najszybszy (np. metody wbudowane są czasami wolniejsze od autorskich, ponieważ wykonują wszystkie rodzaje konwersji lub konwersje Unicode, które mogą nie być konieczne w twoim przypadku).Prędkość różnych konstrukcji w językach programowania (Java/C#/C++/Python/...)

Teraz zastanawiam się, czy istnieje strona z informacjami na temat szybkich różnych konstrukcji w różnych językach, szczególnie w języku angielskim. Java/C#/Python/... (również C++, ale jest tak wiele kompilatorów, które prawdopodobnie różnią się znacznie).

E.g. Jest jakaś różnica między

if (a()) b(); 

i

a() && b(); 

Innym przykładem jest a = a * 4 może skompilowany do tego samego kodu jako a <<= 2?

Mogłem to przetestować, oczywiście, pisząc oba, a następnie uruchamiając je 100 000 razy i porównując środowisko uruchomieniowe, ale chciałbym również poznać nowe sposoby pisania rzeczy, może nawet rzeczy, których wcześniej nie brałem pod uwagę . Dziękuję za odpowiedzi!

+3

, chyba że pracujesz na bardzo specjalnym sprzęcie (jak na przykład wbudowana Java SmartCard) lub w specjalnych algorytmach (takich jak, powiedzmy, kryptograficzne interfejsy API), nie ma sensu się tym martwić. – SyntaxT3rr0r

+5

Oprócz dotychczasowych odpowiedzi: Najczystszy, najkrótszy i najbardziej konserwatywny sposób na napisanie to najlepszy sposób na pisanie, mimo wszelkich hipotetycznych różnic w wydajności, chyba że oczywiście ma on naprawdę horrograficzną charakterystykę działania (np. Naiwny quicksort w Haskell , który robi wiele i wiele list konkatenacji). – delnan

+4

W języku jest dużo więcej niż algebra boole'owska i podstawowe konstrukcje decyzyjne. Platforma .NET 4 jest wystarczająco przerażająca, znacznie mniej w porównaniu do 2-3 innych. Czy mówisz w języku C++ zarządzanym lub niezarządzanym? lol, ludzie piszą te rzeczy, a nie maszyny. Miałbyś szczęście, gdybyś znalazł poprawną dokumentację, a tym bardziej krzyżykowe schematy Big-O. Witaj w rzeczywistości, przyjacielu. –

Odpowiedz

9

Czy istnieje różnica między if (a()) b(); a a() && b();?

Tak, czytelność. Pierwsza z nich jest o wiele bardziej przejrzysta.

Czy a = a * 4 może być skompilowany do tego samego kodu, co a <<= 2?

Najprawdopodobniej tak. Ale nawet gdyby kończyły się one innymi instrukcjami procesora, różnica czasu byłaby bardzo mała i zależna od instrukcji przed i po.

Micro-Optymalizacja dla nowoczesnych procesorów jest

  • głównie daremny
  • bardzo trudne
  • często wbrew temu, co zwykło być „optymalizacja” 5 lub 10 lat temu.

Podsumowując, napisz najpierw kod , który można odczytać:. Kiedy masz problem z wydajnością, najpierw profiluj i mierz.

Powinieneś się martwić o użycie właściwych algorytmów, nie czytanie kolekcji bardziej niż potrzebnej itd. Ale na poziomie instrukcji/instrukcji jest zbyt wiele warstw (kompilator, jitter, potokowy procesor) między tobą a tym, co faktycznie jest wykonywane .

+0

@Ben: Masz rację, przeoczyłem to (: Ale to naprawdę nie wpływa na rdzeń pytania lub odpowiedzi –

+0

Cóż, teraz przynajmniej jakiś hipotetyczny przyszły czytelnik nie przyjdzie i zastosuje błędną optymalizację, ponieważ zobaczył –

11

Powiedziałbym, że są to prawdopodobnie mikro-optymalizacje, które nie przyniosłyby żadnego efektu i nie są warte wysiłku.

Wybór algorytmu ma znaczenie, ale książki, które powinieneś czytać, powinny być bardziej podobne do: this lub this.

Jeśli naprawdę chcesz sprawdzić, czy wskazane przez Ciebie luki w bitach mają znaczenie, zalecamy najpierw wprowadzenie wartości bazowej dla kodu, który chcesz zmienić. Dokonuj zmian i ponownie weryfikuj wydajność w ten sam sposób. Jeśli uzyskasz wynik, który mówi, że jest tego wart, to na wszelki wypadek kontynuuj.

Lepiej sprofiluj swój kod i dowiedz się, gdzie znajduje się najwolniejsza część kodu i gdzie wykonujesz najwięcej pracy. Zgadywanie rzadko działa podczas optymalizacji.

+0

I don ' Sądzę, że jego szef odnosił się do tych optymalizacji. – SLaks

+5

Szef mógł myśleć o czymś innym, ale zasugerował to ziarno. Odpowiedź jest nadal "nie rób tego". – duffymo

+0

Tak, mam książkę Cormena. Wiem też, że czytelność jest najważniejsza. Mimo to ... spójrz na to, na przykład: http://graphics.stanford.edu/~seander/bithacks.html Tam są absolutnie niesamowite algorytmy! Pytanie było bardziej przeznaczone na moją naukę i zrozumienie ... –

8

Nie przejmuj się takimi mikrooptymacjami. Nie dadzą ci niczego w aspekcie wydajności.

Jeśli masz problemy z wydajnością, znajdź wąskie gardło i zoptymalizuj je.

+0

jakieś komentarze do (-1)? –

+0

Dlaczego, na Boga, otrzyma -1? Głosowałem za tym. – duffymo

+0

Również głosowanie w celu przeciwdziałania głupim -1: – JeremyP

4

Zawsze dokładamy wszelkich starań, aby stworzyć dobry, czysty i efektywny kod. Może to oznaczać mikro-optymalizacje (np. Używać konstruktora stringów zamiast dodawać ciągi, nie używać wyrażeń regularnych, jeśli nie są potrzebne, takie rzeczy, nie słuchaj ludzi, którzy twierdzą, że są bezcelowe: jeśli piszesz zły kod i nie robisz tego nawet jeśli JITter nie pomoże ci) lub optymalizacji wąskich gardeł (nie wybieraj * z całej tabeli, używaj wielowątkowości). Zarządzane środowisko wykona resztę. Intensywność procesora nigdy nie będzie tak wydajna jak niezarządzalny kod, ale jest też wiele zalet, dlatego większość ludzi lubi z nich korzystać. Jeśli chcesz naprawdę szybkie kawałki kodu, zrób to w C, montażu lub sprzęcie. Większość dzisiejszych aplikacji biznesowych nie jest intensywnie wykorzystująca procesor, jak w GUI, usługach sieciowych, bazach danych, wykorzystaniu dysku, wszystkie one wymagają dużej liczby oczekujących i bezczynnych procesorów.

Co do pytania: if (a()) b(); i a() & & b(); są całkowicie takie same, nie ma tu optymalizacji. a * ai < < 2 to nie to samo, drugie to * 4.

+0

Decydując się na użycie konstruktora string/bufora zamiast kopiowania tej konkatenacji, a nie używania regex są różnice w amortyzowanej algorytmicznej złożoności, a nie w mikro-optymalizacjach –

+0

@Pete Kirkham Właściwie to wybór StringBuilder jest często przykładem z mikro-optymalizacji w niektórych środowiskach, na przykład, nowoczesna Java zamieni konkatencje w SB, jeśli uzna, że ​​jest to ważne. * Używam * tylko StringBuilder, gdzie używanie takich * może sprawić, że kod będzie czystszy * lub gdzie * to po prostu ma sens * - np. coś, co "pasuje" jak generator szablonów. W przeciwnym razie nigdy nie zauważyłem * problemu z "normalnym łańcuchem znaków" ". –

+0

@ pst Nie próbowałem 7, ale nie jest tak w przypadku Java 6, że kompilator robiłby to w celu utrwalenia ciągu w kilku instrukcjach, przechowując półprodukty, co ma zastosowanie w przypadku optymalizacji. Dla pojedynczej instrukcji 'String z = a + b + c' bardzo często by to było, ale' String z = a + b; if (x) z = z + c; 'nie. –

Powiązane problemy