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

question-closed Moja implementacja stosu jest szybsza?!

Object Storage Arubacloud
+4 głosów
439 wizyt
pytanie zadane 5 lutego 2017 w C i C++ przez JAKUBW Nałogowiec (33,470 p.)
zamknięte 5 lutego 2017 przez JAKUBW

Witam

zrobiłem sobie ostatnio implementacje stosu, kolejki i listy w C++ i wszystko działa fajnie, ale postanowiłem porównać szybkość mojego stosu ze stosem z C++ (z biblioteki stack). I wyszły mi zaskakujące wyniki bowiem mój jest ponad 6 razy szybszy!

Mój stos:

template<class T>
class Stack
{
	class Component
	{
	public:
		T value;
		Component *next_component = nullptr;
		Component(T &value)
		{
			this->value = value;
		}
	};
	Component *c = nullptr;
	std::size_t _size = 0;

public:
	const bool is_empty() const { return c == nullptr; }
	const std::size_t size() const { return _size; }
	void push(T value)
	{
		_size++;
		if (c == nullptr)
		{
			c = new Component(value);
		}
		else
		{
			Component *temp = new Component(value);
			temp->next_component = c;
			c = temp;
		}
	}
	T pop()
	{
		if (c == nullptr) throw std::out_of_range("Cannot pop from the stack - it is empty!");
		_size--;
		Component *temp = c->next_component;
		T value = c->value;
		delete c;
		c = temp;
		return value;
	}
	T& peek() const
	{
        if (c == nullptr) throw std::out_of_range("Cannot peek the stack - it is empty!");
		return c->value;
	}
	void clear()
	{
		std::size_t *_ptr = &_size;
		while (*_ptr) {
			(*_ptr)--;
			Component *temp = c->next_component;
			delete c;
			c = temp;
		}
	}
	~Stack()
	{
		clear();
	}
};

Metoda porównania:

#define SIZE 1000
#define TESTS 100
long long tab[SIZE];

void test()
{
	clock_t begin_time;
	float time;
	begin_time = clock();
	for (int i = 0; i < TESTS; i++)
	{
		std::stack<long long> s;
		for (int j = 0; j < SIZE; j++)
			s.push(tab[j]);
		for (int j = 0; j < SIZE; j++)
			s.top() += 50;
		while (!s.empty())
			s.pop();
	}
	time = float(clock() - begin_time) / CLOCKS_PER_SEC;
	std::cout << "System's stack: " << time << endl;

	begin_time = clock();
	for (int i = 0; i < TESTS; i++)
	{
		Stack<long long> s;
		for (int j = 0; j < SIZE; j++)
			s.push(tab[j]);
		for (int j = 0; j < SIZE; j++)
			s.peek() += 50;
		while (!s.is_empty())
			s.pop();
	}
	time = float(clock() - begin_time) / CLOCKS_PER_SEC;
	std::cout << "My stack: \t" << time << endl;
}
int main() {
	srand(time(nullptr));

	for (int j = 0; j < SIZE; j++)
		tab[j] = rand();

	for (int i = 0; i < 10; i++)
		test();//10 testów dla pewności

	getchar();
	return 0;
}

Oraz wyniki:

Moje pytanie brzmi: dlaczego? przecież domyślny stos powinien być lepiej zrobiony i powinien być szybszy

Pozdrawiam

komentarz zamknięcia: Dostałem odpowiedź - w trybie debug po prostu systemowy stos działa wolniej:D
2
komentarz 5 lutego 2017 przez adrian17 Ekspert (344,860 p.)
A optymalizacje kompilatora włączyłeś? Bez nich nie ma co mierzyć.
komentarz 5 lutego 2017 przez JAKUBW Nałogowiec (33,470 p.)
Wszystko domyślnie ustawione mam, ale już wiem - tryb debug jest wolniejszy...

1 odpowiedź

+9 głosów
odpowiedź 5 lutego 2017 przez koczurekk Gaduła (3,420 p.)
wybrane 5 lutego 2017 przez JAKUBW
 
Najlepsza

Skompiluj to w trybie release zanim zabierzesz się kiedyś znowu za pomiary. 

System's stack: 0.000465
My stack:     0.002924
System's stack: 0.000459
My stack:     0.002844
System's stack: 0.000447
My stack:     0.002841
System's stack: 0.000446
My stack:     0.002845
System's stack: 0.000449
My stack:     0.002861
System's stack: 0.000456
My stack:     0.002915
System's stack: 0.000445
My stack:     0.002834
System's stack: 0.000441
My stack:     0.002856
System's stack: 0.000444
My stack:     0.002785
System's stack: 0.000442
My stack:     0.002754

Btw twoja implementacja stosu jest pod wieloma względami upośledzona (brak iteratorów, możliwości użycia własnego alokatora, nie da się go porpawnie skopiować / przypisać), więc użyłbym std::stack nawet gdyby rzeczywiście był 6 razy wolniejszy.

komentarz 5 lutego 2017 przez JAKUBW Nałogowiec (33,470 p.)
Tak, to ma teraz sens :D Wiele wyjaśnia, ale na to nie wpadłem:)

Podobne pytania

0 głosów
1 odpowiedź 199 wizyt
pytanie zadane 14 listopada 2021 w C i C++ przez pawel_000 Początkujący (450 p.)
0 głosów
1 odpowiedź 366 wizyt
pytanie zadane 19 maja 2021 w C i C++ przez hassan00 Nowicjusz (130 p.)
0 głosów
2 odpowiedzi 324 wizyt
pytanie zadane 14 października 2018 w C i C++ przez periedynek Obywatel (1,320 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!

...