amiga-news ENGLISH VERSION
.
Links| Forum| Kommentare| News melden
.
Chat| Umfragen| Newsticker| Archiv
.

amiga-news.de Forum > Programmierung > STL: vector vs. valarray [ - Suche - Neue Beiträge - Registrieren - Login - ]

-1- [ - Beitrag schreiben - ]

25.01.2006, 12:04 Uhr

Mad_Dog
Posts: 1944
Nutzer
Laut Stroustrup soll ja der STL-Container valarray performanter wie vector sein... Das wollte ich mal ausprobieren und hab mir ein kleines Testprogramm gebastelt:

code:
#include <cstdlib>
#include <iostream>
#include <vector>
#include <valarray>

#include "Timer.h"

#define ELEMENTS 10000

using namespace std;

int main(int argc, char *argv[])
{
    Timer T1,T2;

    // Version 1:
    
    T1.Start();

    for (unsigned int i=0; i<5; i++)
    {
      valarray<double> va(ELEMENTS);
      
      for (unsigned int n=0;n<ELEMENTS;n++)
      {
         cout << va[n] << endl;
      }
    }
    
    T1.Stop();

    // Version 2:
    
    T2.Start();

    for (unsigned int i=0; i<5; i++)
    {
    
      vector<double> v;
      vector<double>::const_iterator p;
    
      for (unsigned int n=0;n<ELEMENTS;n++)
      {
         v.push_back(0.0);
      }
    
      for (p=v.begin();p!=v.end();p++)
      {
         cout << (*p) << endl;
      }    
    }
    
    T2.Stop();

    cout << "Version 1 benötigt " << T1.Difftime() << " Sekunden." << endl;
    cout << "Version 2 benötigt " << T2.Difftime() << " Sekunden." << endl;

    cin.get();

    return EXIT_SUCCESS;
}


Zum Messen der Zeit habe ich meine kleine Timer-Klasse benutzt:

code:
//  Timer.h
//  Eine Klasse zur Zeitmessung
//  Autor: Norman Walter

#ifndef TIMER_H
#define TIMER_H

#include <ctime>

class Timer
{
      // Attribute
      private:
              clock_t starttime;
              clock_t endtime;        

      public:

      // Konstruktor
      Timer(void)
      {
         starttime = 0;
         endtime   = 0;
      }
      
      // Destruktor
      ~Timer(void)
      {         
      }
      
      // Methoden
      
      // Zeitmessung starten
      void Timer::Start(void);
      
      // Zeitmessung stoppen
      void Timer::Stop(void);
      
      // Zeitmessung Zurücksetzen
      void Timer::Reset(void);
      
      // Die gemessene Zeit zurückgeben
      double Timer::Difftime(void);
      
};

#endif


code:
//  Timer.cpp
//  Eine Klasse zur Zeitmessung
//  Autor: Norman Walter

#ifndef TIMER_H
#include "Timer.h"
#endif

void Timer::Start(void)
{
   starttime = clock();
}
      
void Timer::Stop(void)
{
   endtime = clock();          
}
      
void Timer::Reset(void)
{
   starttime = 0;
   endtime   = 0;
}
      
double Timer::Difftime(void)
{
   return double(endtime-starttime)/CLOCKS_PER_SEC;
}


Mit g++ scheint aber valarray langsamer wie vector zu sein!
--

http://www.norman-interactive.com

[ - Antworten - Zitieren - Direktlink - ]

25.01.2006, 13:03 Uhr

Holger
Posts: 8116
Nutzer
valarray sagt mir momentan gar nichts. Aber was vector angeht: Du legst eine lineare liste linear im Speicher ab und iterierst linear über diese Liste mit direkten (ungeprüften Zugriffen).
Ich wüßte nicht, was daran noch schneller gehen soll. Warum benutzt Du eigentlich bei dem einen Test einen Iterator und bei dem anderen Offset-Zugriff? Sollte man für Geschwindigkeitsvergleiche nicht auch die gleichen Operationen durchführen?

mfg

PS: Schon vom neuen Syntax-Highlighting gehört? Statt [code] einfach [code language="C++"] schreiben...

--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

25.01.2006, 14:34 Uhr

Mad_Dog
Posts: 1944
Nutzer
Zitat:
Original von Holger:
valarray sagt mir momentan gar nichts.


