Benchmark Test bzw ein Versuch dazu^^

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
EugenE
Beiträge: 440
Registriert: So 10. Dez 2006, 14:59
OS, Lazarus, FPC: MacOSX Lion 10.7 (L 0.9.31 FPC 2.7.1)
CPU-Target: 64Bit
Kontaktdaten:

Benchmark Test bzw ein Versuch dazu^^

Beitrag von EugenE »

Hey Leute,

ich wollte mal versuchen was schneller ist TBitmap oder TLazInftImage dazu habe ich mir extra ein kleines Test programm geschrieben, jedoch bei ca 40 durchläufen meldet TLazIntfImage das es keinen Speicher mehr gibt obwohl ich bei jedem Durchlauf die Ressourcen freigebe.

In einem Durchlauf wird eine Grafik erstellt mit einer Größe von 4000x4000, diese Pixel mit einer Farbe gefüllt, danach ein Roter Strich diagonal durch die Grafik gezeichnet.

Bei meinen Tests ( bei 35 Durchläufen ) ist TBitmap schneller O.o

Ich habe mal im Anhang das Programm ( nur Quellcode ) , oben in der Datei kann man die maximalen Durchläufe setzen

Code: Alles auswählen

const
     MaxTests : Integer = 35;
falls ihr mehr Durchläufe schafft , schreibt mir wie^^ und welchen Durchschnitt :),vorallem auch unter Linux wäre es gut zu wissen was schneller ist

Naja gn8 @ aLL ^^
Dateianhänge
vertical-text.zip
(6.22 KiB) 102-mal heruntergeladen

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Natürlich ist TBitmap schneller, TLazIntfImage war ja nur ein dirty workaround um Transparez und konvertierungen hinzubekomen als es dort mit TBitmap noch riesige Probleme gab. Glaub nicht das das sonderlich effizient ist. Und nach der aktuellen Überarbeitung kanns gut sein das TBitmap nochmal nen schub schneller ist.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

Benutzeravatar
theo
Beiträge: 10921
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

Sind Äpfel schneller als Birnen?

@Christian: halte dich bitte selber mal an deine Sig. ;-)

Das sind nicht zwei konkurrierende Ansätze sondern was völlig verschiedenes.
Ein TBitmap sendet jedes Pixel via TCanvas direkt an das Interface.
Ein TLazIntfimage ist die Lazarus Brücke zu TFPCustomImage und diese sind geräteunabhängig, also nur in Memory, ähnlich wie OpBitmap.

@Eugen: Deine Messung misst alles mögliche, aber die Frage, wie schnell Pixel gezeichnet werden können, geht dabei unter.
Miss doch mal nur den Loop in welchem du die Linie zeichnest. Da wird es wieder anders aussehen.
Der Effizienzgewinn des Zeichnens in ein InftImage oder in OpBitmap steigt mit der Anzahl Pixel die man bearbeitet.
Die Konvertierungs-Aufwand drumherum bleibt immer gleich.

Was ist eigentlich dein Ziel?

Benutzeravatar
theo
Beiträge: 10921
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

Und wenn wir schon Äpfel und Birnen vergleichen: Mach mal den Test:

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
const w = 2000;
const h = 2000;
const l = 10;
var
  SrcIntfImg: TLazIntfImage;
  T2: TBitmap;
  OP: TCanvasOPBitmap;
  px, py, i: integer;
  s, e: Cardinal;
begin
  //OpBitmap
  OP := TCanvasOPBitmap.Create;
  OP.Width := w;
  OP.Height := h;
  s := GetTickCount;
  for i:=0 to l do
   for py := 0 to h - 1 do
    for px := 0 to w - 1 do Op.Canvas.Pixels[px, py] := clred;
 
  e := GetTickCount - s;
  writeln(e);
  OP.free;
 
  //LazIntfImg
  SrcIntfImg := TLazIntfImage.Create(0, 0);
  SrcIntfImg.DataDescription := GetDescriptionFromDevice(0);
  SrcIntfImg.SetSize(w, h);
 
  s := GetTickCount;
  for i:=0 to l do
   for py := 0 to h - 1 do
     for px := 0 to w - 1 do SrcIntfImg.Colors[px, py] := colRed;
 
  e := GetTickCount - s;
  writeln(e);
  SrcIntfImg.Free;
 
  //TBitmap
  T2 := TBitmap.Create;
  T2.Height := w;
  T2.Width := h;
 
  s := GetTickCount;
  for i:=0 to l do
   for py := 0 to h - 1 do
     for px := 0 to w - 1 do T2.Canvas.Pixels[px, py] := clRed;
 
  e := GetTickCount - s;
  writeln(e);
 
  T2.Free;
end;
Ergebnis bei mir auf Linux:
OpBitmap: 1669 ms
LazIntfImg: 5467 ms
TBitmap: 25515 ms

EugenE
Beiträge: 440
Registriert: So 10. Dez 2006, 14:59
OS, Lazarus, FPC: MacOSX Lion 10.7 (L 0.9.31 FPC 2.7.1)
CPU-Target: 64Bit
Kontaktdaten:

Beitrag von EugenE »

Mein Ziel ist es ein schnelles Berechnen / Zeichnen für meinen Button zu erreichen.

Unter Windows sind die Ergebnisse andersrum, da ist TBitmap schneller als TLazInftImage

ich denke ich werde es erstmal mit TLazInftImage versuchen, wenn dies nicht Schneller ist nehme ich TOpBitmap^^

