Autor |
Beitrag |
galagher
      
Beiträge: 2556
Erhaltene Danke: 45
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Fr 31.08.07 20:00
Hallo!
Kann man Programmcode schneller machen, inden man ihm (oder dem gesamten Programm) mehr "CPU-Priorität" gibt? Und Windows das Programm / die Prozedur / die Funktion dann schneller ausführt?
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
Silas
      
Beiträge: 478
Windows XP Home
Delphi 2005, RAD Studio 2007, MASM32, FASM, SharpDevelop 3.0
|
Verfasst: Fr 31.08.07 20:16
Jop, das geht, und zwar mit dem Task-Manager. Prozesse -> Rechtsklick auf dein Programm (es gibt da auch eine API-Funktion, den Namen weiß ich grad net).
Grundsätzlich ist das aber keine so gute Idee, wenn du viele Berechnungen machen musst, würd ich dir eher Assembler empfehlen.
_________________ Religionskriege sind nur Streitigkeiten darüber, wer den cooleren imaginären Freund hat
|
|
galagher 
      
Beiträge: 2556
Erhaltene Danke: 45
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Fr 31.08.07 20:42
Silas hat folgendes geschrieben: | (es gibt da auch eine API-Funktion, den Namen weiß ich grad net). |
Ich suche eine Funktion, die ich in mein Programm einbauen kann. Es soll dann nur unter bestimmten Umständen eine höhere Priorität haben, der User bestimmt dann, ob oder ob nicht.
Assembler - wer's kann... Nein, es ist Delphi-Code und das soll auch so bleiben!
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Fr 31.08.07 20:45
Moin!
Die beste Methode, ein Programm schneller zu machen, ist einfach immer noch: effizienter Code!
(du kannst noch so viele Spoiler an deinen Code schrauben, wenn der nicht leistungsfähig ist, wird er auch mit mehr CPU-Zeit nicht besser...)
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
galagher 
      
Beiträge: 2556
Erhaltene Danke: 45
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Fr 31.08.07 21:05
Narses hat folgendes geschrieben: | Moin!
Die beste Methode, ein Programm schneller zu machen, ist einfach immer noch: effizienter Code!
(du kannst noch so viele Spoiler an deinen Code schrauben, wenn der nicht leistungsfähig ist, wird er auch mit mehr CPU-Zeit nicht besser...)
cu
Narses |
Na schön, ich denke, der Code ist optimal. Kann man aber nicht noch auf Systemebene, auch auf Kosten anderen laufender Programme, noch was rausholen?
Wie sieht's aus denn mit:
Delphi-Quelltext 1:
| SetPriorityClass(Application.Handle, REALTIME_PRIORITY_CLASS); |
Bringt das etwas?
Das Problem ist, der Code wird Stunden oder Tage brauchen - es ist die selbstlernende KI, die alzaimar für mein Bauernspiel programmiert hat. Die braucht im höchsten Level mit höchster Rechentiefe pro Zug schon mal 50 Minuten oder mehr, und da will ich alles rausholen, was geht!
Und ich versuche nun, das Programm ein wenig zu verbessern.
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
Horst_H
      
Beiträge: 1654
Erhaltene Danke: 244
WIN10,PuppyLinux
FreePascal,Lazarus
|
Verfasst: Fr 31.08.07 21:30
Hallo,
was sagt denn der TAskmanager über die CPU Zeiten in %.
Wenn meine Delphi Programme viel zu rechnen haben, dann sind diese bei 98% CPU-Zeit und mehr, da ich nebenher auch nichts anderes rechnen lasse.
Was bringt denn 1% bei 50 min, gerade mal 30 Sekunden.
Das lohnt nicht den Aufwand für diesen Effekt, der andere Anwendungen auch extrem schlechter ansprechen lässt.
Gruß Horst
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Fr 31.08.07 21:44
Je nach Rechner lassen sich damit schon einige Sekunden erzielen ...
Auf meinem System hab ich eine Webanwendung (komplett mit Apache und PHP) am Laufen. Diese brauch auf Normal-Prio 48%, auf High-Prio 50%  Die Arbeitszeiten sind 26s vs. 22s.
Aber wie gesagt: Wo man optimieren kann hängt hauptsächlich vom Source ab. Kannst ja gern mal deine Aufwändigsten Routinen zeigen (auch ohne ASM lässt sich noch sehr viel erreichen) (ich erinner nur an die Primzahl-Ermittlungsschlacht hier in der Sparte).
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
Gausi
      
