• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

c++ Dynamiczna Alokacja Pamięci , pomiar czasu przy użyciu wskaznika.

Object Storage Arubacloud
0 głosów
255 wizyt
pytanie zadane 28 maja 2018 w C i C++ przez qlucha Obywatel (1,790 p.)

Witam, w ramach nauki testuje czas zapisu przy użyciu wskaznika i bez niego dynamicznie alokując pamięć RAM.

Ale nie wiem czy coś mi nie wyszło, czy gdzieś popełniłem błąd, podczas nauki dowiedziałem się że, wskazniki wydatnie zwiększają wydajność jeśli chodzi o szybkość zapisu danych do tablicy, przy bardzo dużej ilości operacji do wykonania . Ale w trakcie testów, w kodzie poniżej czasy dla dużych danych wejściowych przy użyciu wskaznika nie są aż tak imponująco krótkie w porównaniu do metody bez ich użycia . Czy gdzieś popełniłem błąd ?

np: dane wejsciowe :

Ile liczb  412345678     z    przedziału  12345

#include <iostream>
#include <ctime>
#include <cstdio>
#include <cstdlib>

clock_t start, stop;
double timeSeconds;

int main()
{
    int ileLiczb, range;
    std::cout <<'\n'<< "Ile Liczb pseudolosowych zaalokowac dynamicznie? :";
    std::cin >> ileLiczb;

    std::cout << "Jaki przedzial?   od 1 do ==>:";
    std::cin >> range;

    //inicjalizacja generatora liczb pseudolosowych
    srand(time(NULL));

    int *Tab;
    //Dynamiczna alokacja tablicy
    Tab = new int [ileLiczb];

        //Stoper - pomiar czasu zapisu inicjacja
        start = clock();

        //zapis danych do tablicy bez uzycia wskaznika
        for (int i = 0; i < ileLiczb; i++) {

            Tab[i] = rand() % range + 1;
        }

        //Stoper - pomiar czasu zapisu koniec i podanie wyniku
        stop = clock();
        timeSeconds = (double)(stop - start)/CLOCKS_PER_SEC;

        std::cout <<'\n'<< "czas zapisu (bez wskaznika) = " << timeSeconds << ".s" << std::endl ;

    delete [] Tab;

    //Dynamiczna alokacja tablicy ze wskaznikiem
    Tab = new int [ileLiczb];

        //Inicjalizacja wskaznika na adres zerowego elemntu tablicy
        int *w = Tab;

        //Stoper - pomiar czasu zapisu inicjacja
        start = clock();

        //zapis danych do tablicy z uzyciem wskaznika
        for (int i = 0; i < ileLiczb; i++) {

            *w = rand() % range + 1;
             w++;
        }

        //Stoper - pomiar czasu zapisu koniec i podanie wyniku
        stop = clock();
        timeSeconds = (double)(stop - start)/CLOCKS_PER_SEC;

        std::cout << "czas zapisu (ze wskaznikem) = " << timeSeconds << ".s" << std::endl <<'\n';

    delete [] Tab;

    getchar();
    getchar();


    return 0;
}

 

1
komentarz 28 maja 2018 przez j23 Mędrzec (194,920 p.)
Nie zdziwiłbym się, gdyby obie pętle miały taki sam kod wynikowy.
komentarz 30 maja 2018 przez qlucha Obywatel (1,790 p.)

Czy mógłbyś rozwinąć swoją myśl, jestem ciekaw każdej opini i wartościowej informacji. smileyyes

komentarz 30 maja 2018 przez j23 Mędrzec (194,920 p.)

Z grubsza chodzi o to, że kompilator w drodze optymalizacji kodu obie pętle zredukuje to takiej samej postaci. Przykład:

# kod wygenerowany dla pętli z indeksami (gcc -O2)

.L2:
	call    rand
	add     r13, 4
	movsx   rcx, eax
	mov     rdx, rcx
	shr     rdx, 2
	mov     rax, rdx
	mul     r12
	shr     rdx, 2
	lea     rax, [rdx+rdx*4]
	lea     rax, [rax+rax*4]
	sal     rax, 2
	sub     rcx, rax
	add     ecx, 1
	mov     DWORD PTR [r13-4], ecx
	cmp     r13, rbp
	jne     .L2


# kod wygenerowany dla pętli ze wskaźnikiem (gcc -O2)

.L3:
	call    rand
	add     rbx, 4
	movsx   rcx, eax
	mov     rdx, rcx
	shr     rdx, 2
	mov     rax, rdx
	mul     r12
	shr     rdx, 2
	lea     rax, [rdx+rdx*4]
	lea     rax, [rax+rax*4]
	sal     rax, 2
	sub     rcx, rax
	add     ecx, 1
	mov     DWORD PTR [rbx-4], ecx
	cmp     rbx, rbp
	jne     .L3

Jak widać obie pętle są takie same. Różnice w czasach, które dostajesz, wynikają z błędów pomiarowych.

 

To "wskaźniki = wyższa wydajność" miało racje bytu dawno temu, gdy procesory nie były zbyt wydajne i trzeba było liczyć każdy takt, żeby jakiś algorytm obliczeniowy był wydajny. Nie wspominając o kompilatorach, które średnio sobie radziły z optymalizacją kodu (ba! miały problem z kodem C++).

komentarz 30 maja 2018 przez qlucha Obywatel (1,790 p.)

Ok . Dzieki za odpowiedz, smiley

To już jest chyba kod z assemblera , którego nie znam niestety . 

Czy warto uczyć się assemblera ?  

