Einzelnen Beitrag anzeigen

Hallo_Thomas

Registriert seit: 18. Apr 2005
Ort: Dresden
405 Beiträge
 
Delphi 2005 Professional
 
#1

MultiThreading Bei mir ca. 40x Langsamer bei IntegerBerechnu

  Alt 18. Aug 2006, 16:49
Hallo,Ich habe ein mein erstes Multithreading-TestProgramm geschrieben,& es ist vieeeeeeeeeeeel zu langsam.

Ich setzte den einmal die gleiche Rechenschleife in einen Thread ein & einmal in eine Procedore.Und in meinem Programm ist die Procedur 40x Schneller!

Mir ist schon klar, das die erschaffung der Threads und so, die Sache so verlangsamt.

Aber auch Multithreading kann ja heutzutage effizenter eingetzt werden!

Was mache ich also bei meinem Programm, wo an den Thread eine Array übergeben wird und dann auch die Array zurück!


Das Programm sieht wie folgt aus unit1=>Startet SteuerTread(Hier wird alles berechnet)=>Dieser verwaltet die NebenThreads1&2 die die Berechnungen durchführen

Dies ist die Procedure und Rechenschleife, das gliche wird in den Threads berechnet!
Delphi-Quellcode:
 procedure Counten(Var Feld1:TIntegerDynArray);
Var x,y:Integer;
begin
    for y:=0 to 13 do
    for x:=0 to 156 do Feld1[x]:=Feld1[x]+1*2 div 2;
    x:=SumInt(Feld1);
end;
Hier der Code von meiner Threadschleife:
Code:
procedure TGeldStatistikThread.ThreadDone(Sender: TObject);
begin
  Dec(ThreadsRunning);
  Dec(Fi);
  Case ThreadsRunning of
  0:begin
     ThreadsRunning:=5;
     with TThread1.Create(Feld) do
      OnTerminate := ThreadDone;
      with TThread2.Create(Feld) do
      OnTerminate := ThreadDone;
    end;
  3:begin
      ThreadsRunning:=2;
      with TThread1.Create(Feld) do
      OnTerminate := ThreadDone;
      with TThread2.Create(Feld) do
      OnTerminate := ThreadDone;
      //Dec(Listenlaenge);
      if Fi<0 Then
      begin
        Synchronize(Label2);
        ThreadsRunning:=10;
      end;
    end;
  end;
end;
NebenThread1 & 2 sind Identisch!
Code:
unit UnitNebenThread1;

interface

uses
  Classes,Types,math;

type
  TNebenThread1 = class(TThread)
  private
  Fe:TIntegerDynArray;
  Liste:Integer;
    { Private declarations }
  protected
    procedure Execute; override;
    procedure Counten2(Var Feld1:TIntegerDynArray); virtual; abstract;
  public

    constructor Create(Var Feld:TIntegerDynArray);
  end;
  { TThreadCounter }
  TThread1  = class(TNebenThread1)
  protected
    procedure Counten2(Var Feld1:TIntegerDynArray); override;
  end;
implementation

uses unit1;

constructor TNebenThread1.Create(Var Feld:TIntegerDynArray);
begin
  Fe:=Feld;
  FreeOnTerminate := True;
  inherited Create(False);
end;

procedure TNebenThread1.Execute;
begin
  Counten2(Fe){ Thread-Code hier einfügen }
end;

procedure TThread1.Counten2(Var Feld1:TIntegerDynArray);
Var x,y:Integer;
begin
    for y:=0 to 13 do
    for x:=0 to 156 do Feld1[x]:=Feld1[x]+1*2 div 2;
    x:=SumInt(Feld1);
end;


end.
Miniaturansicht angehängter Grafiken
form1bild_877.jpg  
Angehängte Dateien
Dateityp: zip scoure_140.zip (26,3 KB, 6x aufgerufen)
Dateityp: zip project1_101.zip (202,7 KB, 8x aufgerufen)
  Mit Zitat antworten Zitat