Mal was anderes: Performace!

Du bist neu in der Welt von C++? Dann schau hier herein!
Antworten
curator
Beiträge: 26
Registriert: 15. April 2007 21:34

Mal was anderes: Performace!

Beitrag von curator »

Hallo liebe Gemeinde,

ich weiss gerade nicht, ich welches forum dass passt, daher versuche ich es mal hier.

Im Raum steht ein relativ rechenaufwändiges Projekt mit eine sehr hohen Speichernutzung (mehr als 2GB, 64Bit Architektur)

Der erste Prototyp ist komplett mit normalen "float" und "int" Variablen gebaut, das übergeordnete GUI nutzt dann erst QT.

Nun meine Frage: Man könnte ja recht leicht (glaub ich :-) ) selbst die "tieferen Berechnungsklassen" auch in qt machen, will sahen nimm QInt und QFloat etc.

Wie sähe das mit der Performace aus? Meine Befürchtung wäre, dass das Programm langsamer wird, das QInt ja in irgendeiner Weise von int abgeleitet ist und daher komplizierter (Größer im Speicher?) ist.

Hat jemand damit Erfahrung mit so einem Vergleich? Wäre nett, sich mal darüber austauschen zu können.

Gruß,
curator

P.S. Das Projekt ist zu Groß, und es "mal so zum probieren" zu "konvertieren"

P.S.S. Gibt es cmath Funktionen wie sqrt(), pow() und sowas auch für Qt?
dazedly
Beiträge: 197
Registriert: 3. Oktober 2010 15:38
Kontaktdaten:

Beitrag von dazedly »

Mir ist weder ein QInt Noch ein QFloat bekannt Oo
brax
Beiträge: 208
Registriert: 11. Mai 2010 11:22

Beitrag von brax »

Solltest Du die Typen qint8/16/32/64 und qreal meinen, dann macht das überhaupt keinen Unterschied, da es sich dabei nur um typedefs handelt (guckst Du hier: http://doc.trolltech.com/4.6/qtglobal.h ... t8-typedef).

Ganz nebenbei: von primitiven Datentypen wie int oder double kann man nicht ableiten.
curator
Beiträge: 26
Registriert: 15. April 2007 21:34

Beitrag von curator »

Ja Sry, Ich meinte qint32 bzw. qint64 und qfloat32 sowie qfloat64.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Du kannst von int, float, etc. nicht ableiten, das sind keine Klassen sondern primitive Datentypen. Ableiten geht nur von Klassen.
Wie dazedly schon gesagt hat, gobt es auch keine Klassen "QInt" etc. Es gibt aber typedefs wie qint32 usw., die aber nicht optimieren, sondern garantieren dass ein Type auf allen Plattformen eine bestimmte Größe (in bit) hat.

Und Klassen beeinflussen die Performance nicht zwingend negativ, im Gegenteil gibt es sogar Fälle, in denen C++-OOP einem vergleichbaren C-Code überlegen ist (Performanceseitig, gibt darüber genügend Flamewars auf c-plusplus.de :P)).

Wenn du also merkst, dass dein Problem arge Performanceprobleme hat, musst du deine Algos optimieren.

/edit:
zu spät weil zu viel Text :/
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Re: Mal was anderes: Performace!

Beitrag von RHBaum »

ok, wie oben schon beschrieben, durch typedefs kriegst du keinen Performance-verlust, weder beim compilieren(naja oder vielleicht doch, weil vielleicht nen extra header hasst) , aber auf keinen Fall zur Laufzeit.

Trotz das es einfach klingt, iss das Thema ned ganz trivial.
Welche Datentypen Du verwendest, solltest du von anderen Dingen abhaengig machen, grad wenn Du auf Performance aus bist !

eigentlich hasst du mehrere Quellen, aus denen du Datentypen bekommst.

1. Compiler
meist gruslige Namen. Verwendet der Compiler intern.
sollte man selbst ned verwenden, obwohl technisch es gehen wuerde.

2. aus den Standard Headern.
Die DatenTypen die Dir der C/C++ Standard liefert.
Also datentypen wie int, short, char, float, double
Achtung, diese Teile werden optimiert.
z.b. ist int im Standard definiert, als der integer Datentyp, der mit denen das System als schnellstes Integer Operationen durchfuehren kann.
da der Standard aus der zeit der 16Bit Prozessoren kommt, ist int fast immer mindestens 16 bit gross ...
unter 32 bit systemen also immer 32 bit.
Nun die Kruecke ....
Moderne Intel-Kompatible Prozessoren, also die 64bit faehigen Teile, haben integer operationen fuer 32 und 64 bit (32 bit abwaertskompatiblitaet) also die koennen 32 bit operationen mit 32bit registern ausfuehren, ohne 64 bit Register und Maskierungen nutzen zu muessen.
Also, es ist nicht mehr definiert, ob eine 32bit integer oder 64bit integer operation schneller ist. Sie sind beide gleich schnell.
Dementsprechend gibt es auch 2 64bit Datentypmodelle ... einmal wird int auf 64 bit hochgezogen, und einmal nicht.
Aber es ist immer noch garantiert, das int die schnellste integer operation macht !

3. System header
Datentypen, die durch deine Plattform vorgeschrieben werden:
Posix und SystemV , sowie Windows Datentypen.
Hier ist das ziel nicht Performance, sondern Kompatiblitaet.
die datentypen lauten dementsprechend:
int32_t, uint32_t (Posix)
__int32, unsigned __int32 (WinAPI)
hier wird garantiert, das die Datentypen binaerkompatibel zueinander bleiben.
also sizeof(int32_t) == 4 wird immer gelten .. egal was für system drunter ist ... wichtig falls man binaerdaten dumpen muss etc, die ueber mehrere Architekturen, aber gleichen System ausgetauscht werden sollen.

4. 3.rd Party Datentypen.
z.b. die Qt-typen qint32 .... etc
oder gtk++ typen guint,gshort ... etc
Bibliotheken, die auf unterschiedlichen System laufen, wie windows/posix/symbian ... etc nehmen dir meist die Arbeit ab, einheitliche Datentypen zu bauen.
Das heisst, auf jedem system wo die Biblio laeuft, ist garantiert, das diese Datentypen existieren und binaerkompatibel sind.
Die sollte man natuerlich bevorzugen, wenn man daten austauscht zwischen Anwendungen, die beide die Bib verwenden und auf unterschiedlichen Plattformen laufen.

Fazit:
fuer interne berechnungen wo es auf performance ankommt, die Standard Typen nehmen.
int / float garantiert immer die max Performance.
qint32 z.b. garantiert es nicht (obwohl es momentan immer noch der Fall ist)
für binaeren Datenaustausch (binaer wird eh eher selten verwendet, meist nimmt man Text, und erspart sich ne menge aerger) dann die System- oder Bibliothek-spezifischen Datentypen

Ciao ...
Antworten