eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programming › Porównanie szybkości mnożenia macierzy w CPP i PASCAL
Ilość wypowiedzi w tym wątku: 50

  • 11. Data: 2011-02-02 19:05:42
    Temat: Re: Porównanie szybkości mnożenia macierzy w CPP i PASCAL
    Od: Fil <f...@p...onet.pl>

    W dniu 2011-02-02 19:40, Grzegorz Krukowski pisze:
    > On Wed, 02 Feb 2011 19:14:51 +0100, Fil<f...@p...onet.pl>
    > wrote:
    >
    >>> Czy wyłączyłeś wszystkie mechanizmy kontrolne Pascala? Bo za czasów
    >>> kiedy go używałem to miał on kontrolę zakresów, przepełnień i tym
    >>> podobnych rzeczy a to potrafi spowolnić.
    >>
    >> A gdzie to wyłączyć?
    > Znjadź opcje kopilatora, pewno zakładka runtime lub coś podobnego, a
    > te opcje to:
    > Integer Overflow Checking,
    > Range Checking
    Sprawdziłem. Domyślnie wyłączone. Było jeszcze I/O Checking włączone,
    ale po wyłączeniu nic się nie zmieniło.


  • 12. Data: 2011-02-02 19:15:56
    Temat: Re: Porównanie szybkości mnożenia macierzy w CPP i PASCAL
    Od: Grzegorz Krukowski <r...@o...pl>

    On Wed, 02 Feb 2011 20:05:42 +0100, Fil <f...@p...onet.pl>
    wrote:

    >W dniu 2011-02-02 19:40, Grzegorz Krukowski pisze:
    >> On Wed, 02 Feb 2011 19:14:51 +0100, Fil<f...@p...onet.pl>
    >> wrote:
    >>
    >>>> Czy wyłączyłeś wszystkie mechanizmy kontrolne Pascala? Bo za czasów
    >>>> kiedy go używałem to miał on kontrolę zakresów, przepełnień i tym
    >>>> podobnych rzeczy a to potrafi spowolnić.
    >>>
    >>> A gdzie to wyłączyć?
    >> Znjadź opcje kopilatora, pewno zakładka runtime lub coś podobnego, a
    >> te opcje to:
    >> Integer Overflow Checking,
    >> Range Checking
    >Sprawdziłem. Domyślnie wyłączone. Było jeszcze I/O Checking włączone,
    >ale po wyłączeniu nic się nie zmieniło.
    No ale ja doczytałem się o tych tablicach dynamicznych. To one sa
    źródłem problemu. Z dynamicznymi tablicami możesz zrobić coś takiego:

    k := 0;
    SetLength(a, 4); // 4 rows
    for i := 0 to 3 do begin // For each row
    SetLength(a[i], i + 1); // Set the number of columns
    for j := 0 to i do begin // Initialize the row
    a[i,j] := k;
    inc(k);
    end;
    end;

    0 1 2 3
    +---+
    0 | 0 |
    +---+---+
    1 | 1 | 2 |
    +---+---+---+
    2 | 3 | 4 | 5 |
    +---+---+---+---+
    3 | 6 | 7 | 8 | 9 |
    +---+---+---+---+

    Czyli ty masz 300 tablic po 2000 elementów i, co najważniejsze tutaj,
    każdy z osobną adresacją / obliczaniem indeksów. Czyli nie jest to
    równoważnik tablicy dynamicznej z C/C++!
    --
    Grzegorz Krukowski


  • 13. Data: 2011-02-02 19:30:53
    Temat: Re: Porównanie szybkości mnożenia macierzy w CPP i PASCAL
    Od: Fil <f...@p...onet.pl>

    W dniu 2011-02-02 20:15, Grzegorz Krukowski pisze:
    > On Wed, 02 Feb 2011 20:05:42 +0100, Fil<f...@p...onet.pl>
    > wrote:
    >
    >> W dniu 2011-02-02 19:40, Grzegorz Krukowski pisze:
    >>> On Wed, 02 Feb 2011 19:14:51 +0100, Fil<f...@p...onet.pl>
    >>> wrote:
    >>>
    >>>>> Czy wyłączyłeś wszystkie mechanizmy kontrolne Pascala? Bo za czasów
    >>>>> kiedy go używałem to miał on kontrolę zakresów, przepełnień i tym
    >>>>> podobnych rzeczy a to potrafi spowolnić.
    >>>>
    >>>> A gdzie to wyłączyć?
    >>> Znjadź opcje kopilatora, pewno zakładka runtime lub coś podobnego, a
    >>> te opcje to:
    >>> Integer Overflow Checking,
    >>> Range Checking
    >> Sprawdziłem. Domyślnie wyłączone. Było jeszcze I/O Checking włączone,
    >> ale po wyłączeniu nic się nie zmieniło.
    > No ale ja doczytałem się o tych tablicach dynamicznych. To one sa
    > źródłem problemu. Z dynamicznymi tablicami możesz zrobić coś takiego:
    >
    > k := 0;
    > SetLength(a, 4); // 4 rows
    > for i := 0 to 3 do begin // For each row
    > SetLength(a[i], i + 1); // Set the number of columns
    > for j := 0 to i do begin // Initialize the row
    > a[i,j] := k;
    > inc(k);
    > end;
    > end;
    >
    > 0 1 2 3
    > +---+
    > 0 | 0 |
    > +---+---+
    > 1 | 1 | 2 |
    > +---+---+---+
    > 2 | 3 | 4 | 5 |
    > +---+---+---+---+
    > 3 | 6 | 7 | 8 | 9 |
    > +---+---+---+---+
    >
    > Czyli ty masz 300 tablic po 2000 elementów i, co najważniejsze tutaj,
    > każdy z osobną adresacją / obliczaniem indeksów. Czyli nie jest to
    > równoważnik tablicy dynamicznej z C/C++!

    No.. jeśli tak to wyjaśnia sprawę. Jednak na tablicach o ustalonym z
    góry rozmiarze też wolniej pracuje program kompilowany pod Delphi (o ok.
    0.7s).



  • 14. Data: 2011-02-02 19:51:05
    Temat: Re: Porównanie szybkości mnożenia macierzy w CPP i PASCAL
    Od: Grzegorz Krukowski <r...@o...pl>

    On Wed, 02 Feb 2011 20:30:53 +0100, Fil <f...@p...onet.pl>
    wrote:

    >W dniu 2011-02-02 20:15, Grzegorz Krukowski pisze:
    >> On Wed, 02 Feb 2011 20:05:42 +0100, Fil<f...@p...onet.pl>
    >> wrote:
    >>
    >>> W dniu 2011-02-02 19:40, Grzegorz Krukowski pisze:
    >>>> On Wed, 02 Feb 2011 19:14:51 +0100, Fil<f...@p...onet.pl>
    >>>> wrote:
    >>>>
    >>>>>> Czy wyłączyłeś wszystkie mechanizmy kontrolne Pascala? Bo za czasów
    >>>>>> kiedy go używałem to miał on kontrolę zakresów, przepełnień i tym
    >>>>>> podobnych rzeczy a to potrafi spowolnić.
    >>>>>
    >>>>> A gdzie to wyłączyć?
    >>>> Znjadź opcje kopilatora, pewno zakładka runtime lub coś podobnego, a
    >>>> te opcje to:
    >>>> Integer Overflow Checking,
    >>>> Range Checking
    >>> Sprawdziłem. Domyślnie wyłączone. Było jeszcze I/O Checking włączone,
    >>> ale po wyłączeniu nic się nie zmieniło.
    >> No ale ja doczytałem się o tych tablicach dynamicznych. To one sa
    >> źródłem problemu. Z dynamicznymi tablicami możesz zrobić coś takiego:
    >>
    >> k := 0;
    >> SetLength(a, 4); // 4 rows
    >> for i := 0 to 3 do begin // For each row
    >> SetLength(a[i], i + 1); // Set the number of columns
    >> for j := 0 to i do begin // Initialize the row
    >> a[i,j] := k;
    >> inc(k);
    >> end;
    >> end;
    >>
    >> 0 1 2 3
    >> +---+
    >> 0 | 0 |
    >> +---+---+
    >> 1 | 1 | 2 |
    >> +---+---+---+
    >> 2 | 3 | 4 | 5 |
    >> +---+---+---+---+
    >> 3 | 6 | 7 | 8 | 9 |
    >> +---+---+---+---+
    >>
    >> Czyli ty masz 300 tablic po 2000 elementów i, co najważniejsze tutaj,
    >> każdy z osobną adresacją / obliczaniem indeksów. Czyli nie jest to
    >> równoważnik tablicy dynamicznej z C/C++!
    >
    >No.. jeśli tak to wyjaśnia sprawę. Jednak na tablicach o ustalonym z
    >góry rozmiarze też wolniej pracuje program kompilowany pod Delphi (o ok.
    >0.7s).
    >
    Jeżeli ci to jest na poważnie potrzebne zainteresuj sie tą pozycją:
    Podstawowe procedury numeryczne w języku Turbo Pascal - A. Marciniak,
    D. Gregulec, J. Kaczmarek
    Jest to krótki opis numeryki a'la Pascal oraz zestaw gotowych
    procedur. Tylko musisz mieć dołączoną do książki dyskietkę, bo książka
    jest po prawdzie podręcznikiem do procedur umieszczonych na dyskietce.
    --
    Grzegorz Krukowski


  • 15. Data: 2011-02-02 19:55:00
    Temat: Re: Porównanie szybkości mnożenia macierzy w CPP i PASCAL
    Od: Fil <f...@p...onet.pl>

    Jeszcze raz - ostatni test i podsumowanie:
    PASCAL wariant 1 kompilator DELPHI: 8,2s
    PASCAL wariant 2 kompilator DELPHI: 5,2s
    CPP wariant 1 kompilator BUILDER: 4,5s
    CPP wariant 2 kompilator BUILDER: 4,0s
    CPP wariant 1 kompilator VISUAL: 1,4s
    CPP wariant 2 kompilator VISUAL: 1,2s

    I tyle w temacie :)

    PS. Użyłem Visuala 2010 Ultimate.
    Tablice źródłowe 2000 wierszy i 300 kolumn.
    Tablica wynikowa 2000 wierszy i kolumn

    Poniżej wklejam jeszcze raz procedury:
    PASCAL wariant 1:
    TMatrix = array of array of double;

    procedure MulMatrix(N, Q, M:integer; T1, T2:TMatrix; var T3:TMatrix);
    var
    i, j, k:integer;
    begin
    for i := 0 to N-1 do
    for j := 0 to M-1 do begin
    T3[i, j] := 0;
    for k := 0 to Q-1 do T3[i, j] := T3[i, j] + T1[i, k] * T2[k, j];
    end;
    end;

    PASCAL wariant 2:
    TA=array[0..1999,0..299] of double;
    TB=array[0..299,0..1999] of double;
    TC=array[0..1999,0..1999] of double;

    procedure MulMatrix2(N, Q, M:integer; var T1:TA; var T2:TB; var T3:TC);
    var
    i, j, k:integer;
    begin
    for i := 0 to N-1 do
    for j := 0 to M-1 do begin
    T3[i, j] := 0;
    for k := 0 to Q-1 do T3[i, j] := T3[i, j] + T1[i, k] * T2[k, j];
    end;
    end;

    CPP wariant 1:
    void MulTab(int N, int Q, int M, double** A, double** B, double** C)
    {
    for (int i = 0; i < N; ++i)
    for (int j = 0; j < M; ++j) {
    C[i][j] = 0;
    for (int k = 0; k < Q; ++k) C[i][j] += A[i][k] * B[k][j];
    }
    }

    CPP wariant 2:
    void MulTab2(int N, int Q, int M, double** A, double** B, double** C)
    {
    int _M, _Q;
    double R;
    double** Ai;
    double** Bj;
    double* Aik;
    double* Bjk;
    double* Cij;

    while (N--) {
    Ai = A++;
    Bj = B;
    Cij = *C++;

    _M = M;
    while (_M--) {
    Aik = *Ai;
    Bjk = *Bj++;

    R = 0;
    _Q = Q;
    while (_Q--) R += *Aik++ * *Bjk++;
    *Cij++ = R;
    }
    }
    }

    Pozdrawiam,
    Fil.


  • 16. Data: 2011-02-02 19:56:18
    Temat: Re: Porównanie szybkości mnożenia macierzy w CPP i PASCAL
    Od: Fil <f...@p...onet.pl>

    > Jeżeli ci to jest na poważnie potrzebne zainteresuj sie tą pozycją:
    > Podstawowe procedury numeryczne w języku Turbo Pascal - A. Marciniak,
    > D. Gregulec, J. Kaczmarek
    > Jest to krótki opis numeryki a'la Pascal oraz zestaw gotowych
    > procedur. Tylko musisz mieć dołączoną do książki dyskietkę, bo książka
    > jest po prawdzie podręcznikiem do procedur umieszczonych na dyskietce.

    Marciniak? Nie... wyrosłem już z tego. Ale kiedyś się przydała... Dzięki.


  • 17. Data: 2011-02-02 20:03:29
    Temat: Re: Porównanie szybkości mnożenia macierzy w CPP i PASCAL
    Od: Grzegorz Krukowski <r...@o...pl>

    On Wed, 02 Feb 2011 20:56:18 +0100, Fil <f...@p...onet.pl>
    wrote:

    >> Jeżeli ci to jest na poważnie potrzebne zainteresuj sie tą pozycją:
    >> Podstawowe procedury numeryczne w języku Turbo Pascal - A. Marciniak,
    >> D. Gregulec, J. Kaczmarek
    >> Jest to krótki opis numeryki a'la Pascal oraz zestaw gotowych
    >> procedur. Tylko musisz mieć dołączoną do książki dyskietkę, bo książka
    >> jest po prawdzie podręcznikiem do procedur umieszczonych na dyskietce.
    >
    >Marciniak? Nie... wyrosłem już z tego. Ale kiedyś się przydała... Dzięki.
    Znaczy że Marciniak, czy te procedury nędzne są?
    --
    Grzegorz Krukowski


  • 18. Data: 2011-02-02 20:50:58
    Temat: Re: Porównanie szybkości mnożenia macierzy w CPP i PASCAL
    Od: Fil <f...@p...onet.pl>

    W dniu 2011-02-02 21:03, Grzegorz Krukowski pisze:
    > On Wed, 02 Feb 2011 20:56:18 +0100, Fil<f...@p...onet.pl>
    > wrote:
    >
    >>> Jeżeli ci to jest na poważnie potrzebne zainteresuj sie tą pozycją:
    >>> Podstawowe procedury numeryczne w języku Turbo Pascal - A. Marciniak,
    >>> D. Gregulec, J. Kaczmarek
    >>> Jest to krótki opis numeryki a'la Pascal oraz zestaw gotowych
    >>> procedur. Tylko musisz mieć dołączoną do książki dyskietkę, bo książka
    >>> jest po prawdzie podręcznikiem do procedur umieszczonych na dyskietce.
    >>
    >> Marciniak? Nie... wyrosłem już z tego. Ale kiedyś się przydała... Dzięki.
    > Znaczy że Marciniak, czy te procedury nędzne są?
    Nie... Może źle się wyraziłem. Książka jest bardzo fajna - dużo
    ciekawych pomysłów w jednym miejscu. Kiedyś korzystałem z niej dużo.
    Może brakuje porównania metod numerycznych względem siebie, np. pod
    kątem szybkości działania. Marciniaka bardzo cenię. Po prostu teraz
    jestem na etapie wymyślania jak napisać optymalny (szybki) kod,
    jednocześnie używając ulubionych narzędzi (Builder do GUI z DevExpress i
    TMS components), a nie zastanawiać się jak stworzyć procedurę numeryczną
    przeliczającą coś tam. Wszystkie potrzebne procedurki już mam. :)

    Muszę pomyśleć jak pożenić Visuala do obliczeń numerycznych i Buildera
    do GUI...

    Jeszcze raz dziękuję.
    Fil.


  • 19. Data: 2011-02-02 20:57:16
    Temat: Re: Porównanie szybkości mnożenia macierzy w CPP i PASCAL
    Od: Mariusz Marszałkowski <m...@g...com>

    On 2 Lut, 17:47, Fil <f...@p...onet.pl> wrote:
    > Witam!
    >
    > Są dwie procedury:
    > CPP:
    > void MulTab(int N, int Q, int M, double** A, double** B, double** C)
    > {
    >   for (int i = 0; i < N; ++i)
    >     for (int j = 0; j < M; ++j) {
    >       C[i][j] = 0;
    >       for (int k = 0; k < Q; ++k) C[i][j] += A[i][k] * B[k][j];
    >     }
    >   }
    >
    > oraz PASCAL:
    > TMatrix = array of array of double;
    >
    > procedure MulMatrix(N, Q, M:integer; T1, T2:TMatrix; var T3:TMatrix);
    > var
    >   i, j, k:integer;
    > begin
    >   for i := 0 to N-1 do
    >    for j := 0 to M-1 do begin
    >      T3[i, j] := 0;
    >      for k := 0 to Q-1 do T3[i, j] := T3[i, j] + T1[i, k] * T2[k, j];
    >    end;
    > end;
    >
    > Kompiluję obie w BCB Builder 2010 i Delphi 2010 (odpowiednio) w trybie
    > "release" z włączonymi optymalizacjami i odpalam.
    > Dla rozmiarów N = 2000 i M = 300 mam takie czasy:
    > CPP time = 4,5s
    > PAS time = 8,2s

    To jest raczej przypadkowy wynik, nie przejmowalbym sie takim
    jednym pomiarem. Napisz 10 procedur, skompiluj roznymi
    kompilatorami, uruchom kazda na 3-4 komputerach i wtedy
    mozna pokusic sie o jakies wnioski.
    Pozdrawiam




  • 20. Data: 2011-02-02 20:58:03
    Temat: Re: Porównanie szybkości mnożenia macierzy w CPP i PASCAL
    Od: Grzegorz Krukowski <r...@o...pl>

    On Wed, 02 Feb 2011 21:50:58 +0100, Fil <f...@p...onet.pl>
    wrote:

    >W dniu 2011-02-02 21:03, Grzegorz Krukowski pisze:
    >> On Wed, 02 Feb 2011 20:56:18 +0100, Fil<f...@p...onet.pl>
    >> wrote:
    >>
    >>>> Jeżeli ci to jest na poważnie potrzebne zainteresuj sie tą pozycją:
    >>>> Podstawowe procedury numeryczne w języku Turbo Pascal - A. Marciniak,
    >>>> D. Gregulec, J. Kaczmarek
    >>>> Jest to krótki opis numeryki a'la Pascal oraz zestaw gotowych
    >>>> procedur. Tylko musisz mieć dołączoną do książki dyskietkę, bo książka
    >>>> jest po prawdzie podręcznikiem do procedur umieszczonych na dyskietce.
    >>>
    >>> Marciniak? Nie... wyrosłem już z tego. Ale kiedyś się przydała... Dzięki.
    >> Znaczy że Marciniak, czy te procedury nędzne są?
    >Nie... Może źle się wyraziłem. Książka jest bardzo fajna - dużo
    >ciekawych pomysłów w jednym miejscu. Kiedyś korzystałem z niej dużo.
    >Może brakuje porównania metod numerycznych względem siebie, np. pod
    >kątem szybkości działania. Marciniaka bardzo cenię. Po prostu teraz
    >jestem na etapie wymyślania jak napisać optymalny (szybki) kod,
    >jednocześnie używając ulubionych narzędzi (Builder do GUI z DevExpress i
    >TMS components), a nie zastanawiać się jak stworzyć procedurę numeryczną
    >przeliczającą coś tam. Wszystkie potrzebne procedurki już mam. :)

    Aha.

    >Muszę pomyśleć jak pożenić Visuala do obliczeń numerycznych i Buildera
    >do GUI...
    >
    >Jeszcze raz dziękuję.
    >Fil.
    To tak, z tego co mi widomo, jak trochę się bawiłem w te sprawy, to:

    * dla C/C++ najlepszym (b. dobrze optymalizującym) kompilatorem był
    ten produkcji Intela;
    * z części obliczeniowej zrób bibliotekę dll;
    * tej biblioteki możesz użyć w czymkolwiek, np. w Delphi.
    --
    Grzegorz Krukowski

strony : 1 . [ 2 ] . 3 ... 5


Szukaj w grupach

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: