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

Zmienne wydajniejsze od wskaźników.

Object Storage Arubacloud
+4 głosów
382 wizyt
pytanie zadane 2 stycznia 2016 w C i C++ przez obx88 Nowicjusz (160 p.)
edycja 2 stycznia 2016 przez obx88

Witam!

Mam problem ze zrozumieniem dlaczego mój komputer radzi sobie szybciej operując na zmiennych i sięgając po ich adresy do magistrali, niż kiedy ma podany adres poprzez wskaźnik. W każdym programie mierzącym czas(w tym m.in. program napisany przez p. Mirosława Zelenta) tych obu sposobów wychodzi na to, że na moim komputerze zmienne są wydajniejsze od wskaźników. Prosiłbym o wytłumaczenie dlaczego tak się dzieje.

#include <iostream>
#include <time.h>
#include <cstdlib>

using namespace std;

int ile;
clock_t start, stop;
double czas;

int main()
{
    cout << "Ile liczb w tablicy: ";
    cin>>ile;

    //dynamiczna alokacja tablicy
    int *tablica;
    tablica=new int [ile];

    //zacznij odliczac czas
    start = clock();
    //wczytywanie liczb do tablicy
    for (int i=0; i<ile; i++)
    {
        tablica[i]=i;
        tablica[i]+=50;
    }
    stop = clock();
    czas = (double)(stop - start) / CLOCKS_PER_SEC;
    cout<<"Czas zapisu (bez wskaznika): "<<czas<<" s"<<endl;

    delete [] tablica;

    //ponowna alokacja tablicy
     tablica=new int [ile];
	 int *wskaznik=tablica;

    //zacznij odliczac czas
    start = clock();
    //wczytywanie liczb do tablicy
    for (int i=0; i<ile; i++)
    {
        *wskaznik = i;
        *wskaznik+=50;
        wskaznik++;
    }
    stop = clock();
    czas = (double)(stop - start) / CLOCKS_PER_SEC;
    cout<<"Czas zapisu (ze wskaznikiem): "<<czas<<" s";

    delete [] tablica;

    return 0;
}

komentarz 10 czerwca 2018 przez Aisekai Nałogowiec (42,190 p.)
A spróbuj tak, że czas zaczniesz odliczać dopiero wtedy, kiedy zostanie wpisana wartość do pierwszej komórki. Tzn przed rozpoczęciem odliczania wpisz cokolwiek do tablic.

Sprawdź też, czy jak zmienisz miejscami liczenie dla tablicy i ze wskaźnikiem to będą się różnić.
komentarz 10 czerwca 2018 przez JAKUBW Nałogowiec (33,470 p.)

To widocznie tak jest u ciebie, bo u mnie jest znacznie szybciej używając wskaźników:

#include <iostream>
#include <chrono>

int main() {
    std::size_t size = 0;
    std::cin>>size;

    {
        int* const array = new int[size];

        auto start = std::chrono::high_resolution_clock::now();
        for (std::size_t i = 0;i < size; ++i) {
            array[i] = (int)i;
            array[i] += 50;
        }
        auto end = std::chrono::high_resolution_clock::now();
        auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count();

        std::cout << "Without pointers: " << duration << "ms." << std::endl;

        delete [] array;
    }

    {
        int* const array = new int[size];
        int* pointer = array;

        auto start = std::chrono::high_resolution_clock::now();
        for (std::size_t i = 0;i < size; ++i) {
            *pointer = (int)i;
            *pointer += 50;
            ++pointer;
        }
        auto end = std::chrono::high_resolution_clock::now();
        auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count();

        std::cout << "With pointers: " << duration << "ms." << std::endl;

        delete [] array;
    }
}

Wynik dla 1000000:

1000000
Without pointers: 18ms.
With pointers: 9ms.

 Kompilowane komendą:

g++-7 test.cpp

 

komentarz 10 czerwca 2018 przez Hiskiel Pasjonat (22,830 p.)
JAKUBW, dlaczego są tam 2x otwarte nawiasy w mainie, a w nich te różne instrukcje? Co to oznacza?
komentarz 10 czerwca 2018 przez Aisekai Nałogowiec (42,190 p.)
Coś na zasadzie funkcji, albo wykonanie dwóch programów w jednej funkcji main.

2 odpowiedzi

+1 głos
odpowiedź 2 stycznia 2016 przez niezalogowany
Wstaw kod i wyniki
komentarz 2 stycznia 2016 przez obx88 Nowicjusz (160 p.)
Pytanie zostało zaaktualizowane
komentarz 2 stycznia 2016 przez Patrycjerz Mędrzec (192,320 p.)

Możliwe, że jest to spowodowane szybką przepustowością magistrali lub inną technologią, którą twój komputer obsługuje. Ale pytanie bardzo ciekawe wink

komentarz 2 stycznia 2016 przez draghan VIP (106,230 p.)
...lub optymalizacją kompilatora. Szkoda że nie mam czasu się temu dokładnie przyjrzeć, ale będę obserwował temat, może któryś z Pasjonatów to zrobi. :)
+1 głos
odpowiedź 10 czerwca 2018 przez Werlock Użytkownik (580 p.)
Mogę się mylić, ale napewno wskaźniki i tablice mają wiele wspólnego.

int tablica [5] {1,2,3,4,5};

Dostęp do poszczególnych wartości można mieć na kilka sposobów:

tablica[0]; //to wartość 1

*(tablica); //to też wartość 1

tablica; //to adres pierwszego elementu w tablicy

tablica+1; //to adres drugiego elementu tablicy (o indeksie 1);

*(tablica+1); //to wartość elementu spod indeksu 1

 

Tak więc, tablica zawiera jakby adresy do elementów, a zapis: nazwa_tablicy [nr_indeksu] tak jakby od razu wyłuskuje wartość spod tego adresu. Dla tego myślę, że w obydwóch przypadkach korzystałeś ze wskaźników.

 

Proponuję, żebyś program wykonał kilkanaście razy i sprawdził czy przypadkiem nie będzie sytuacji, że raz pierwszy zapis będzie wydajniejszy od drugiego, a potem na odwrót.

 

Wiem, że wygrałem złotą łopatę, ale skoro już się znalazłem w tym wątku...

Podobne pytania

0 głosów
0 odpowiedzi 65 wizyt
pytanie zadane 30 marca 2020 w C i C++ przez wall7489 Obywatel (1,250 p.)
+1 głos
4 odpowiedzi 1,211 wizyt
pytanie zadane 23 października 2020 w C i C++ przez Amunius Początkujący (280 p.)
0 głosów
1 odpowiedź 275 wizyt
pytanie zadane 4 października 2016 w C i C++ przez Kuba321 Użytkownik (730 p.)

92,536 zapytań

141,377 odpowiedzi

319,456 komentarzy

61,922 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!

...