komentarz 30 maja 2018 przez j23 Mędrzec (194,920 p.)
Umiejętność czytania kodu asm na pewno się przydaje, bo można sobie podejrzeć, jak wygląda kod po kompilacji, co daje lepsze zrozumienie konstrukcji napisanych w językach wyższego poziomu. Dziś raczej nie programuje się w assemblerze... na pewno nie pisze się całych aplikacji (chyba że na jakieś stare uC).

1 odpowiedź

+1 głos
odpowiedź 28 maja 2018 przez mokrowski Mędrzec (155,460 p.)

Po pierwsze twierdzenie (nieco poszerzam samo twierdzenie) że "zawsze zapis poprzez wskaźnik będzie szybszy niż bezpośrednio" jest nadużyciem. Na szybkość takiego zapisu wpływa o wiele więcej czynników niż tylko dostęp przez wskaźnik. Decyduje o tym także współczynnik trafień w cache, jego wielkość, wyrównanie danych i wiele jeszcze innych czynników.

Po drugie, stosujesz bardzo niedokładny sposób pomiaru czasu. Lepiej jest to zrobić z pomocą narzędzi z nagłówka <chrono>. 

Tak czy siak, operowanie na wskaźnikach i problemy jakie generują, nie jest najczęściej wart wysiłku im poświęcanego jeśli chcesz tylko osiągnąć szybszy zapis. Jest stosunkowo rzadko używany (a szkoda) kontener który służy do takich szybkich operacji.  To std::valarray z nagłówka <valarray>. 

komentarz 28 maja 2018 przez qlucha Obywatel (1,790 p.)

Dziękuję za profesjonalną odpowiedz smileyyes.

Mam jeszcze jedną prośbę trochę z innej beczki,  chodzi mi o moje prywatne odczucia.

A mianowicie zastanawia mnie fakt, i naprawdę nie mogę czasami wyjść z podziwu w jaki sposób można zdobyć tak ogromną wiedzę odnośnie programowania . 

I tu moja prośba i pytanie . Jakie wartościowe zródła do nauki Pan by polecał z własnego doświadczenia jeśli można. Chodzi mi o np. kursy,  najlepsze książki z przykładami wyczerpującymi temat , lub nawet online tutor .  smileyenlightened

komentarz 28 maja 2018 przez mokrowski Mędrzec (155,460 p.)

Zdecydowanie książki. W tutorialach jest wiedza fragmentaryczna. Oczywiście generalizuję i także znajdzie się kilka perełek. 

Jeśli to początek drogi i "ma być solidnie" to: https://helion.pl/ksiazki/jezyk-c-szkola-programowania-wydanie-vi-stephen-prata,cppri6.htm#format/d

Uwaga, to jest "cegła"... 

Jeśli już coś wiesz a chcesz szybko podnieść kompetencje to: 

https://helion.pl/ksiazki/jezyk-c-kompendium-wiedzy-wydanie-iv-bjarne-stroustrup,jcppkw.htm#format/d

Uwaga, nie zawiera ćwiczeń i jest "przeglądówką" ale bardzo wartościową.

Bez względu na poziom wiedzy:

https://helion.pl/ksiazki/c-biblioteka-standardowa-podrecznik-programisty-wydanie-ii-nicolai-m-josuttis,cpbsp2.htm#format/e

Serdecznie nie polecam Grębosza. Promuje stare i nieadekwatne do dzisiejszego stanu wiedzy techniki, ułożenia materiału i stanu rozwoju języka. Jeśli za to spadną na mnie gromy, przepraszam ale wiem co mówię bo zaczynałem edukację od nich i ... żałuję że nie od innych.

Oczywiście lepsze są wydania w j. angielskim ale zadając to pytanie (zapewne) oczekiwałeś braku bariery językowej. Pamiętaj, tłumaczenia mogą być różnej jakości.

Co do materiałów online, serdecznie polecam kanał Cppcon na YT. Tam są naprawdę wartościowe wystąpienia i bardzo "świeże" zagadnienia. 

komentarz 28 maja 2018 przez qlucha Obywatel (1,790 p.)

Ok, dziękuje za odpowiedz. Na pewno zakupię te 3 książki i je przestudiuje , nie wiem ile czasu mi to zajmie , Ale najważniejsze że,  wiem w której kopalni zacząć kopać smileyyes

Jeszcze raz chciałem podziękować za odpowiedz. smiley 

komentarz 30 maja 2018 przez NIMuser Stary wyjadacz (11,030 p.)

@mokrowski, praktycznie nic dodać nic ująć ;)  

Stephen Prata i Bjarne Stroustrup są bardzo dobre. Tej trzeciej nie znam, ale niedługo Helion wyda dwie książki do C++ 17 ( dobre praktyki + biblioteka standardowa STL ).

W temacie C++:  Czym się zajmujecie w C++? Ktoś robi z Was web dev w C++? Wiem, że bardzo rzadko się sięga do C++ przy stronach/aplikacjach www, ale jednak czasem trzeba... Ktoś na forum coś działa w C++ dla web dev?

Mnie zainteresowały REST API w C++, np. Pistache jest dość ciekawe.

 

 

Podobne pytania

0 głosów
1 odpowiedź 281 wizyt
pytanie zadane 7 kwietnia 2023 w C i C++ przez Zuzan Początkujący (390 p.)
0 głosów
1 odpowiedź 439 wizyt
pytanie zadane 7 maja 2020 w C i C++ przez Hubertius Bywalec (2,970 p.)
0 głosów
1 odpowiedź 399 wizyt
pytanie zadane 23 kwietnia 2020 w C i C++ przez monterek4444 Początkujący (350 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...