@Theo danke für das Beispiel wie man ein TLazInftImage ohne TBitmap erstellt ^.^
warum fügste denn das TOpBitmap nicht bei der Wiki ein, denke mal das würden viele Nutzen ^^

Benutzeravatar
theo
Beiträge: 10921
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

Wie gross ist denn der Button?
Musst du den dauernd neu auf Pixelebene zeichnen?
Kannst du nicht die den Zuständen entsprechenden Bilder vorproduzieren und nur noch draufkopieren?

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

kann ich bestätigen:
CB:1658
lz:1533
wie hier zu sehen ist fehlt die Ausgabe von TBitMap.
Ich verwende GTK2, werde es mal mit GTK1 probieren.
Ich hätte nicht gedacht das opBitmap doch so viel schneller ist... in Theos Beispiel.
in meinem liegt ja LazIntfImg leicht vorne.

edit01
cb = OptBitmap
lz =TLazIntfImage
der Bitmap test wurde bei mir nicht Fertig. Ich habe ihn abgebrochen !

das hätte ich jetzt nicht erwartet. und in vielen Projekten verwende ich TBitMap. Ich werde versuchen umzusteigen auf TLazIntfImage. Wobei opBtimap natürlich auch nicht schlecht ist. Aber das erzeugt wieder eine Abhängigkeit ! :(
MFG
Michael Springwald

EugenE
Beiträge: 440
Registriert: So 10. Dez 2006, 14:59
OS, Lazarus, FPC: MacOSX Lion 10.7 (L 0.9.31 FPC 2.7.1)
CPU-Target: 64Bit
Kontaktdaten:

Beitrag von EugenE »

theo hat geschrieben:Wie gross ist denn der Button?
Musst du den dauernd neu auf Pixelebene zeichnen?
Kannst du nicht die den Zuständen entsprechenden Bilder vorproduzieren und nur noch draufkopieren?
Der Button hat immer ne Variable Größe ^^, der Hintergrund wird linie für linie gesetzt, das setzen von gedrehten Text und Glyphen muss per Pixel gemacht werden da Transparent := true nicht läuft^^

Das Cachen vom den Rotierten Texten + Glyphen wollte ich erstmal machen und danach guck ich nochmal ob ich den Hintergrund einzelln Cachen muss

Benutzeravatar
theo
Beiträge: 10921
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

@Eugen: Aha! ;-)
@Pluto: Nein, ich wollte nur sagen, dass man das nicht verallgemeinern kann.
Wer behauptet das eine sei für jeden Zweck besser oder schneller als das andere hat nicht begriffen, worum's geht.

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

Wer behauptet das eine sei für jeden Zweck besser oder schneller als das andere hat nicht begriffen, worum's geht.
Ich denke du wolltest beweisen das TBitMap langsam ist.
MFG
Michael Springwald

Benutzeravatar
theo
Beiträge: 10921
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

Nein, wollte ich nicht.
Ich wollte nur zeigen, dass es Anwendungsfälle gibt, wo das eine schneller ist und solche wo das andere schneller ist.
Deshalb sollte man daraus keine allgemeinen Schlüsse ziehen sondern immer das beste Mittel für den jeweiligen Zweck nehmen.

EugenE
Beiträge: 440
Registriert: So 10. Dez 2006, 14:59
OS, Lazarus, FPC: MacOSX Lion 10.7 (L 0.9.31 FPC 2.7.1)
CPU-Target: 64Bit
Kontaktdaten:

Beitrag von EugenE »

Mein Ergebnis mit dem Test von Theo ( ohne OpBitmap )
Durchläufe 100

LazIntf: 18.344
TBitmap: 286.891

man sieht den kleinen Unterschied ^^

naja ich hoffe das mein Button mit LazIntf auch für Linux wird ^^ dann bin ich zufrieden ^^

Benutzeravatar
theo
Beiträge: 10921
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

Ubrigens, um die Messreihe oben noch zu vervollständigen, OpBitmap mit Scanline betrieben geht auch. Das dauert dann noch 190 ms bei mir.
Also
OpBitmap Scanline : 190 ms
OpBitmap Pixels: 1669 ms
LazIntfImg: 5467 ms
TBitmap: 25515 ms

Code: Alles auswählen

var  Line:PAPixel32;
...
//OpBitmap mit Scanline
  OP := TCanvasOPBitmap.Create;
  OP.Width := w;
  OP.Height := h;
  OP.PixelFormat:=pf32bit;
  s := GetTickCount;
  for i:=0 to l do
   for py := 0 to h - 1 do
   begin
    Line:=Op.ScanLine[pY];
    for px := 0 to w - 1 do
    begin
      Line^[px].Red:=255;
      Line^[px].Blue:=0;
      Line^[px].Green:=0;
     end;
   end;
  e := GetTickCount - s;
  writeln(e);
Zuletzt geändert von theo am So 20. Jul 2008, 19:07, insgesamt 1-mal geändert.

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

warnsin ! was für Geschwindigkeit unterscheide.
Wenn ich das richtig in Erinnerung habe nutzt Scnline doch Pointer oder ?
MFG
Michael Springwald

Benutzeravatar
theo
Beiträge: 10921
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

Ja, in diesem Falle kommt der Geschwindigkeitsunterschied aber vor allem daher, das man die R,G,B Bytes direkt setzen kann und nicht zuerst bei jedem Pixel ein TColor "auseinanderpflücken" muss.

Antworten