C++ Programmperformance steigern - Speichernutzung, Multithreading

Blitzmerker schrieb:
Vektoren sind zwar nett, aber nicht immer sehr schnell.
Mit den char-Buffern hast du halt maximale Performance beim Zugrif

Was glaubst du, soll beim Zugriff auf std::vector mehr Performance kosten als bei Arrays??
 
Blitzmerker schrieb:
Die Überladung...
Oder woher kommt die Meldung mit den OutofRange wenn ich über die Größe hinaus zugreifen will.
Im Prinzip ist es genau gleich schnell. ( O(1) )
In der Implementierung dürfte es minimal langsamer sein.
Eine Lib hat halt immer ein Overhead, dafür aber Komfortfunktionen^^.


Die Indexüberprüfung hast du meines Wissen nur mit der at()-Methode. Nutzt du einfach den []-Operator, gibt es keine Checks. Beim Visual Studio sollte man im release-Build zusätzlich noch _SCL_SECURE auf 0 definieren, da Microsoft sonst selbst für release immer noch einen Haufen zusätzliches Debugzeugs drin hat, das Performance kostest.

Also, -D_SCL_SECURE=0, release-Build, und [] statt .at(), da solltest es eigentlich Null Overhead im Vergleich zu Arrays geben.
 
Zuletzt bearbeitet:
@Y0DA92:
Du wolltest Ideen haben und die gabs hier ;) Wir können es nicht für dich implementieren, das musst du schon selber machen.
Aber beantworte mir mal Folgendes und dann kann ich dir besser sagen wie dus umsetzen solltest:
- Wie oft läuft das Programm denn und gibt es ein Performanceziel (sag jetzt nicht: "so schnell wie möglich" denn es geht eigtl. fast immer irgendwie schneller)?
- Interessiert es denn, wo der entsprechende String steht und wie oft gleiche Teile vorkommen oder willst du einfach nur wissen, welche 4-bis 8-Byte-Strings in beiden Dateien vorkommen?
- Wortgrenzen sind dir egal? Also auch wenn z.B. "en a" in beiden Dateien vorkommt willst du das haben?
- Sind die genannten Grenzen (1MB und 100MB) oberstes Limit und wieviel RAM hat der Rechner?
 
Also ich habe bisher nicht die gesamte Diskussion verfolgt, möchte aber ein paar allgemeine Worte sagen: Es ist oftmals besser, anstatt sich in irgendwelchen Kleinigkeiten zu verstricken, sich zu überlegen, was die effizienteste Methode beim Programmdesign, und nicht nur bei der Implementierung ist.

Aber selbst bei relativ simplen Sachen, kann man oftmals viel optimieren, Beispiel for-Schleife:

For-Schleifen werden häufig benutzt, aber dennoch wird dabei oft viel Overhead produziert. Ein Beispiel:
Code:
for(std::list<myclass>::iterator iter = lis.begin(); iter != lis.end(); iter++)
{
//...
}
Sieht zunächst wie eine gewöhnliche Schleife aus (und ist auch eine), dennoch verschenkt man hier grundlos Rechenleistung.
1. lis.end()
Bei jedem Schleifendurchlauf wird dies neu berechnet, obwohl sich der Wert nicht ändern wird (wenn er es täte und innerhalb der Schleife z. B. ein Objekt in den Vektor eingefügt würde, so bestünde die Möglichkeit, dass alle Iteratoren ungültig werden, und es dadurch zu einem Laufzeitfehler kommt).

2. iter++
Hier wird immer ein temporäres Objekt erzeugt, dass aber nie benutzt wird.
Ein Postinkrementoperator arbeitet in etwa so (Pseudo-Code):
Code:
old(obj);
++obj;
return old;
Der Compiler kann dies in diesem Fall sehr wahrscheinlich nicht optimieren. Dies wäre nur der Fall, wenn es sich a) um einen eingebauten oder Standard-Typ handelt. Es wäre auch noch möglich, wenn man beim Postinkrementoperator ähnlich wie oben den Preinkrementoperator benutzt und dies zusätzlich noch inline macht, allerdings ist diese Lösung a) aufwendig und b) implementationsabhäbhängig.

Hier die verbesserte Version:
Code:
std::list<myclass>::iterator end = lis.end();
for(std::list<myclass>::iterator iter = lis.begin(); iter != end; ++iter)
{
//...
}
 
@badday: Danke für das Beispiel, hat das mal sehr gut deutlich gemacht, wie man mit einfachen Änderungen ne For-Schleife verbessert!

Code:
@Y0DA92:
Du wolltest Ideen haben und die gabs hier  Wir können es nicht für dich implementieren, das musst du schon selber machen.
Aber beantworte mir mal Folgendes und dann kann ich dir besser sagen wie dus umsetzen solltest:
- Wie oft läuft das Programm denn und gibt es ein Performanceziel (sag jetzt nicht: "so schnell wie möglich" denn es geht eigtl. fast immer irgendwie schneller)?
- Interessiert es denn, wo der entsprechende String steht und wie oft gleiche Teile vorkommen oder willst du einfach nur wissen, welche 4-bis 8-Byte-Strings in beiden Dateien vorkommen?
- Wortgrenzen sind dir egal? Also auch wenn z.B. "en a" in beiden Dateien vorkommt willst du das haben?
- Sind die genannten Grenzen (1MB und 100MB) oberstes Limit und wieviel RAM hat der Rechner?

Das mit den Ideen stimmt zwar, jedoch ist es sehr schwer ganz neue und dazu relative komplexe Algorithmen so schnell nachzuvollziehen.

Antworten:
-Das Programm soll einmal laufen mit den ungefähren Größen 1MB und 100MB (vielleicht ein wenig mehr oder auch weniger) und sollte zwischen 10Min bis 1Std brauchen, dann wäre ich zufrieden, obwohl unter 10Min Top wäre!!
-Ich muss wissen wo das "Cluster" in beiden Datein vorkommt und wie groß es ist. Ab jetzt suche ich nicht mehr nur Strings, deswegen lesen ich es auch im "Byte-Modus" oder so ein.
- Damit entfällt diese Antwort. Ich suche gleiche Bytemuster
- Nicht umbedingt, vielleicht mehr. Ich habe 2GB und damit sollte man auch rechnen können.
 
Zurück
Oben