Soll laut Stroustrup ein hochoptimierter (aber dafür weniger komfortabler) Container speziell für numerische Aufgaben sein.

Zitat:
Warum benutzt Du eigentlich bei dem einen Test einen Iterator und bei dem anderen Offset-Zugriff? Sollte man für Geschwindigkeitsvergleiche nicht auch die gleichen Operationen durchführen?

Hast ja recht. :) Trotzdem bleibt bei dem Test vector schneller.

--

http://www.norman-interactive.com

[ Dieser Beitrag wurde von Mad_Dog am 25.01.2006 um 14:34 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

25.01.2006, 15:44 Uhr

Solar
Posts: 3680
Nutzer
Zunächst einmal ist die Geschwindigkeit abhängig von der Implementation Deiner C++-Library. Wenn der Autor an der einen Stelle gehunzt hat - oder sich beim vielbenutzten vector besonders viel Mühe bei der Optimierung gegeben hat - kann im Vergleich sonst etwas herauskommen, ganz egal, was Stroustrup schreiben mag.

Davon ab machen deine beiden Tests zwei ziemlich unterschiedliche Sachen. Das eine Mal rufst Du einen Konstruktor über ELEMENTS auf, das andere Mal schleifst Du über push_back(). Du könntest damit anfangen, für beide den (vorhanden) Konstruktor ( count, value ) zu verwenden. Ein schlauer Optimizer verbindet nämlich Deine beiden Schleifen zu einer.

Dann nimmst Du operator[] für valarray, das andere Mal *const_iterator für vector.

Dann hast Du in einer eigentlich für's Profiling gedachten Funktion cout drin - was Deine Meßergebnisse eh über den Haufen werfen dürfte.

AmigaOS' [tt]clock()[/tt] kenne ich nicht, befürchte aber, das es Realzeit mißt, nicht im entsprechenden Thread verbrachte Zeit - d.h. andere auf dem System laufende Tasks haben evtl. erheblichen Einfluß auf Deinen Test.

Davon ab glaube ich, das Stroustrup sich da ein bißchen vertan hat. Dinkumware schreibt zu vector:

Zitat:
The template class describes an object that controls a varying-length sequence of elements of type Ty. The sequence is stored as an array of Ty.

Und zu valarray:

Zitat:
The template class describes an object that controls a varying-length sequence of elements of type Ty. The sequence is stored as an array of Ty. It differs from template class vector in two important ways:


  • It defines numerous arithmetic operations between corresponding elements of valarray<Ty> objects of the same type and length, such as xarr = cos(yarr) + sin(zarr).
  • It defines a variety of interesting ways to subscript a valarray<Ty> object, by overloading operator[].


Sprich, für die Zwecke Deines "Benchmarks" dürften sich die beiden eigentlich gar nicht unterscheiden...

[ Dieser Beitrag wurde von Solar am 25.01.2006 um 15:45 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

25.01.2006, 16:27 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von Solar:
AmigaOS' clock() kenne ich nicht, befürchte aber, das es Realzeit mißt, nicht im entsprechenden Thread verbrachte Zeit - d.h. andere auf dem System laufende Tasks haben evtl. erheblichen Einfluß auf Deinen Test.

Mit Sicherheit. Eine per-Task clock gibt es im AmigaOS nicht. Man könnte so eine zwar implementieren, ich glaube aber nicht, daß sich so etwas in der beim gcc mitgelieferten standard-lib finden wird...

mfg
--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

25.01.2006, 16:50 Uhr

Solar
Posts: 3680
Nutzer
Ahhh... Blindfisch ich. Ich sah nur "Timer.h" und hielt's für eine AmigaOS-Funktion. Das clock() ist aus ctime... dann stimmt meine Vermutung ja: für Benchmarking in einem Multitasking-System denkbar ungeeignet.

[ Dieser Beitrag wurde von Solar am 25.01.2006 um 16:50 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]


-1- [ - Beitrag schreiben - ]


amiga-news.de Forum > Programmierung > STL: vector vs. valarray [ - Suche - Neue Beiträge - Registrieren - Login - ]


.
Impressum | Datenschutzerklärung | Netiquette | Werbung | Kontakt
Copyright © 1998-2024 by amiga-news.de - alle Rechte vorbehalten.
.