Rechnung dauert sehr lange
-
So nachdem ich ja mein Problem eingekreist habe,habe ich den Übeltäter gefunden.
Und zwar dauert bei mir,das hochzählen einer INT Variablen ewig.
Die Funktion wird nach ein Button Click aufgerufen.
und brauch bis es 20000000 gezählt hat mehrere Minuten(letzte Durchlauf waren es 7 Min) alles andere in der Schleife(Visualisierung,Funktionsaufrufe usw.) ist deaktiviert.
-
Was hast Du denn für einen Rechner IBM XT?!?
DWORD start = GetTickCount(); for (int i = 0; i < 20000000; i++) { } DWORD ende = GetTickCount(); RichEdit1->Lines->Add(AnsiString(ende - start)); start = GetTickCount(); int x = 0; while (x < 20000000) x++; ende = GetTickCount(); RichEdit1->Lines->Add(AnsiString(ende - start));Ausgabe im RichEdit;
40
50Auf meinem Rechner dauert das ca. 40 - 50 Millisekunden?!?
Zeig doch mal den Code...EDIT: Ist das nicht die gleiche Frage, wie bei deinem anderen Posting?? Zumindest läuft es darauf hinaus. Und solange Du nicht zeigst, was Du machst können wir Dir nicht helfen...
-
Ok dann helft ihr nicht. Ich werde da nochmal selbst rum fummeln.
Mein PC den ich zum proggen nehme,handelt es sich um ein AMD K6-2 450MHZ,196MB RAM,32MB NVIDIA und 20GBHDD.
-
Ich habe den Kram jetzt in einer for Schleife gepackt.
Und ich scheiter genauso.
Wieder die ewige Zeit.
-
Mal so ne Frage. Ist dein Code streng geheim oder was? Wie wärs wenn du den mal posten würdest, dann könnten wir dir evtl sagen woran's liegt!
-
Aber was kann denn da da der Auslöser sein,das der solange braucht?
ich teste es noch einmal indem ich die Zählerroutine in einer externe Funktione packe.
Weil ich fast soweit bin den ganzen Source Code in die Tonne zu kloppen.
Es kann doch nicht sein.
-
Ja WIE sollen wir Dir den helfen? Alles was Du an Information 'rüberbringst ist: Es dauert 7 Minuten bis 20000000 zu zählen! Wie Du machst, ist doch das Wichtige. Sollen wir raten, was Du machst?
Außerdem habe ich Dir doch hier schon 2 Beispiele genannt, die das Zählen deutlich schneller erledigen (auf meinem XP2400+). Aber selbst auf Deinem langsameren Rechner sollte es nicht 7 Minuten dauern. Aber ich hab' auf der Arbeit noch ein paar PII 266 MHz, 64 MB, da werde ich das auch mal testen.
Nochmal: solange Du Deinen Code nicht postest, kann man Dir nicht helfen. Wenn Dein Code natürlich ultrageheim ist...
-
#pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- int i,int_max; void __fastcall TForm1::Button1Click(TObject *Sender) { int_max=20000000; ProgressBar1->Max=int_max; for (i=1;i<=int_max;i++) ProgressBar1->Position=i; } //---------------------------------------------------------------------------Das habe ich eben schnell bestatelt.
So hier das gleiche Problem.Und vorgegangen bin ich so:
Neue Anwendung
1 Button
1 ProgressBarmehr nicht.
-
also das liegt an dem progressbar.
wenn man mal das bsp von Joe_M etwas ändert, siet man es deutlich, dass der progressbar ewig braucht:DWORD start = GetTickCount(); int x = 0; while (x < 200000) x++; // einfach nur x erhöhen DWORD ende = GetTickCount(); RichEdit1->Lines->Add(AnsiString(ende - start)); start = GetTickCount(); x = 0; while (x < 200000) ProgressBar1->Position = x++; // die position des progressbar erhöhen ende = GetTickCount(); RichEdit1->Lines->Add(AnsiString(ende - start));ich erhalte da ungefähr folgende werte:
0
422
-
ok, das sieht ja nun wirklich nicht wild aus. Ich werde das morgen so auf dem P2 laufen lassen.
Ist das ein Teil aus der Originalroutine? Ist dir klar, dass zwanzigmillionen Mal ProgressBar eine neue Position verarbeiten muß?
Ich mach' so was eher in der Art, da bleibt mehr CPU-Zeit für die eigentliche Arbeit:
int_max=20000000; int iPBarMax = int_max / 100; int iPBarCounter = 0; ProgressBar1->Max=100; ProgressBar1->Position = 0; for (i=1;i<=int_max;i++) { iPBarCounter++; if (iPBarCounter > iPBarMax) { ProgressBar1->Position++; iParCounter = 0; } } // oder aber auch (ohne weitere Variablen zu verwenden: if ((i % (int_max / 100)) == 0) ProgressBar->Position++;EDIT: Bäh, und dafür tipp ich mir hier die Finger wund, Nuclearspider war schneller...
-
So also ich habe das jetzt ohne ProgressBar gemacht und bekomme,bei meinen obigen Beispiel werte um 180.
Und jetzt meintest du das Joe_M das mein seekp noch ein Problem sein könnte.
Nun habe ich aber leider keine Idee wie ich sowas, anders lösen kann.
Und wenn ich wie du meintest alles in ein char array oder string lese,habe ich ja ein Problem, was ist wenn man mal ein 1 GB Datei durchsuchen will?