Beiträge: 8548
Erhaltene Danke: 477
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Fr 31.08.07 21:45
galagher hat folgendes geschrieben: | Wie sieht's aus denn mit:
Delphi-Quelltext 1:
| SetPriorityClass(Application.Handle, REALTIME_PRIORITY_CLASS); |
Bringt das etwas? |
Ja, das bringt was. Dein System reagiert zum Beispiel nicht mehr vernünftig auf Nutzereingaben.
Prinzipiell sollte man nicht an den Prioritäten rumspielen. Bei einigen wenigen Anwendungen macht das Sinn, die Priorität hochzusetzen. Aber das nur deswegen zu tun, damit das eigene Programm etwas schneller fertig ist, ist definitiv der falsche Weg.
Einige Autos fahren ja auch mit Blaulicht und Martinshorn durch die Gegend, und das ist sinnvoll so. Aber wenn das jeder machen würde, um schneller zur Arbeit zu kommen, bricht das System zusammen.
_________________ We are, we were and will not be.
|
|
galagher 
      
Beiträge: 2556
Erhaltene Danke: 45
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Fr 31.08.07 22:04
Horst_H hat folgendes geschrieben: | was sagt denn der TAskmanager über die CPU Zeiten in %. |
Zwischen 89 und 97, so in etwa.
Horst_H hat folgendes geschrieben: | Was bringt denn 1% bei 50 min, gerade mal 30 Sekunden. |
Ist ein Argument, ja...
BenBE hat folgendes geschrieben: | Kannst ja gern mal deine Aufwändigsten Routinen zeigen (auch ohne ASM lässt sich noch sehr viel erreichen) (ich erinner nur an die Primzahl-Ermittlungsschlacht hier in der Sparte). |
Mal sehen, ich denke, dass Application.ProcessMessages das Programm schon bremst, aber ohne liesse sich das Berechnen der Züge nicht beenden, das Programm scheint zu "hängen" - das kennt sicher jeder hier. Vielleicht gibt's aber was schnelleres als ProcessMessages.
Gausi hat folgendes geschrieben: | Einige Autos fahren ja auch mit Blaulicht und Martinshorn durch die Gegend, und das ist sinnvoll so. Aber wenn das jeder machen würde, um schneller zur Arbeit zu kommen, bricht das System zusammen. |
Tja, das Programm wäre dann eben nur zeitweilig, wenn es lernt, mit Blaulicht unterwegs. Aber es muss schon merklich etwas nützen, ich meine, ob es nun 5 Stunden und 40 Minuten oder 5 Sunden und 35 Minuten rechnet, ist mir letzlich egal.
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
hathor
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Fr 31.08.07 22:09
Was hast Du für eine Grafikkarte?
Für manche gibt es Programme, um die GPU für bestimmte Funktionen zu nutzen.
|
|
Gausi
      
Beiträge: 8548
Erhaltene Danke: 477
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Fr 31.08.07 22:21
Na, dann hau das APM einfach raus und pack die Berechnung in einen eigenen Thread. Das dürfte wesentlich mehr bringen, als die Priorität hochzuschrauben.
_________________ We are, we were and will not be.
|
|
GTA-Place
      

