![]() |
Try..except beschleunigen
Hallo
Mir ist aufgefallen, dass bei häufigem einlaufen in die Fehlerbehandlungen von Try..except Blöcken, die Prozessorauslastung deutlich sinkt und somit die Gesamtzeit, zur Ausführung von z.B. Berechnungen, zunimmt. Es scheint so, als ob eine einfache Exception Behandlung eine Art sleep- Funktion integriert hat. Hat vielleicht jemand eine Ideee, wie man solche Exception-Blöcke beschleunigen kann ? |
Re: Try..except beschleunigen
Also ich bin generell der Meinung, daß man solche Konstrukte eher zurückhaltend einsetzen sollte, wenn man weiß, daß an einer bestimmten stelle etwas schief gehen kann, dann sollte man die Beteiligten Objekte halt selber prüfen und gar nicht erst in die Falle hineinlaufen (einfachstes Beispiel Division durch 0). Manchmal lässt es sich nicht vermeiden, aber bei Berechnungen sollte man die Dinger wirklich alle wegbekommen.
Edit: Willkommen bei der :dp: Sherlock |
Re: Try..except beschleunigen
Hallo
Du weisst schon das exceptions übersetzt Ausnahmen heisst und deshalb nur selten vorkommen also spielt es keine rolle wie schnell sie sind! :lol: Liebe grüsse Laufi |
Re: Try..except beschleunigen
Ich denke, er meint, daß die Anweisungen, die im Try-Teil einer Exception ausgeführt werden langsamer laufen. Und die werden immerhin immer ausgeführt, bis es halt knallt ;)
Sherlock |
Re: Try..except beschleunigen
Ich bin der selben Meinung wie Sherlock.
try..except hat seine Berechtigung, sollte aber nur sparsam eingesetzt werden. Bei Berechnungen, Typumwandlungen (z.B. StrToInt), DB-Abfragen, usw. kann man vorher prüfen, ob alles OK ist. Darüber hab ich mich schon öfters hier ausgelassen. Somit verweise ich auf die Suchfunktion zur weiteren Begründung... |
Re: Try..except beschleunigen
Ein try-except Block erfordert immer eine erhebliche Belastung der CPU durch den zusätzlichen Code, der ausgeführt werden muss, um eine Exception sicher abfangen zu können.
|
Re: Try..except beschleunigen
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 |
Re: Try..except beschleunigen
Leider ist es nicht möglich, auf diese try..except Blöcke zu verzichten, da sie meinen Formelparser "Nan" und "DivZero" tauglich machen. Was mir halt nicht einleuchten will ist, dass die Prozessorauslastung, bei häufigen Ausnahmebahandlungen, herunter geht und nicht ansteigt.
|
Re: Try..except beschleunigen
Bist Du sicher, daß Du die Prüfung auf "DivZero" nicht selber vornehmen kannst?
Sherlock |
Re: Try..except beschleunigen
Es geht weniger um das Können, als vielmehr darum, dass ich einen großen Haufen von dynamischen Parser-Funktionen umschreiben müsste.
|
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 |
Re: Try..except beschleunigen
Das scheint tatsächlich zu funktionieren. Gibts irgendwo eine detailierte Beschreibung der FPU Funktionen/Befehle ?
|
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 ;) |
Re: Try..except beschleunigen
Hi,
Zitat:
Delphi-Quellcode:
In dem Kommentar ist erklärt, was danach getan wurde.
//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); Mfg FAlter |
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 ? |
Re: Try..except beschleunigen
Die FPU ist doch Teil der CPU (neben ALU)
|
Re: Try..except beschleunigen
Zitat:
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:
Von Prozessorauslastung kann dabei keine Rede sein. Denn jetzt kommt ganz normal der Code hinter dem try, egal ob diese 4 Befehle davor stehen.
asm
push ebp push @Exceptblock push fs:[0] mov fs:[0], esp end; 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:
Fertig.
asm
//Beispiel pop fs:[0] pop edx pop edx end; Im Übrigen setzt Delphi um jede Funktion, die dynamische Arrays oder strings oder Variants verwendet, einen try-finally Block |
Re: Try..except beschleunigen
Zitat:
|
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 |
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. |
Re: Try..except beschleunigen
Zitat:
1/0 ist sehr wohl unendlich und wird auch von der Natur bewiesen (bzw. brauch man um die Natur zu beschreiben). Und die gängigen Mathematikprogramme bringen auch richtigerweise genau dieses Ergebnis. |
Re: Try..except beschleunigen
3_of_8 hat Recht:
![]() |
Re: Try..except beschleunigen
Zitat:
Ich werf mal auch meinen Senf dazu. In der Mathematik wird 1/0 in einem Therm als unendlich angenommen, da davon ausgegangen wird, daß wenn der Teiler kleiner wird der Gesamtausdruck größer werden muss. Dabei ist die Annahme das 0 nicht exakt 0 ist sondern fast 0 ist. Genau unter dieser Annahme ist die Deutung richtig zu sagen, daß 1/0 = unendlich ist. Falls man aber davon ausgeht, dass man von exakt 0 redet, ist dieser Ausdruck undefiniert. Nehmen wir das einfache Beispiel aus der Grundschule. Ich habe einen Apfel und teile es durch niemanden, wieviele Äpfel hat jeder bekommen? Es gibt keinen "jeder"...daher bleibt es undefiniert. So gesehen habe beide Recht. |
Re: Try..except beschleunigen
Zitat:
1/0 = Undefiniert 1/(fastnull) = Definiert Punkt |
Re: Try..except beschleunigen
Anzunehmen, dass 1/0 irgendeinen festen Wert hat ist einfach mathematisch nicht haltbar, weil es sich selbst widerspricht.
|
Re: Try..except beschleunigen
Mir fehlt grad die Motivation die Bedeutung hinter x/0 zu erklären, die übrigens in der Physik (elektrische Felder) auch tatsächlich existiert (im Gegensatz zu dem Apfelbeispiel kann man sich das da auch vorstellen). Es mag sein (es ist hin und wieder so), dass die Mathematik da in ihren Definitionen an ihre Grenzen stößt. Selbst bei Wiki steht ja, dass man sich da mit dem Limes behilft. Man kann eben das Problem mit x/0 nicht einfach ausschließen und als nicht existent ansehen.
![]() Und genau hier sind wir an einem Unterschied zwischen Theorie und Praxis. In der Theorie kann man da gerne eine Grenzwertbetrachtung machen. In der PRaxis (und damit zurück zum Thema hier) will man einfach, dass der Rechner bei x/0 unendlich ausgibt. Fertig. Ein ähnliuches Beispiel ist die imaginäre Einheit i. Die ist definiert mit i^2=-1, aber nicht mit sqrt(-1)=i. Kann man so akzeptieren. Aber beim Lösen einer quadratischen Gleichung, schaut sich jeder nur den Nenner an und stellt fest, wenn dieser <0 ist kommt etwas Komplexes bei raus. Und woran hat sich nun der Rechner zu halten? Bei IEEE (Standard for Binary Floating-Point Arithmetic) hat man beides in Betracht gezogen. Da gibt es einen extra Unterpunkt (7.2.) für "Division by Zero". Wenn der Divisor 0 ist und der Divident eine endliche Zahl ungleich 0, dann soll das Ergebnis unendlich (vorzeichenrichtig) sein und das Exception Flag gesetzt werden. Da kann sich dann jeder raussuchen, was er braucht. Edit: Vielleicht noch etwas schönes, was zwar jeder kennt, aber in dem Zusammenhang noch einmal erwähnt werden kann: ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:51 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz