AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Wertezuweisung möglichst performant

Ein Thema von MisterNiceGuy · begonnen am 21. Okt 2009 · letzter Beitrag vom 22. Okt 2009
Antwort Antwort
Benutzerbild von MisterNiceGuy
MisterNiceGuy

Registriert seit: 1. Jul 2003
Ort: Mannheim
919 Beiträge
 
Delphi 7 Personal
 
#1

Wertezuweisung möglichst performant

  Alt 21. Okt 2009, 16:11
Hi, ich möchte möglichst performant einem Array Werte zuweisen. Benutze ich dafür eine Schleife, also...

Delphi-Quellcode:
var i : integer;
begin
  for i := 0 to 15 do Matrix.matrix[i] := 1;
end;
ODER:

Delphi-Quellcode:
begin
  Matrix.matrix[0] := 1;
  Matrix.matrix[1] := 1;
  ...
  Matrix.matrix[15] := 1;
end;
P.S. Matrix ist ein Record.
Jonas
Wenn mich jemand sucht, ich bin im Kühlschrank!

Informationen über das Duale Studium
www.jofre.de
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#2

Re: Wertezuweisung möglichst performant

  Alt 21. Okt 2009, 16:14
Probier es einfach aus Die Sprungvorhersage moderner Prozessoren ist ziemlich weit entwickelt, und es gibt keinen Unterschied zwischen Feldzugriff und Arrayelementzugriff in Records - beides bedeutet eine indizierte Indirektion. Das einzige, was mir gerade einfällt, wären Pipelinefehler wegen falsch vorhergesagten Sprüngen.
  Mit Zitat antworten Zitat
Benutzerbild von Corpsman
Corpsman

Registriert seit: 8. Nov 2005
Ort: nähe Stuttgart
981 Beiträge
 
Delphi XE2 Professional
 
#3

Re: Wertezuweisung möglichst performant

  Alt 21. Okt 2009, 16:26
Heut zu Tage gibts auch die Optimierung des "Loop enroloings"

da geht der Compiler her und merkt das die Schleife "klein" ist und ersetzt diese automatisch durch die 2. Variante, so das die Schleife komplettt weg fällt.

Leider habe ich bisher noch keine Documentation zu dne Verwendeten Optimierungen von Delphi/ FPC gefunden interessant wärs bestimmt.
Uwe
My Sitewww.Corpsman.de

My marble madness clone Balanced ( ca. 70,0 mb ) aktuell ver 2.01
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: Wertezuweisung möglichst performant

  Alt 21. Okt 2009, 16:27
Und für die absoluten Masochisten gibt es noch rep stosd, aber das willst du dir wahrscheinlich nicht antun.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#5

Re: Wertezuweisung möglichst performant

  Alt 21. Okt 2009, 16:35
es kommt auf's Array drauf an ... man könnte auch das Array als Konstante vordefinieren und dann einfach reinkopieren
$2B or not $2B
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#6

Re: Wertezuweisung möglichst performant

  Alt 21. Okt 2009, 17:30
Ich würde ganz klar die Schleife (aufgehübscht mit High() und Low()) nehmen
Delphi-Quellcode:
var i : integer;
begin
  for i := Low(Matrix.matrix) to High(Matrix.matrix) do
    Matrix.matrix[i] := 1;
end;
Warum? Weil es die Absicht des Programmierers am Besten ausdrückt.

Thema Optimierung:
Optimierung ist ja im Prinzip eine schöne Sache, wenn das Programm danach schneller ist.
In diesem Falle kann man maximal einige Nanosekunden rausholen.
Wäre doch blöd, den Sourcecode nur wegen der Jagt auf einige Nanosekunden zu "versaubeuteln",
wenn man an anderer Stelle Millisekunden bis Sekunden sparen kann.

http://clean-code-developer.de/wiki/...rOptimierungen
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#7

Re: Wertezuweisung möglichst performant

  Alt 21. Okt 2009, 18:06
Jupp, erstmal den Code schreiben, so daß er Funktioniert und später kann man an "engstellen" noch etwas optimieren.

OK, abgesehn von Optimierungen, welche von Anfang an ine wesentliche Steigerung versprechen
und wo ein späterer Umbau zuviel Arbeit macht.

Also hier kommt es dann drauf an, wie oft dieses ausgeführt wird und ob sich dann die paar Nanosekunden in der Summe überhaupt bemerkbar machen.
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von MisterNiceGuy
MisterNiceGuy

Registriert seit: 1. Jul 2003
Ort: Mannheim
919 Beiträge
 
Delphi 7 Personal
 
#8

Re: Wertezuweisung möglichst performant

  Alt 22. Okt 2009, 11:11
Danke für die Antworten, falls es einen großen Performanzunterschied im fertigen Projekt gibt werd ich mal Rückmeldung geben!
Jonas
Wenn mich jemand sucht, ich bin im Kühlschrank!

Informationen über das Duale Studium
www.jofre.de
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.944 Beiträge
 
Delphi 12 Athens
 
#9

Re: Wertezuweisung möglichst performant

  Alt 22. Okt 2009, 12:44
Wenn es ein Array von Ordinaltypen ist und du nur das ganze Array mit #0 initialisieren willst
ist wohl FILLCHAR auf die Adresse des ersten Elements das beste. Das gilt auch wenn für andere Werte wenn es ein Byte oder char array ist.

Dann kannst du auch noch (also es geht immer noch nur um Initialisierung) das Array als Arraykonstante im Kode ablegen so das gar keine Zuweisung statt findet...ist wohl das schnellste.
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#10

Re: Wertezuweisung möglichst performant

  Alt 22. Okt 2009, 12:53
Hi,

Wollte nochmal auf Apollonius' Vorschlag zurückkommen... bzw. seinen Vorschlag unterstreichen:

"rep stosd" wird wohl das schnellstmögliche sein!

(Und so schwer isses auch nicht. Vielleicht 3-5 Zeilen Assembler)

Edit:

Delphi-Quellcode:
// ACHTUNG: Funktioniert nur bei 4-Byte großen Datentypen!
// Für 2 Byte große Datentypen stosd durch stosw ersetzen
// Für 1 Byte große Datentypen stosd durch stosb ersetzen
procedure FillMem(Value: Integer; Dest: Pointer; Length: Integer);
asm
  mov edi, edx
  rep stosd
end;

// ...

var Test: Array[0..15] of Integer;

procedure TForm1.Button1Click(Sender: TObject);
var i: Integer;
begin
  Fill(1,@Test[0],Length(Test));
  // Gucken ob alles stimmt:
  for i := 0 to 15 do
    ShowMessage(IntToStr(Test[i]));
end;
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:42 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz