Wieviel klassen haben große Projekte?
-
So! jetzt bin ich vorerst wieder nicht mehr überzeugt. Code :
#include <iostream> #include <stdlib.h> #include <ctime> class TestClass { private : int a; int b; public : TestClass() :a(5),b(0) { } void doSomething () { b+=a; } int getResult () const { return b; } }; int doSomething () { return 5; } int main(int argc, char *argv[]) { const int end = 50000; int b=0; int i,j; int a = 5; time_t time; TestClass testClass = TestClass(); time = clock(); for (i = 0 ; i < end ; ++i) { for (j = 0 ; j < end ; ++j) { testClass.doSomething(); } } b=testClass.getResult(); std::cout << clock() - time << "ms" << std::endl; std::cout << b << std::endl; b=0; time = clock(); for (i = 0 ; i < end ; ++i) { for (j = 0 ; j < end ; ++j) { b+=doSomething(); } } std::cout << clock() - time << "ms" << std::endl; std::cout << b << std::endl; b=0; time = clock(); for (i = 0 ; i < end ; ++i) { for (j = 0 ; j < end ; ++j) { b+=a; } } std::cout << clock() - time << "ms" << std::endl; std::cout << b << std::endl; system("PAUSE"); return 0; }
Mit dem Objekt dauert es bei mir fast 10 mal so lange.
[ Dieser Beitrag wurde am 29.11.2002 um 00:23 Uhr von Gregor editiert. ]
-
feigling
was stand da gerade? *wissen will*
-
Original erstellt von <...>:
feigling
was stand da gerade? *wissen will*Jetzt steht was ähnliches da. Vorhin hatte ich nen kleinen Fehler drin, bzw. es hat an was anderem gelegen. ...jetzt wahrscheinlich auch : Durch das Objekt kann eine bestimmte Sache nicht mehr optimiert werden. ...ihr kommt schon drauf, was es ist.
-
Ich denke mal OOP ansich ist keine Bremse, aber man ist als OOP-Programmierer glaub ich ein bisschen großzügiger und baut in seine Klasse noch ein bisschen Extrazeugs rein, so dass das Programm geringfügig (eigentlich nicht merkbar) langsamer wird.
-
Original erstellt von <OOPler>:
Ich denke mal OOP ansich ist keine Bremse, aber man ist als OOP-Programmierer glaub ich ein bisschen großzügiger und baut in seine Klasse noch ein bisschen Extrazeugs rein, so dass das Programm geringfügig (eigentlich nicht merkbar) langsamer wird.Du merkst nen Faktor 10 bei der Geschwindigkeit nicht?!
Sicher : Das ist ein extremes Beispiel. Aber wenn man Pech hat, dann baut man sich sowas in irgendeiner Form in einen Programmteil ein, der schnell sein muss.
-
LOL, Gregor, ich hab deinen Code weder ausprobiert noch angeschaut. Wie kannst du mir sowas unterstellen? :p
-
Original erstellt von <OOPler>:
LOL, Gregor, ich hab deinen Code weder ausprobiert noch angeschaut. Wie kannst du mir sowas unterstellen? :pErst soll ich Code schreiben und dann liest ihn keiner und sagt mir, wo ich die fiese Bremse eingebaut habe! ...Naja! Wenigstens weiß ich, was bremst! Aber ich sag es euch mal nicht! :p
-
teste mal hier mit
class TestClass { private : int b; public : TestClass() :b(0) { } void doSomething () { b += 5; } int getResult () const { return b; } };
außerdem
int main(int argc, char *argv[]) { const int end = 50000; int b=0; int i,j; int a = 5; time_t time; TestClass testClass = TestClass(); time = clock();
http://fara.cs.uni-potsdam.de/~kaufmann/?page=GenCppFaqs&faq=Init#Answ
und vermeide Standard Ctor aufrufeund noch was, wie komms du nur! die Ausgabe mit zu messen?
[ Dieser Beitrag wurde am 29.11.2002 um 01:13 Uhr von Dimah editiert. ]
-
Da kommt schon gleich jemand der sich das ganze mal anschaut. Nur Geduld. Ich hab heute einfach keine Lust zu raten :p
-
Original erstellt von Dimah:
**und noch was, wie komms du nur! die Ausgabe mit zu messen?**
ups, sorry verkuckt
-
mach mal auß
b=testClass.getResult(); std::cout << clock() - time << "ms" << std::endl; std::cout << b << std::endl;
ein
std::cout << clock() - time << "ms" << std::endl; std::cout << testClass.getResult() << std::endl;
nicht das es viel speed bringen würde, aber sind sie gleicher
[ Dieser Beitrag wurde am 29.11.2002 um 01:19 Uhr von Dimah editiert. ]
-
OK! Du hast das a entdeckt! ...viel zu schnell!
...aber hier sieht es genau gleich aus und da kann man das a nicht so leicht löschen :
#include <iostream> #include <stdlib.h> #include <ctime> class TestClass { private : int a; int b; public : TestClass() :a(1),b(0) { } void doSomething () { a <<= 1; a += 1; b+=a; } int getResult () const { return b; } }; int main(int argc, char *argv[]) { const int end = 35000; int b=0; int i,j; int a = 1; time_t time; TestClass testClass; time = clock(); for (i = 0 ; i < end ; ++i) { for (j = 0 ; j < end ; ++j) { testClass.doSomething(); } } std::cout << clock() - time << "ms" << std::endl; std::cout << testClass.getResult() << std::endl; time = clock(); for (i = 0 ; i < end ; ++i) { for (j = 0 ; j < end ; ++j) { a <<= 1; a += 1; b+=a; } } std::cout << clock() - time << "ms" << std::endl; std::cout << b << std::endl; system("PAUSE"); return 0; }
Naja! Faktor 3 noch!
[ Dieser Beitrag wurde am 29.11.2002 um 01:29 Uhr von Gregor editiert. ]
-
Naja! Faktor 3 noch!
[/QB]mit msvc 6.0 autorenedition (sie optimiert nicht) kann ich das ergebnis nicht nach vollziehen
-
Original erstellt von Dimah:
**
mit msvc 6.0 autorenedition (sie optimiert nicht) kann ich das ergebnis nicht nach vollziehen**Ich habe g++ (aus MinGW) mit der höchsten Optimierungsstufe genutzt.
[ Dieser Beitrag wurde am 29.11.2002 um 01:45 Uhr von Gregor editiert. ]
-
sie?
-
Original erstellt von <LOL>:
sie?die autorenedition
Original erstellt von Gregor:
[quote]Original erstellt von Dimah:
[qb]
mit msvc 6.0 autorenedition (sie optimiert nicht) kann ich das ergebnis nicht nach vollziehenIch habe g++ (aus MinGW) mit der höchsten Optimierungsstufe genutzt.
[/QB][/QUOTE]
wie schlate ich sie ein
-
g++ -o Programm.exe Programm.cpp -O3
EDIT : Genauer gesagt hat meine IDE folgendes gemacht :
g++.exe -c main.cpp -o main.o -I"C:/Dev-Cpp/include" -I"C:/Dev-Cpp/include" -I"C:/Dev-Cpp/include/c++" -s -O3
g++.exe main.o -o "TestOOPSpeed.exe" -L"C:/Dev-Cpp/lib" -L"C:/qt/lib" -I"C:/Dev-Cpp/include" -I"C:/Dev-Cpp/include" -I"C:/Dev-Cpp/include/c++" -s -O3[ Dieser Beitrag wurde am 29.11.2002 um 02:00 Uhr von Gregor editiert. ]
-
dann müsste es aber "es" heissen.
-
Original erstellt von Gregor:
Naja! Faktor 3 noch!ok, ich mess den selben code mal...
6649ms
-1225000004
10305ms
-1225000004
Klasse ist schneller!jetzt mach ich ein paar variablen lokaler und ändere sonst nix:
#include <iostream> #include <stdlib.h> #include <ctime> #define for if(false);else for//msvc bugfix class TestClass { private : int a; int b; public : TestClass() :a(1),b(0) { } void doSomething () { a <<= 1; a += 1; b+=a; } int getResult () const { return b; } }; int main(int argc, char *argv[]) { const int end = 35000; { time_t time = clock(); TestClass testClass; for (int i = 0 ; i < end ; ++i) { for (int j = 0 ; j < end ; ++j) { testClass.doSomething(); } } std::cout << clock() - time << "ms" << std::endl; std::cout << testClass.getResult() << std::endl; } { time_t time = clock(); int b=0; int a = 1; for (int i = 0 ; i < end ; ++i) { for (int j = 0 ; j < end ; ++j) { a <<= 1; a += 1; b+=a; } } std::cout << clock() - time << "ms" << std::endl; std::cout << b << std::endl; } system("PAUSE"); return 0; }
10074ms
-1225000004
6680ms
-1225000004
Klasse ist lahmer.
oha!ich dreh die messung mal um:
int main(int argc, char *argv[]) { const int end = 35000; { time_t time = clock(); int b=0; int a = 1; for (int i = 0 ; i < end ; ++i) { for (int j = 0 ; j < end ; ++j) { a <<= 1; a += 1; b+=a; } } std::cout << clock() - time << "ms" << std::endl; std::cout << b << std::endl; } { time_t time = clock(); TestClass testClass; for (int i = 0 ; i < end ; ++i) { for (int j = 0 ; j < end ; ++j) { testClass.doSomething(); } } std::cout << clock() - time << "ms" << std::endl; std::cout << testClass.getResult() << std::endl; } system("PAUSE"); return 0; }
9974ms
-1225000004
9904ms
-1225000004
gleich schnell.rätsel über rätsel.
-
uih, jetzt kommts ganz fett:
erstmal den code nehmen, der noch das a mal drinhat und mal nicht:#include <iostream> #include <stdlib.h> #include <ctime> class TestClass { private : int a; int b; public : TestClass() :a(5),b(0) { } void doSomething () { b+=a; } int getResult () const { return b; } }; int doSomething () { return 5; } int main(int argc, char *argv[]) { const int end = 50000; int b=0; int i,j; int a = 5; time_t time; TestClass testClass = TestClass(); time = clock(); for (i = 0 ; i < end ; ++i) { for (j = 0 ; j < end ; ++j) { testClass.doSomething(); } } b=testClass.getResult(); std::cout << clock() - time << "ms" << std::endl; std::cout << b << std::endl; b=0; time = clock(); for (i = 0 ; i < end ; ++i) { for (j = 0 ; j < end ; ++j) { b+=doSomething(); } } std::cout << clock() - time << "ms" << std::endl; std::cout << b << std::endl; b=0; time = clock(); for (i = 0 ; i < end ; ++i) { for (j = 0 ; j < end ; ++j) { b+=a; } } std::cout << clock() - time << "ms" << std::endl; std::cout << b << std::endl; system("PAUSE"); return 0; }
messen:
13489ms
-384901888
0ms
-384901888
0ms
-384901888oha! die klassen-variante ist ERHEBLICH langsamer.
und jetzt eine klitzekleine änderung in der Klasse.
ich mache ausint a; int b;
lieber
int b; int a;
mit dem Wunsch: Das erste Attribut ist das schnellste, und auf b soll er rechnen, a wird er schon wegoptimieren können...
messen...
0ms
-384901888
0ms
-384901888
0ms
-384901888jo, der Trick hat ordentlich beschleunigt.