AGB  ·  Datenschutz  ·  Impressum  







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

Ein Array schnell auf 0 Werte prüfen

Ein Thema von Tyrael Y. · begonnen am 1. Feb 2008 · letzter Beitrag vom 4. Feb 2008
Antwort Antwort
Seite 1 von 2  1 2      
Tyrael Y.

Registriert seit: 28. Jul 2003
Ort: Stuttgart
1.093 Beiträge
 
Delphi 2007 Professional
 
#1

Ein Array schnell auf 0 Werte prüfen

  Alt 1. Feb 2008, 09:00
Hallo zusammen,

ich lese aus einem Datenstrom Daten in ein Array.
Es kann vorkommen das ein sehr großes Array nur aus Nullen besteht.
Wenn dieses Array nur aus Nullen besteht, muss ich es nicht weiterverabeiten.

Wie kann ich ein großes Array (array of byte, array of word, array of integer) schnell auf nur Nullen untersuchen?

Delphi-Quellcode:
type TIntArray = array of integer;

function IsEmptyArray(AArray: TIntArray): Boolean
begin
 //for i := Low(AArray) to High(AArray) do
 //begin
end;
Levent Yildirim
Erzeugung von Icons aus Bildern:IconLev
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.771 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: Ein Array schnell auf 0 Werte prüfen

  Alt 1. Feb 2008, 09:17
Guten Morgen,

beim Einlesen der Daten besteht da keine Möglichkeit die Daten zu Prüfen?
Wenn Du nur das Array prüfen kannst, dann würde ich nicht mit einer
for to Schleife arbeiten, denn Du kannst ja bei dem ersten Wert der <> null ist
schon die Schleife verlassen.

Wie groß ist denn die Chance eine Array nur mit Nullen vorzufinden?

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#3

Re: Ein Array schnell auf 0 Werte prüfen

  Alt 1. Feb 2008, 09:17
Hallo,

am schnellsten dürfte der Einsatz einer kurzen ASM-Funktion auf der Basis von SCASB sein.

Delphi-Quellcode:
function CheckZeroMem(p: PByte; size: Word): Boolean;
var
  b: Byte;
begin
  b := 0;
  while (size > 0) and (b = 0) do
  begin
    b := b or p^;
    Dec(size);
    Inc(p);
  end;
  Result := b = 0;
end;
Grüße vom marabu
  Mit Zitat antworten Zitat
Reinhard Kern

Registriert seit: 22. Okt 2006
772 Beiträge
 
#4

Re: Ein Array schnell auf 0 Werte prüfen

  Alt 1. Feb 2008, 09:22
Zitat von Tyrael Y.:
Hallo zusammen,

ich lese aus einem Datenstrom Daten in ein Array.
Es kann vorkommen das ein sehr großes Array nur aus Nullen besteht.
Wenn dieses Array nur aus Nullen besteht, muss ich es nicht weiterverabeiten.

Wie kann ich ein großes Array (array of byte, array of word, array of integer) schnell auf nur Nullen untersuchen?
Hallo,

für die Arithmetik ist Null so gut wie irgendeine andere Zahl, ich glaube nicht, dass der Compiler für den Fall Null besondere Optimierungen durchführt. Mit Assembler liesse sich was machen: Anfangs- und End-Adresse des Arrays bestimmen und dann einfach alle Worte im Akku verodern - nur wenn alle 0 sind, ist es das Ergebnis auch, bei nicht 0 kann man die Schleife abbrechen. Oder man verwendet den einzeiligen Befehl REPZ SCAS.

Gruss Reinhard
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#5

Re: Ein Array schnell auf 0 Werte prüfen

  Alt 1. Feb 2008, 09:25
Delphi-Quellcode:
function IsEmptyArray(AArray: TIntArray): Boolean
asm
  push edi
  mov edi,eax
  mov ecx,[eax-4]
  xor eax,eax
  repe scasd
  jnz @end
  inc al
@end:
  pop edi
