Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Die Delphi-IDE (https://www.delphipraxis.net/62-die-delphi-ide/)
-   -   Programm bei laufender IDE schneller - Warum? (https://www.delphipraxis.net/120180-programm-bei-laufender-ide-schneller-warum.html)

BigAl 6. Sep 2008 21:33


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

BigAl 6. Sep 2008 21:55

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:
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.
Und das Formular:
Code:
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
Ich bin ratlos...

Hat wer 'ne Idee???

Alex

inherited 6. Sep 2008 22:56

Re: Programm bei laufender IDE schneller - Warum?
 
Ich habe das Problem nicht. Beide Versionen kommen bei mir auf 93/sec

Bernhard Geyer 7. Sep 2008 08:26

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.

BigAl 7. Sep 2008 13:08

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

xaromz 7. Sep 2008 15:22

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