Beiträge: 5248
Erhaltene Danke: 2
WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
|
Verfasst: Fr 31.08.07 22:24
galagher hat folgendes geschrieben: | Vielleicht gibt's aber was schnelleres als ProcessMessages. |
Lager die Berechnung in einen Thread aus.
EDIT: gausi - bitte nicht so schnell 
_________________ "Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
|
|
Bernhard Geyer
      
Beiträge: 721
Erhaltene Danke: 3
|
Verfasst: Fr 31.08.07 23:21
Ich empfehle Tools wie AQTime ( www.automatedqa.com/...cts/aqtime/index.asp).
Damit habe ich in den letzten Tagen ein Funktionalität locker mal auf das 5-10fach beschleunigt (Bisher war die Funktion nicht zeitkritisch).
Im meinem Fall hat folgendes was gebracht:
- Zusätzliche Cache-Felder die Zwischenergebnis auch über mehrer Funktionsaufrufe gespeichert hatten
- Lokale Funktion ohne Parameter statt Methoden/Funktionsaufruf mit mehreren Parametern.
In anderen Fällen waren folgende Bremsen vorhanden
- Zu häufige aktualisierung der GUI
- Verwendung von ineffizienten Strukturen (Stringlist statt BTree)
- Fehlende const-Parameter
- Abbruchkritieren wurden vergessen.
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Sa 01.09.07 00:33
Wollte mir gerade die Trial-Version angucken und hab dann den Preis für die Vollversion gesehen. $600  Ich wollte nicht die ganze Firma kaufen ...
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
Bernhard Geyer
      
Beiträge: 721
Erhaltene Danke: 3
|
Verfasst: Sa 01.09.07 08:40
Christian S. hat folgendes geschrieben: | Wollte mir gerade die Trial-Version angucken und hab dann den Preis für die Vollversion gesehen. $600 Ich wollte nicht die ganze Firma kaufen ... |
Für Privatanwender ist das schon happig. Bei uns in der Firma sind die Einsparungen um Welten größer (ok, hier ist es vor allem der Kundenfrust wenn das Programm irgendwo zu langsam wäre).
|
|
galagher 
      
Beiträge: 2556
Erhaltene Danke: 45
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Sa 01.09.07 09:59
hathor hat folgendes geschrieben: | Was hast Du für eine Grafikkarte? |
OnBoard, spielt aber keine Rolle, da das Programm die Züge, die es "lernt", nicht anzeigt.
Gausi hat folgendes geschrieben: | Na, dann hau das APM einfach raus und pack die Berechnung in einen eigenen Thread. |
Muss ich mich erst einarbeiten, wüsste nicht, was ich da ändern muss!
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
delfiphan
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: Sa 01.09.07 10:27
galagher hat folgendes geschrieben: | ich denke, der Code ist optimal. |
galagher hat folgendes geschrieben: | (...) pro Zug schon mal 50 Minuten oder mehr |
Häufig kann man eine 50-Minütige Berechnung auf 5 Minuten reduzieren. Du sprichst von Rekursionen. Hört sich für mich wie Brute-Force an. Hast du schon mal ein Spiel der Konkurrenz angeschaut? Dort wartest du wohl kaum so lange. AQTime kann dir bei der Auswahl des Algorithmus leider auch nicht helfen.
Vielleicht postest du mal ein wenig Code. Ansonsten empfehle ich dir, etwas in der Literatur über Lösungsstrategien über das Spiel und ähnliche Spiele zu stöbern. Es lohnt sich nicht, sich über etwas etwas den Kopf zu zerbrechen, wenn darüber geforscht wird/wurde.
|
|
galagher 
      