end;
Edit: (etwas allgemeiner)
Delphi-Quellcode:
function IsZeroMemory(const mem;size:integer):boolean;
asm
  push edi
  mov edi,eax
  mov ecx,edx
  shr ecx,2
  xor eax,eax
  repe scasd
  jnz @False
  mov ecx,edx
  and ecx,3
  repe scasb
  jnz @FALSE
  inc eax
@FALSE:
  pop edi
end;

...
var x:array of integer;
...
isZeroMemory(x[0],sizeof(Integer)*length(x))
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: Ein Array schnell auf 0 Werte prüfen

  Alt 1. Feb 2008, 09:56
Inline Assembler ist aber alles andere als portabel. Ich würde einfach ganz normal die Standardfunktionen verwenden. Der Flaschenhals entsteht hier ja nicht durch die Taktfrequenz, also die Anzahl der Befehle, sondern eher dadurch, dass die Eingabewerte recht langsam zum Prozessor kommen.
Manuel Eberl
„The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#7

Re: Ein Array schnell auf 0 Werte prüfen

  Alt 1. Feb 2008, 11:49
Zitat von 3_of_8:
Inline Assembler ist aber alles andere als portabel. Ich würde einfach ganz normal die Standardfunktionen verwenden. Der Flaschenhals entsteht hier ja nicht durch die Taktfrequenz, also die Anzahl der Befehle, sondern eher dadurch, dass die Eingabewerte recht langsam zum Prozessor kommen.
Was meinst du mit "nicht portabel"? Funktioniert doch auf jedem Prozessor der sich mit der IA-32 auskennt.
Und schneller ist es auch. Eingabewerte können auch in den Cache, wenn man es dem Prozessor rechtzeitig sagt.
Wann jemand auf ASM zurückgreift, muss er für sich selber entscheiden.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Laufi

Registriert seit: 21. Mär 2006
86 Beiträge
 
#8

Re: Ein Array schnell auf 0 Werte prüfen

  Alt 1. Feb 2008, 12:34
Hallo

Da du ein Integer array hast kannst du es auch als vektor betrachten. Dann kannst du eine beliebige Norm wählen z.B. euklid und von deinem Vektor berechnen. Wenn die norm 0 ist sind alle werte in deinem Array 0

Liebe Grüsse
Laufi
  Mit Zitat antworten Zitat
Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#9

Re: Ein Array schnell auf 0 Werte prüfen

  Alt 1. Feb 2008, 16:05
Zitat von sirius:
Was meinst du mit "nicht portabel"? Funktioniert doch auf jedem Prozessor der sich mit der IA-32 auskennt.
Und schneller ist es auch. Eingabewerte können auch in den Cache, wenn man es dem Prozessor rechtzeitig sagt.
Wann jemand auf ASM zurückgreift, muss er für sich selber entscheiden.
Natürlich, und es gibt ja keine anderen Maschinensprachen als IA-32.

Natürlich können Eingabewerte in den Cache, aber der Flaschenhals in diesem Fall ist nunmal wirklich die Verbindung Prozessor-Hauptspeicher, bei sehr hoher Datenmenge eventuell sogar Hauptspeicher-Festplatte. Die Optimierung auf der Assembler-Ebene bringt daher hier wirklich wenig, von daher würde ich vorschlagen, darauf zu verzichten.
Manuel Eberl
„The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#10

Re: Ein Array schnell auf 0 Werte prüfen

  Alt 1. Feb 2008, 16:17
Zitat von 3_of_8:
Natürlich, und es gibt ja keine anderen Maschinensprachen als IA-32.
Zumindest wirds auf anderen Architekturen auch für Windows und Linux extrem schwer.


Zitat von 3_of_8:
Die Optimierung auf der Assembler-Ebene bringt daher hier wirklich wenig.
Meistens bringt Assembler nicht viel. Da stimme ich dir zu. Aber die Optimierung bei solchen Vorgängen bringt ausnahmsweise sogar mal sehr viel. Sobald du einen ASM-Befehl für Repeat (REPE; REPNZ) einsetzen kannst, bekommst du diese Vorteile. Kannst ja mal messen.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 23:32 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