![]() |
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: Soll laut Stroustrup ein hochoptimierter (aber dafür weniger komfortabler) Container speziell für numerische Aufgaben sein. Zitat: Hast ja recht. ![]() -- 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: Und zu valarray: Zitat: 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: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-2025 by amiga-news.de - alle Rechte vorbehalten. |
![]() |