![]() |
Programm bei laufender IDE schneller - Warum?
Hallo zusammen,
folgendes Phänomen: Ich habe ein Programm das einige Threads startet. Da die Threads permanent zyklisch laufen habe ich einen Durchlaufzähler sowie eine Funktion zur Berechnung der Zyklen pro Sekunde erstellt. Soweit so gut. Starte ich das Programm bei aktivierter IDE, so hat beispielsweise Thread A eine Geschwindigkeit von etwa 40 Zyklen pro Sekunde (mit Sleep künstich gebremst). Es spielt dabei keine Rolle, ob das Programm aus der IDE oder direkt die EXE gestartet wird. Irgendwie scheint die Thread permanent die Existenz der IDE abzufragen... Hat jemand ähnliche Phänomene festgestellt? Ich habe schon alle möglichen Einstellungen getestet... Ohne Erfolg. Ach ja, der Code, welcher in der Thread abgearbeitet wird mach eigentlich nur irgendwelche internen Zuweisungen und Berechnungen. Es wird keinerlei Hardware angesprochen oder auf sonstige RTL-Funktionen zugegriffe... Bin für jeden Tip dankbar :bounce2: Alex |
Re: Programm bei laufender IDE schneller - Warum?
Nochmal ich... Habe zum Test mal schnell ein kleines Programm "hingesaut". Solange die IDE auf dem Rechner läuft macht die Thread knapp 100 Zyklen / Sekunde. Ist die IDE nicht gestartet, so kommt die Thread gerade mal auf ca. 63 Zyklen / Sekunde.
Der Quellcode:
Code:
Und das Formular:
unit Main;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; type TForm1 = class(TForm) Timer1: TTimer; Label1: TLabel; lblCount: TLabel; Label3: TLabel; lblCountsPerSec: TLabel; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure Timer1Timer(Sender: TObject); private { Private-Deklarationen } OldCount: Integer; public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} type TTestThread = class(TThread) private procedure Execute; override; public Count: Integer; end; var TT: TTestThread; procedure TTestThread.Execute; begin while not Terminated do begin Sleep(10); Inc(Count); end; end; procedure TForm1.FormCreate(Sender: TObject); begin TT := TTestThread.Create(False); end; procedure TForm1.FormDestroy(Sender: TObject); begin TT.Terminate; TT.WaitFor; TT.Free; end; procedure TForm1.Timer1Timer(Sender: TObject); begin lblCount.Caption := IntToStr(TT.Count); lblCountsPerSec.Caption := IntToStr(TT.Count - OldCount); OldCount := TT.Count; end; end.
Code:
Ich bin ratlos...
object Form1: TForm1
Left = 0 Top = 0 Caption = 'Form1' ClientHeight = 148 ClientWidth = 376 Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'Tahoma' Font.Style = [] OldCreateOrder = False OnCreate = FormCreate OnDestroy = FormDestroy PixelsPerInch = 96 TextHeight = 13 object Label1: TLabel Left = 24 Top = 24 Width = 43 Height = 13 Caption = 'Counter:' end object lblCount: TLabel Left = 112 Top = 24 Width = 39 Height = 13 Caption = 'lblCount' end object Label3: TLabel Left = 24 Top = 48 Width = 77 Height = 13 Caption = 'Counts/Second:' end object lblCountsPerSec: TLabel Left = 112 Top = 48 Width = 77 Height = 13 Caption = 'lblCountsPerSec' end object Timer1: TTimer OnTimer = Timer1Timer Left = 276 Top = 92 end end Hat wer 'ne Idee??? Alex |
Re: Programm bei laufender IDE schneller - Warum?
Ich habe das Problem nicht. Beide Versionen kommen bei mir auf 93/sec
|
Re: Programm bei laufender IDE schneller - Warum?
Du hast Windows, das ist der Grund. Windows ist kein Echtzeitbetriebssystem und niemand bei MS garantiert dir das der Scheduler von Windows dir bei einem vorhandenen 10 ms Sleep eines Threads der Thread trotzdem 100 mal dran kommt. Wenn bei dir so große unterschiede vorhanden sind würde ich mal die Liste der permanent laufenden Prozesse untersuchen. Virenscanner sind teilweise schlecht programmiert so das sie komischte Effekte produzieren.
|
Re: Programm bei laufender IDE schneller - Warum?
Ich habe das Ganze jetzt auf verschiedenen Maschinen ausprobiert. Auf VISTA-Rechnern habe ich immer exakt 100,0 Zyklen pro Sekunde. Auf meinem Notobook mit Windows XP zeigt sich der oben beschrieben Effekt.
Das mit dem Viren Scanner und sonstigen Background Tasks schließe ich aus, da diese ja nach dem Start der IDE auch am laufen sind. Mit IDE sollte ja die Leistung eher schlechter werden... ??? Gruß Alex |
Re: Programm bei laufender IDE schneller - Warum?
Hallo,
besitzt Du einen Mehrkern-Prozessor? Dann kann es sein, dass Windows durch die Zusatzbelsatung die Tasks nicht zwischen den Kernen verschiebt, sondern alles auf seinem Kern lässt. Das kann Dein Programm durchaus beschleunigen. Gruß xaromz |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:06 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz