Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Algorytm rekurencyjny i stos oraz szybkość wykonywania.

Ostatnio zmodyfikowano 2013-07-18 20:56
Autor Wiadomość
johny
Temat założony przez niniejszego użytkownika
Algorytm rekurencyjny i stos oraz szybkość wykonywania.
» 2013-07-17 18:35:20
Witam. Mam pewien program wykorzystujący algorytm rekurencyjny, który kompilowany pod ubuntu działa jak marzenie, a pod windowsem wysypuje stack overflow. Z czego to wynika? Kompilator przydziela inną wielkość stosu pod windowsem?

1. Jeśli tak to jak mogę zwiększyć pojemność stosu?

Napisałem to samo iteracyjnie. W tym celu symuluje stos używając mojej klasy Stack opartej na kolejce std::deque. Algorytm działa jak ślimak (niezależnie od tego czy kolejka jest tworzona normalnie czy dynamicznie).

2. Czy to, że dane będą umieszczone na stercie (czyli dynamicznie tworzone) zamiast w normalnej pamięci (która nawet nie wiem jak się nazywa) przyspiesza coś wykonywanie algorytmu? W sensie czy sterta różni się szybkością działania od normalnej pamięci?
P-88119
m4tx
» 2013-07-17 18:44:30
W sensie czy sterta różni się szybkością działania od normalnej pamięci?
Stos jest z reguły szybszy.

Algorytm działa jak ślimak
Spróbowałbym na początek określić rozmiar
std::deque
 podczas tworzenia go. Być może podczas dodawania obiektów do niego jest on bardzo często rozszerzany i stąd niska wydajność.
P-88122
DejaVu
» 2013-07-17 19:46:58
Kompilator przydziela inną wielkość stosu pod windowsem?
Każdy kompilator jak i każda jego wersja może przydzielać inny rozmiar stosu. Rozmiar stosu zmienia się za pomocą opcji kompilatora, więc sposób ustawienia jest bezpośrednio zależny od używanego kompilatora. Dodam jeszcze, że jeżeli algorytm potrzebuje tak dużej ilości pamięci stosu to należy poważnie rozważać jego implementację na stercie, a nie rozwiązywać problem poprzez zwiększenie rozmiaru stosu.
P-88125
johny
Temat założony przez niniejszego użytkownika
» 2013-07-17 20:07:04
W jaki sposób mogę określić początkowy rozmiar kolejki?
Jeśli wpisuję tak:
C/C++
std::deque < T > kol( 100 );
to Qt Creator mi podkreśla linijkę na czerwono;d

Kod klasy Stack:
C/C++
#ifndef STACK_H
#define STACK_H
#include <deque>
template < class T >
class Stack {
    std::deque < T > kol; // tutaj wpisuję std::deque<T> kol(100);
public:
    Stack() {
    }
    void clear() {
        kol.clear();
    }
    bool isEmpty() const {
        return kol.empty();
    }
    T & top() {
        return kol.back();
    }
    void pop() {
        kol.pop_back();
    }
    void push( const T & el ) {
        kol.push_back( el );
    }
    void push( const T * el ) {
        kol.push_back( * el );
    }
};

#endif // STACK_H

// EDIT:
W jaki sposób dodaje się na tym forum cytat?;d Chciałem zacytować fragment odpowiedzi DejaVu;d
Podjąłem pewne kroki i zaimplementowałem to na stercie, ale działa strasznie wolno, toteż teraz staram się przyspieszyć :)
P-88127
DejaVu
» 2013-07-17 20:19:00
C/C++
kol.reserve( 100 );
P-88128
johny
Temat założony przez niniejszego użytkownika
» 2013-07-17 21:35:12
kol.reserve( 100 );
 nie kompiluje się. Nie wiem o co konkretnie chodziło użytkownikowi m4tx (jeśli chodzi o "określenie rozmiaru std::deque podczas tworzenia"), ale faktycznie kolejka ma dużo elementów (1.3~1.5 miliona).

Jeszcze pytanie dotyczące stosu. Czy da się w jakiś sposób odczytać adres wskaźnika stosu w funkcji globalnej?
P-88132
pekfos
» 2013-07-17 21:47:38
Czy da się w jakiś sposób odczytać adres wskaźnika stosu w funkcji globalnej?
Wstawką asma. Ale po co?
P-88135
Elaine
» 2013-07-17 22:14:03
Każdy kompilator jak i każda jego wersja może przydzielać inny rozmiar stosu. Rozmiar stosu zmienia się za pomocą opcji kompilatora, więc sposób ustawienia jest bezpośrednio zależny od używanego kompilatora.
Pod Windowsem rozmiar stosu ustawia się podczas linkowania (później można go prosto zmienić, to tylko pole w nagłówku PE), a pod większością systemów *niksowych decydują o tym kernel systemu i administrator (poprzez ulimit). Kompilator nie ma wiele do powiedzenia, co najwyżej można go ostrzec, że stos może być nieciągły.
P-88137
« 1 » 2
  Strona 1 z 2 Następna strona