🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.c
Article #310013

Re: Optymalizacja kodu

#310013
From: M.M.
Date: Wed, 25 Dec 2019 13:25
45 lines
3634 bytes
On Wednesday, December 25, 2019 at 12:01:32 PM UTC+1, Maciek Godek wrote:
> W dniu środa, 25 grudnia 2019 11:55:33 UTC+1 użytkownik Maciek Godek napisał:
> 
> > - sprawdzić, na ile kosztowna będzie instrukcja warunkowa (może być kosztowna, ale nie musi, bo teoretycznie - na Intelu przynajmniej - kompilator może wciągnąć rejest znaczników w wir operacji arytmetycznych, efektywnie nie wykonując instrukcji skoku warunkowego)
> 
> Zresztą nawet w C można to sobie zarytmetyzować:
> 
> int x = random() & odpowiednia_maska_bitowa;
> return x - (x > zakres)*(potęga_dwójki - zakres);

Kiedyś ktoś pokazywał kod w asemblerze jak kompilator zoptymalizował właśnie
operację reszty z dzielenia całkowitego. Nie pamiętam szczegółów, ale efekt
był bardzo imponujący. Nie wiem czy w procesory są wbijane tego typu
optymalizacje, ale na pewno mogą być.

Teraz mnie zamurowało na widok dużych różnic w czasie z powodu nieznacznych 
zmian w kodzie. Tutaj na forum wrzuciłem tylko cztery przykłady, na 
szybko wyciągnięte z większego kodu. W ogóle zrobiłem więcej podobnych
eksperymentów i zależność wydajności od drobnych zmian w kodzie jest jeszcze
dziwniejsza. Np. gdy mam własnej roboty wektor a w nim test z funkcją abort:

T& operator()(const size_t i) {
  if( i >= SIZE ) abort();
  return data[i];
}

To działa o 10% szybciej niż gdy mam samo return:

T& operator()(const size_t i) {
  return data[i];
}

Czyżby kompilator umiał wywnioskować coś o kodzie na podstawie wywołania
abort - wszak to wywołanie znamienne.

Inna sprawa: Zwykle używam std::vector, albo QVector. Czasami gdy chcę 
zoptymalizować kod, to biorę wskaźniki na dane z tych kontenerów, a kontenery
tylko (i aż!) ułatwiają zarządzanie pamięcią i wykonanie operacji które nie
są krytyczne dla wydajności. Ostatnio spróbowałem wziąć wskaźniki z new, z
std::array i z tablicy o stałym rozmiarze normalnie zadeklarowanej w programie.
Wydaje się że to wszystko jest to samo, bo potem operacje są wykonywane na
wskaźnikach. Jednak gdy używam new to program działa najszybciej - znowu nie
rozumiem dlaczego.

Pozdrawiam
Technical Details
Message-ID: <ffcbee1e-596b-4120-95ac-ac0d8d2d5e5d@googlegroups.com>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed.pionier.net.pl!3.eu.feeder.erje.net!feeder.erje.net!weretis.net!feeder7.news.weretis.net!proxad.net!feeder1-2.proxad.net!209.85.160.216.MISMATCH!g89no7080505qtd.0!news-out.google.com!o19ni1932qtr.1!nntp.google.com!g89no7080500qtd.0!postnews.google.com!google-groups.googlegroups.com!not-for-mail
References: <ed3041b7-c05f-43f3-887a-9a12a9633741@googlegroups.com> <b010dc08-d015-4a47-88be-75fa3b91cd07@googlegroups.com> <c13192a2-18b8-4342-ad49-6a90cf36a636@googlegroups.com>

Show Full Headers
Complete Article Headers
X-Received: by 2002:a0c:ab8f:: with SMTP id j15mr32339420qvb.223.1577280306570;        Wed, 25 Dec 2019 05:25:06 -0800 (PST)
X-Received: by 2002:a25:2f49:: with SMTP id v70mr27452641ybv.161.1577280306313; Wed, 25 Dec 2019 05:25:06 -0800 (PST)
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed.pionier.net.pl!3.eu.feeder.erje.net!feeder.erje.net!weretis.net!feeder7.news.weretis.net!proxad.net!feeder1-2.proxad.net!209.85.160.216.MISMATCH!g89no7080505qtd.0!news-out.google.com!o19ni1932qtr.1!nntp.google.com!g89no7080500qtd.0!postnews.google.com!google-groups.googlegroups.com!not-for-mail
Newsgroups: pl.comp.lang.c
Date: Wed, 25 Dec 2019 05:25:05 -0800 (PST)
In-Reply-To: <c13192a2-18b8-4342-ad49-6a90cf36a636@googlegroups.com>
Complaints-To: groups-abuse@google.com
Injection-Info: google-groups.googlegroups.com; posting-host=77.254.46.242; posting-account=xjvq9QoAAAATMPC2X3btlHd_LkaJo_rj
NNTP-Posting-Host: 77.254.46.242
References: <ed3041b7-c05f-43f3-887a-9a12a9633741@googlegroups.com> <b010dc08-d015-4a47-88be-75fa3b91cd07@googlegroups.com> <c13192a2-18b8-4342-ad49-6a90cf36a636@googlegroups.com>
User-Agent: G2/1.0
MIME-Version: 1.0
Message-ID: <ffcbee1e-596b-4120-95ac-ac0d8d2d5e5d@googlegroups.com>
Subject: Re: Optymalizacja kodu
From: "M.M." <mmarszik@gmail.com>
Injection-Date: Wed, 25 Dec 2019 13:25:06 +0000
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit