Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Try..except beschleunigen (https://www.delphipraxis.net/114610-try-except-beschleunigen.html)

Laufi 28. Mai 2008 10:15

Re: Try..except beschleunigen
 
hallo!

Ich habs schonmal gesagt :) Wenn man probleme hat mit division durch 0 muss man nur Set8087CW($133f); schreiben dann kommen die fehler nicht mehr sondern der wert wird von alleine unendlich und so.

Liebe Grüsse
Laufi

magonline 28. Mai 2008 10:29

Re: Try..except beschleunigen
 
Das scheint tatsächlich zu funktionieren. Gibts irgendwo eine detailierte Beschreibung der FPU Funktionen/Befehle ?

smudo 28. Mai 2008 10:30

Re: Try..except beschleunigen
 
Schade, dass immer mehr über das "warum machst du denn das so" als über die eigentliche Frage diskutiert wird...
Try - Except - Blöcke sind m.E. nach unvermeidlich, wenn man mit Transactions arbeitet. Und das können schon mal ziemlich große Blöcke werden. Die Beantwortung der eigentlichen Frage wäre also schon sehr wertvoll ;)

FAlter 28. Mai 2008 11:00

Re: Try..except beschleunigen
 
Hi,

Zitat:

Zitat von magonline
Das scheint tatsächlich zu funktionieren. Gibts irgendwo eine detailierte Beschreibung der FPU Funktionen/Befehle ?

Schnell mal aus nem Code rauskopiert:

Delphi-Quellcode:
//FPU CW setzen... siehe z. B. unter
//http://www.website.masmforum.com/tutorials/fptute/fpuchap1.htm#cword

{  Binär: XXXX0011XXXXXXXX (X - unverändert)
             ^             Unterscheidung zw. +INF und -INF auf alten FPUs
              ^^           Rundung: nach normalen Rundungsregeln auf-/ab
                ^^         Genauigkeit: Extended (auf manschen Systemen
                                                   komischerweise auf Double
                                                   gestellt)
                    ^^^^^^ versch. Gleitkommaexceptions
}
Set8087CW((Get8087CW and $F3FF) or $0300);
In dem Kommentar ist erklärt, was danach getan wurde.

Mfg
FAlter

magonline 28. Mai 2008 11:17

Re: Try..except beschleunigen
 
Meine angezeigte Prozessorauslastung beträgt nun über 50% (statt zuvor 20%).

Wird die Auslastung der FPU im Taskmanager angezeigt ?

Also, kann es sein dass die FPU ausgelastet ist und die CPU so lange in Idle geht ?

mkinzler 28. Mai 2008 11:26

Re: Try..except beschleunigen
 
Die FPU ist doch Teil der CPU (neben ALU)

sirius 28. Mai 2008 11:52

Re: Try..except beschleunigen
 
Zitat:

Zitat von Sherlock
Ich gebe hier mal ein Extrembeispiel (dafür wie man es nicht machen sollte), einer meiner Kollegen hat vor Jahren mal in die dpr ein try...except um alles gepackt. :lol:

Sherlock

Da ist dein Kollege nicht alleine. Windows hat sogar einen Unhandled-Exceptionhandler vorgesehen :zwinker:



Zum Thema:
ein einfacher try-Except oder try-finally-Block bremst dein Programm nicht aus. Erst, wenn wirklich eine Exception auftritt, geht es los. Dies apssiert aber auch, wenn kein Except-Block existiert. Bei letzterem stürzt der Thread oder das Programm ab.
Um jede Ereignisbehandlung hat die VCL einen try-Except-Block gelegt.

was passiert nun bei try:
Es gibt für jeden Thread einen Thread-Context. Der befindet sich im Segement fs. Und dort an erster Stelle. Wenn irgendwo eine Exception auftritt, schaut windows an die Adresse fs:[0]. Und dort steht ein Pointer auf einen Record. Der Record besteht aus 3 Teilen und wird beim Befehl try angelegt:
-Register EBP
-Adresse des Except (finally) Blocks (man sagt auch Adresse des "save Place")
-Adresse des des bisherigen ExceptionRecords (es wird also eine Liste der Records aufgebaut
So, jetzt kommt ein Satz Halbwissen:
Der Record muss zwingend auf dem Stack liegen, dadurch ist auch klar, welchen Wert ESP zum Zeitpunkt des try hatte.

Was passiert also bei einem try genau? Es werden 3 Befehle ausgeführt:
Delphi-Quellcode:
asm
  push ebp
  push @Exceptblock
  push fs:[0]
  mov fs:[0], esp
end;
Von Prozessorauslastung kann dabei keine Rede sein. Denn jetzt kommt ganz normal der Code hinter dem try, egal ob diese 4 Befehle davor stehen.
Und hinterher (wenn keine Exception auftrat) muss natürlich der Stack wieder aufgeräumt werden und der Wert an fs:[0] zurückgesetzt:
Delphi-Quellcode:
asm
  //Beispiel
  pop fs:[0]
  pop edx
  pop edx
end;
Fertig.

Im Übrigen setzt Delphi um jede Funktion, die dynamische Arrays oder strings oder Variants verwendet, einen try-finally Block

3_of_8 28. Mai 2008 12:21

Re: Try..except beschleunigen
 
Zitat:

Zitat von Laufi
Wenn man probleme hat mit division durch 0 muss man nur Set8087CW($133f); schreiben dann kommen die fehler nicht mehr sondern der wert wird von alleine unendlich und so.

Das ist nicht portabel. Und außerdem mathematisch falsch. 1/0 ist undefiniert und nicht unendlich. Von einem Matheparser würde ich erwarten, dass er bei so einer Berechnung eine Fehlermeldung bringt bzw. die 1/0-Stelle überspringt.

Laufi 28. Mai 2008 14:17

Re: Try..except beschleunigen
 
Hallo!

Ja 1/0 ist schon undefiniert aber 1 durch eine ganz kleine zahl gibt eine sehr grosse zahl also kann sagen 1/0 ist sowas wie unendlich wenn es doch schon ein unendlich gibt! für was sonst :) man kann es sich auch besser vorstellen wenn man die berechnung zeichnen will anstatt einfach eine exception :roll:

liebe Grüsse
Laufi

3_of_8 28. Mai 2008 15:32

Re: Try..except beschleunigen
 
1/x ist als sgn(x)*unendlich definirt, wenn x gegen 0 geht. (Grenzwertrechnung)
Aber 1/0 ist undefiniert, und von einem mathmatischen Parser würde ich erwarten, dass er mathematisch korrekt arbeitet.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:39 Uhr.
Seite 2 von 3     12 3      

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