Quote:
Originally Posted by Waller66
3,12 mio :) und vielen vielen dank genau das beantwortet was ich wissen wollte, wie immer top :) Shadow992.op=true
aber eine frage habe ich noch, ist es redundant wenn man in funktionen immer variablen neu erzeugt oder sollten einmal fix global erzeugt werden, in dem bereich geschwindigkeit kenne ich mich überhaupt nicht aus :/ :D bislang hatte ich noch nicht so große projekte.
oder zb sowas :
double blub = numericUpDown1.value; // die variable ist doch schon durch die form drin , ist quasi nichts an speicher aber unnötig das dann noch in eine weitere variable zu schreiben oder ?
|
Das sind Mikro-Optimierungen, die dir praktisch jeder Compiler abnimmt. So viel wie ich mitbekommen habe macht dir GNU z.B. automatisch (ab o1 glaub ich sogar schon) aus dem:
Code:
for (int i=0;i<100;i++)
{
double d=0;
// mache was mit d
}
Das hier:
Code:
double d;
for (int i=0;i<100;i++)
{
d=0;
// mache was mit d
}
Also an solchen Sachen solltest du echt sparen. Schreib den Code so wie er für dich am verständlichsten ist und der Compiler wird dir jedemenge "verzeihen" und trotzdem das Schnellste draus machen.
Wenn es um Speed geht und man Algorithmen nicht verändern/beschleunigen kann, dann sollte man hauptsächlich nur in 3 Richtungen optimieren (wenn überhaupt...):
1. Einen eigenen Allokation-Helper machen, der new/delete ersetzt. Dieser Helper holt sich immer gleich einige MB an Speicher und zerteilt diesen Speicher dann bei jedem "new" in das entsprechende Objekt bzw. bei "delete" markiert es einen Bereich wieder als "verwendbar".
Dadurch spart man sich die endlosen Wege übers Betriebssystem (bei new/delete) und kann so schon deutlich Geschwindigkeit gut machen.
2. std::string durch char* ersetzen (das lohnt sich vor allem wenn man den String eh Zeichenweise durchgehen muss und kaum std::string-Methoden verwendet)
3. Cache-optimiert auf den Speicher zugreifen. Das heißt alle Werte, die nahe beieinander liegen(vor allem in großen Arrays) sollen auch nahe beieinander verwendet werden.
Gut:
Code:
char* str = new char[100001];
for(i = 0; i<100000; i++)
{
if (str[i] == 'A' && str[i+1]=='B')
{
// ...
}
}
Schlecht:
Code:
char* str = new char[100001];
for(i = 0; i<50000; i++)
{
if (str[i] == 'A' && str[i*2]=='B')
{
// ...
}
}
Die restlichen Optimierungen, die es noch so gibt, bringen nur selten genug SpeedUp als dass es sich lohnen würde, groß Zeit in das unleserlich machen von Code zuinvestieren.
Vorausgesetzt natürlich, dass man die " Standard-Optimierungen" wie Doppelte-Berechnungen, map statt vector (wenn man oft Werte suchen muss), usw. schon angewendet hat.
Edit:
Der Lese-Thread sollte entweder durchgehend auch lesen (dann braucht es aber eine Art von Synchronidation z.B. über Mutex oder ein entsprechendes "Finished"-Bit o.ä.) oder einmal komplett alles lesen wobei ich zu komplett lesen tendiere, denn 1,5GB sind extrem schnell in den RAM geladen. Ansonsten, wenn der Speicher wirklich knapp wird, kannst du es natürlich auch stückweise einlesen, wobei die Stücke dann schon ziemlich groß sein sollten.