absolute- gut oder schlecht ?

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Mathias
Beiträge: 6914
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

absolute- gut oder schlecht ?

Beitrag von Mathias »

Ich habe 2 Rotate Methoden, welches ist die eleganter Lösung ?
Die Lösung mit absolute ist fast 4mal schneller als der klassische Umweg über Vector2f
Nur sieht die 1. Lösung etwas gebastelt aus.

Code: Alles auswählen

type
 
  TVertex2d = array[0..1] of single;
 
  TSingleArray = array of single;
 
  { TClass }
 
  TClass = class
  private
    SingleArray: TSingleArray;
  public
    constructor Create;
    procedure Rotate1(winkel: single);
    procedure Rotate2(winkel: single);   
  end;    
 
procedure RotateA(var v: TVertex2d; winkel: single);
begin
  exit; // Test
end;   
 
 
procedure TClass.Rotate1(winkel: single);
var
  i: integer;
  sa: TSingleArray;
  va: array of TVertex2d absolute sa;
//  va: array of TVertex2d absolute SingleArray; // geht leider nicht.
 
begin
  sa := SingleArray;
  for i := 0 to Length(sa) div 2 - 1 do begin
    RotateA(va[i], winkel);
  end;
end;
 
constructor TClass.Create;
var
  i: integer;
begin
  SetLength(SingleArray, 100000000);
  for i := 0 to Length(SingleArray) - 1 do begin
    SingleArray[i] := 2.0;
  end;
end;
 
procedure TClass.Rotate2(winkel: single);
var
  v: TVertex2d;
  i: integer;
begin
  for i := 0 to Length(SingleArray) div 2 - 1 do begin
    Move(SingleArray[i * 2], v, SizeOf(v));
    RotateA(v, 2);
    Move(v, SingleArray[i * 2], SizeOf(v));
  end;
end;  
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: absolute- gut oder schlecht ?

Beitrag von mse »

Solche Dinge sind am effizientesten mit Pointern zu lösen. Etwa so:

Code: Alles auswählen

 
{$pointermath on}
type
 pvertex2d = ^tvertex2d;
 rotinfoty = record
  cosphi: real;
  sinphi: real;
 end;
 
procedure rotateb(var v: tvertex2d; const rot: rotinfoty); inline;
var
 s1: single;
begin
 s1:= v[1];
 v[1]:= s1*rot.cosphi - v[0]*rot.sinphi;
 v[0]:= s1*rot.sinphi + v[0]*rot.cosphi;
end;    
 
procedure trotclass.rotate3(const winkel: real);
var
 po1,pe: pvertex2d;
 rotinfo: rotinfoty;
begin
 rotinfo.cosphi:= cos(winkel);
 rotinfo.sinphi:= sin(winkel);
 po1:= pointer(singlearray);
 pe:= po1 + length(singlearray) div 2;
 while po1 < pe do begin
  rotateb(po1^,rotinfo);
  inc(po1)
 end;
end;  
 
(ungeprüft!).

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

Re: absolute- gut oder schlecht ?

Beitrag von theo »

$pointermath ist standardmäßig eingeschaltet, oder?

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: absolute- gut oder schlecht ?

Beitrag von mse »

theo hat geschrieben:$pointermath ist standardmäßig eingeschaltet, oder?
Nicht bei {$mode delphi}.

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

Re: absolute- gut oder schlecht ?

Beitrag von theo »


Antworten