Beiträge: 2556
Erhaltene Danke: 45
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Sa 01.09.07 10:50
delfiphan hat folgendes geschrieben: | Häufig kann man eine 50-Minütige Berechnung auf 5 Minuten reduzieren. Du sprichst von Rekursionen. Hört sich für mich wie Brute-Force an. |
Naja, das Programm verändert per Random einen Koeffizienten und wenn feststeht, dass die neue Konstellation besser ist als die alte und die originale, dann werden die neuen Werte gespeichert und in Zukunft verwendet.
Ich gebe zu, dass ich bei alzaimar's Code selbst nur teilweise durchsteige, aber er ist gut und das Programm spielt sinnvoll! Das ganze spielt sich in einer repeat-until Schleife ab und wird entweder durch Benutzerabbruch oder durch das Erreichen der maximalen Anzahl an Durchgängen (=MAXINT) beendet.
www.delphi-forum.de/...ighlight=bauernspiel
delfiphan hat folgendes geschrieben: | Vielleicht postest du mal ein wenig Code. |
Hier ist er:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183: 184: 185: 186: 187: 188: 189: 190: 191: 192: 193: 194: 195: 196: 197: 198: 199: 200: 201: 202: 203: 204: 205: 206: 207: 208: 209: 210: 211: 212: 213: 214: 215: 216: 217: 218: 219: 220: 221: 222: 223: 224: 225: 226: 227: 228: 229: 230: 231: 232: 233: 234: 235: 236: 237: 238: 239: 240: 241: 242: 243: 244: 245: 246: 247: 248: 249: 250: 251: 252: 253: 254: 255: 256: 257: 258: 259: 260: 261: 262: 263: 264: 265: 266: 267: 268: 269: 270: 271: 272: 273: 274: 275: 276: 277: 278: 279: 280: 281: 282: 283: 284:
| procedure TForm1.IAeverButton2Click(Sender: TObject); Var c00, c0, C1, c2: tcoeffArray; iLevel, cnt, w1, w2, i, b: Integer; mod500: Boolean;
Procedure Mutant (Var c : TCoeffArray); Var i, v : Integer;
Begin i := Random(Length(c)); v := Abs(c[i]);
If v < 10 Then v := 100;
c[i] := c[i] + Random(v) - Random(v);
if (c[i] < 0) and (Random(2) = 1) then c[i] := Abs(c[i]) else if (c[i] > 0) and (Random(2) = 1) then c[i] := -c[i];
while c[i]>9999 do c[i] := c[i] - 1000;
if c[i] = StrToInt(TLabel(FindComponent('L'+IntToStr(i))).Caption) then begin Mutant(c); exit; end;
Shape1.SetBounds(TLabel(FindComponent('L'+IntToStr(i))).Left+1, TLabel(FindComponent('L'+IntToStr(i))).Top-2, Shape1.Width, Shape1.Height);
Label1.Caption := 'Teste '+IntToStr(i+1)+'. Koeffinient, Wert = '+IntToStr(c[i]); End;
Function xMakeMove(aPlayer, aOpponent: TPlayer; Const C: TCoeffArray): Boolean; Var m: TMove;
Begin Coeffs := C;
FindBestMove(iLevel, aPlayer, aOpponent, Board, M, False); If m.mPlayer = plEmpty Then Result := False Else Begin Result := True; MakeMove(Board, m); End; End;
Function Wins (a,b : TPlayer) : Boolean; Begin Result := Score(Board,a,b) >= sWinScore; End;
Procedure PlayGame(Const c1, c2: TCoeffArray; Var w1, w2: Integer); Var p: Integer;
Begin InitBoard(board); p := 0; Repeat If Not xMakeMove(plHuman, plComputer, C1) Then inc(p) Else Begin p := 0; If Wins(plHuman, plComputer) Then Begin inc(w1); Exit; End End; If Not xMakeMove(plComputer, plHuman, C2) Then inc(p) Else Begin p := 0; If Wins(plComputer, plHuman) Then Begin inc(w2); Exit; End End; If p > 1 Then Exit; Until false; End;
Begin if IAEverButton2.Tag = 1 then begin if RealTimePriority then SetPriorityClass(Windows.GetCurrentProcess, NORMAL_PRIORITY_CLASS);
SetApplicationTitle(''); Blinker.Tag := 0; Blinker.Enabled := False; IAeverButton2.Caption := 'L&ernen per Evolution!'; IAeverButton2.Tag := 0; Panel5.Show; Memo1.Show; IAeverButton1Click(Sender);
IAEverButton1.Enabled := True; IAEverButton4.Enabled := True; IAEverButton7.Enabled := True; IAEverButton8.Enabled := True; IAEverButton9.Enabled := True; IAEverButton10.Enabled := True; IAEverButton11.Enabled := True; IAEverButton15.Enabled := False; IAeverButton16.Enabled := True; IAeverButton18.Enabled := True; ColorTrackBar1.Enabled := True; CheckBox1.Font.Color := clWhite; CheckBox1.Enabled := True;
SpielEnde := True;
exit; end;
if RealTimePriority then begin SetPriorityClass(Windows.GetCurrentProcess, REALTIME_PRIORITY_CLASS); Label2.Font.Color := clRed; end else Label2.Font.Color := clWhite;
if IAeverButton3.Enabled then if AskEndCurrentGame then exit;
if UseCurrentLevel then iLevel := Level else iLevel := 1;
CheckBox1.Checked := False; IAeverButton1Click(Sender);
SpielEnde := False;
Label2.Caption := ''; Blinker.Tag := 2; Blinker.Enabled := True;
mod500 := False;
IAEverButton1.Enabled := False; IAEverButton3.Enabled := False; IAEverButton4.Enabled := False; IAEverButton7.Enabled := False; IAEverButton8.Enabled := False; IAEverButton9.Enabled := False; IAEverButton10.Enabled := False; IAEverButton11.Enabled := False; IAEverButton12.Enabled := False; IAeverButton16.Enabled := False; IAeverButton18.Enabled := False; ColorTrackBar1.Enabled := False; CheckBox1.Font.Color := clSilver; CheckBox1.Enabled := False; Label10.Caption := '';
IAeverButton2.Caption := 'Stop l&ernen'; IAeverButton2.Tag := 1; Image1.Enabled := False;
SetApplicationTitle('Lernen per Evolution');
cnt := 0; c00 := Coeffs; c0 := Coeffs;
if Zerovalues then for w1 := 0 to high (Coeffs) do coeffs[w1] := 0;
for b := 0 to High(Coeffs) do TLabel(FindComponent('L'+IntToStr(b))).Caption := IntToStr(coeffs[b]);
Panel5.Hide; Memo1.Hide;
ColorProgressBar1.Position := 0; ColorProgressBar2.Position := 0;
repeat if (cnt >= MaxInt) or (cnt >= EvolutionCount) or SpielEnde then begin IAeverButton2Click(Sender); break; end;
if ColorProgressBar2.Position = ColorProgressBar2.Max then ColorProgressBar2.Position := ColorProgressBar2.Min; if ColorProgressBar1.Position = ColorProgressBar1.Max then ColorProgressBar1.Position := ColorProgressBar1.Min;
c1 := Coeffs; c2 := c1; inc (cnt);
Label7.Caption := IntToStr(cnt)+'. Durchgang, Level '+IntToStr(iLevel);
if cnt mod 500 = 0 then begin mod500 := True; c2 := c00; Label5.Caption := 'Vergleiche mit Original-Koeffizienten'; Label1.Caption := ''; end else if cnt mod 50 = 0 then begin c2 := c0; c0 := coeffs; Label5.Caption := 'Vergleiche mit alten Koeffizienten'; Label1.Caption := ''; end else begin mutant (c2); Label5.Caption := ''; end;
w1 := 0; w2 := 0; for i := 1 to 50 do begin PlayGame(c1, c2, w1, w2); PlayGame(c2, c1, w2, w1); end;
if (w2+1)/(w1+1) > 1.3 Then begin if mod500 then c2 := c1; BetterCoeffs := True; Label6.Caption := 'Neue verbesserte Koeffizienten'; Label10.Caption := Format('Siege alt = %d, neu = %d', [w1,w2]); coeffs := c2;
for b := 0 to High(Coeffs) do begin TLabel(FindComponent('L'+IntToStr(b))).Caption := IntToStr(coeffs[b]); if not (TLabel(FindComponent('L'+IntToStr(b))).Caption = IntToStr(c00[b])) then TLabel(FindComponent('L'+IntToStr(b))).Font.Color := clLime else if (TLabel(FindComponent('L'+IntToStr(b))).Caption = IntToStr(c00[b])) then TLabel(FindComponent('L'+IntToStr(b))).Font.Color := clWhite; end; end else coeffs := c1;
mod500 := False;
if IAeverButton2.Tag = 0 then begin IAeverButton1Click(Sender); exit; end;
ColorProgressBar1.StepIt; ColorProgressBar2.StepIt;
until IAeverButton2.Tag = 0; end; |
... und jetzt sagt bitte keiner: "Auslagern/aufteilen/..." !
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
GTA-Place
      

Beiträge: 5248
Erhaltene Danke: 2
WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
|
Verfasst: Sa 01.09.07 11:43
Das mit FindComponent ist ganz ganz schlecht. Speicher die Werte in einer Variable, aber bitte nicht StrToInt(FindComponent()) verwenden. Das kostet enorm Zeit.
_________________ "Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Sa 01.09.07 11:51
Dein Source greift zu häufig auf die VCL in einer Hauptschleife zurück.
Ferner solltest Du vermeiden, Progressbars in jedem Schleifendurchlauf neu zu setzen, da dann ein Neuzeichnen dieser erzwungen wird, was unnötig Zeit frisst.
Bau deinen Source mal so um, dass z.B. nur noch alle 1000 Durchläufe (hier fragt man am Besten auf If Count and $3FF = 0 Then ab) die Progressbars neuzeichnet. Ähnliches gilt für die anderen VCL-Zugriffe. Alles, was über die VCL geleitet wird (und sei's das Setzen einer Caption) verschwendet Zeit.
Ferner:
Warum nicht einfach anstatt:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| if (c[i] < 0) and (Random(2) = 1) then c[i] := Abs(c[i]) else if (c[i] > 0) and (Random(2) = 1) then c[i] := -c[i]; |
das hier???
Delphi-Quelltext 1: 2:
| if (Random(2) = 1) then c[i] := -c[i]; |
Ist schon mal eine Abfrage in jedem Durchlauf gespart.
Ferner fehlt hier die untere Grenze???
Delphi-Quelltext 1: 2:
| while c[i]>9999 do c[i] := c[i] - 1000; |
Geht so hier:
Delphi-Quelltext 1: 2: 3: 4:
| if c[i]>9999 then c[i] := 9000 + c[i] mod 1000 else if c[i]<-9999 then c[i] := -9000 + c[i] mod 1000; |
VCL in nem zeitkritischen Abschnitt, speziell FindComponent geht mal gar nicht!!!
Delphi-Quelltext 1:
| if c[i] = StrToInt(TLabel(FindComponent('L'+IntToStr(i))).Caption) then |
Mal abgesehen davon, dass hier jegliche Fehlerprüfung fehlt!
Das gleiche hier:
Delphi-Quelltext 1: 2: 3: 4:
| Shape1.SetBounds(TLabel(FindComponent('L'+IntToStr(i))).Left+1, TLabel(FindComponent('L'+IntToStr(i))).Top-2, Shape1.Width, Shape1.Height);
Label1.Caption := 'Teste '+IntToStr(i+1)+'. Koeffinient, Wert = '+IntToStr(c[i]); |
GUI-Interaktion ohne Ende ...
Das seh ich mal so auf'n ersten Blick; mal sehen, was die anderen noch finden.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
|