Autor Beitrag
galagher
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2556
Erhaltene Danke: 45

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 478

Windows XP Home
Delphi 2005, RAD Studio 2007, MASM32, FASM, SharpDevelop 3.0
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2556
Erhaltene Danke: 45

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Fr 31.08.07 20:42 
user profile iconSilas 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Fr 31.08.07 20:45 
Moin!

Die beste Methode, ein Programm schneller zu machen, ist einfach immer noch: effizienter Code! :P

(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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2556
Erhaltene Danke: 45

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Fr 31.08.07 21:05 
user profile iconNarses hat folgendes geschrieben:
Moin!

Die beste Methode, ein Programm schneller zu machen, ist einfach immer noch: effizienter Code! :P

(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:
ausblenden 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 user profile iconalzaimar 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1654
Erhaltene Danke: 244

WIN10,PuppyLinux
FreePascal,Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8548
Erhaltene Danke: 477

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Fr 31.08.07 21:45 
user profile icongalagher hat folgendes geschrieben:
Wie sieht's aus denn mit:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2556
Erhaltene Danke: 45

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Fr 31.08.07 22:04 
user profile iconHorst_H hat folgendes geschrieben:
was sagt denn der TAskmanager über die CPU Zeiten in %.

Zwischen 89 und 97, so in etwa.

user profile iconHorst_H hat folgendes geschrieben:
Was bringt denn 1% bei 50 min, gerade mal 30 Sekunden.

Ist ein Argument, ja...

user profile iconBenBE 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.

user profile iconGausi 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



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8548
Erhaltene Danke: 477

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: Fr 31.08.07 22:24 
user profile icongalagher hat folgendes geschrieben:
Vielleicht gibt's aber was schnelleres als ProcessMessages.

Lager die Berechnung in einen Thread aus.

EDIT: gausi - bitte nicht so schnell :mrgreen:

_________________
"Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
Bernhard Geyer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 721
Erhaltene Danke: 3



BeitragVerfasst: 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Sa 01.09.07 00:33 
user profile iconBernhard Geyer hat folgendes geschrieben:
Ich empfehle Tools wie AQTime (www.automatedqa.com/...cts/aqtime/index.asp).
Wollte mir gerade die Trial-Version angucken und hab dann den Preis für die Vollversion gesehen. $600 :shock: Ich wollte nicht die ganze Firma kaufen ...

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Bernhard Geyer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 721
Erhaltene Danke: 3



BeitragVerfasst: Sa 01.09.07 08:40 
user profile iconChristian S. hat folgendes geschrieben:
user profile iconBernhard Geyer hat folgendes geschrieben:
Ich empfehle Tools wie AQTime (www.automatedqa.com/...cts/aqtime/index.asp).
Wollte mir gerade die Trial-Version angucken und hab dann den Preis für die Vollversion gesehen. $600 :shock: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2556
Erhaltene Danke: 45

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Sa 01.09.07 09:59 
user profile iconhathor 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.

user profile iconGausi 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Sa 01.09.07 10:27 
user profile icongalagher hat folgendes geschrieben:
ich denke, der Code ist optimal.

user profile icongalagher 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2556
Erhaltene Danke: 45

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Sa 01.09.07 10:50 
user profile icondelfiphan 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

user profile icondelfiphan hat folgendes geschrieben:
Vielleicht postest du mal ein wenig Code.

Hier ist er:
ausblenden volle Höhe Delphi-Quelltext
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);

    {Negative Zahlen bleiben sonst immer negativ}
    if (c[i] < 0and
       (Random(2) = 1then c[i] := Abs(c[i])
    else
    {Positive Zahlen bleiben sonst immer positiv}
    if (c[i] > 0and
       (Random(2) = 1then c[i] := -c[i];

    while c[i]>9999 do
      c[i] := c[i] - 1000;

    {Wenn die "Zufalls"zahl gleich dem alten Wert ist, nochmal}
    {eine "Zufalls"zahl ermitteln; hat ja sonst keinen Sinn}
    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;

    {Wenn iLevel=2, dann läuft es in noch akzeptabler}
    {Geschwindingkeit, ab 3 wird's langsam!}
    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  {Wenn ein Spiel gerade läuft}
   if AskEndCurrentGame then exit;

  {Einstellung, ob das aktuelle Level verwendet wird, s. in Unit3}
  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;

  {Anzeigen der aktuellen Koeffizienten}
  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
   {Abbrechen bei Erreichen der max. möglichen Anzahl an Durchgängen oder bei Spielende}
   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  {Wenn nach dem 500. Durchgang, bei dem gegen die Original-Koeffizienten}
        {gespielt wurde, feststeht, dass die geänderten Koeffizienten besser sind,}
     if mod500 then c2 := c1;     {dann diese übernehmen. Sonst werden immer diese}
                     {anstelle der geänderten übernommen! c1 wird innerhalb dieser}
                 {repeat-until - Schleife laufend aktualisiert, es werden also die}
                 {jeweils aktuellen Koeffizienten genommen. Ansonsten, wenn dieser}
            {Block nicht erreicht wird, werden die Originale in c00 verwendet - s.}
                       {im Anweisungsblock "if cnt mod 500 = 0 then" -> c2 := c00;}
     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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
    {Negative Zahlen bleiben sonst immer negativ}
    if (c[i] < 0and
       (Random(2) = 1then c[i] := Abs(c[i])
    else
    {Positive Zahlen bleiben sonst immer positiv}
    if (c[i] > 0and
       (Random(2) = 1then c[i] := -c[i];

das hier???
ausblenden Delphi-Quelltext
1:
2:
    //Vorzeichen drehen ...
    if (Random(2) = 1then c[i] := -c[i];

Ist schon mal eine Abfrage in jedem Durchlauf gespart.

Ferner fehlt hier die untere Grenze???
ausblenden Delphi-Quelltext
1:
2:
    while c[i]>9999 do
      c[i] := c[i] - 1000;

Geht so hier:
ausblenden 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!!!
ausblenden 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:
ausblenden 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.