AGB  ·  Datenschutz  ·  Impressum  







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

Try..except beschleunigen

Ein Thema von magonline · begonnen am 28. Mai 2008 · letzter Beitrag vom 29. Mai 2008
Antwort Antwort
Seite 2 von 3     12 3      
Laufi

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

Re: Try..except beschleunigen

  Alt 28. Mai 2008, 11:15
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
  Mit Zitat antworten Zitat
magonline

Registriert seit: 20. Nov 2007
5 Beiträge
 
#12

Re: Try..except beschleunigen

  Alt 28. Mai 2008, 11:29
Das scheint tatsächlich zu funktionieren. Gibts irgendwo eine detailierte Beschreibung der FPU Funktionen/Befehle ?
  Mit Zitat antworten Zitat
smudo

Registriert seit: 6. Sep 2005
Ort: Cottbus
362 Beiträge
 
Delphi XE2 Professional
 
#13

Re: Try..except beschleunigen

  Alt 28. Mai 2008, 11:30
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
  Mit Zitat antworten Zitat
Benutzerbild von FAlter
FAlter

Registriert seit: 21. Jul 2004
Ort: Ostfildern
1.096 Beiträge
 
FreePascal / Lazarus
 
#14

Re: Try..except beschleunigen

  Alt 28. Mai 2008, 12:00
Hi,

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
Felix Alter
  Mit Zitat antworten Zitat
magonline

Registriert seit: 20. Nov 2007
5 Beiträge
 
#15

Re: Try..except beschleunigen

  Alt 28. Mai 2008, 12:17
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 ?
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#16

Re: Try..except beschleunigen

  Alt 28. Mai 2008, 12:26
Die FPU ist doch Teil der CPU (neben ALU)
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

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

Re: Try..except beschleunigen

  Alt 28. Mai 2008, 12:52
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.

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



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
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
 
#18

Re: Try..except beschleunigen

  Alt 28. Mai 2008, 13:21
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.
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
Laufi

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

Re: Try..except beschleunigen

  Alt 28. Mai 2008, 15:17
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

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
 
#20

Re: Try..except beschleunigen

  Alt 28. Mai 2008, 16:32
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.
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
Antwort Antwort
Seite 2 von 3     12 3      


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 13:06 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