Article View: pl.comp.objects
Article #14433Re: Wyrzucenie wyjątku, czy zwrócenie null?
From: Marcin 'Qrczak' Kowalczyk
Date: Tue, 04 Apr 2006 12:15
Date: Tue, 04 Apr 2006 12:15
106 lines
5229 bytes
5229 bytes
"Immona" <c.oleszkiewicz@na.gmailu> writes:
>>Jeśli ma nie być dodatkowych narzutów związanych z 'try', to przy
>>typowej konwencji wołania funkcji jedynym sposobem na stwierdzenie,
>>co robić w przypadku wyjątku, jest obejrzenie każdej ramki stosu
>>między 'throw' a 'try' i znalezienie tych informacji na podstawie
>>adresu powrotu w "mapach kodu" (które mogą być zaalokowane
>>statycznie). Przy czym oglądać trzeba również te ramki stosu,
>>w których nie ma żadnych 'try', nawet niejawnych, bo a priori nie
>>wiadomo, które ramki takie są, a adresy powrotu trzeba wyszukiwać
>>w jakichś statycznych słownikach.
>
> Ale Javy to nie dotyczy chyba ..?
Hmm, właściwie to nie wiem, dlaczego wyjątki w C++ są wolne. Moje
rozumowanie było błędne: te ramki stosu i tak trzeba było kiedyś
utworzyć, więc asymptotyczny koszt rzucania wyjątku nie ma wpływu na
asymptotyczny koszt programu. Jednak eksperyment pokazuje, że rzucanie
wyjątku w GCC rzeczywiście jest wolne:
| OCaml | C++ (GCC) | Java (Sun) |
-----------+-------+-----------+------------+
pusty | 0.003 | 0.004 | 0.246 |
wynikiem | 0.408 | 0.140 | 0.328 |
wyjątkiem | 0.614 | 70.310 | 1.696 |
Programy niżej. Czasy w sekundach. Pusty program ma pętlę długości 0;
w ten sposób można wyeliminować czas uruchomienia programu. "Wynikiem"
przekazuje wynik w typie bool, "wyjątkiem" przekazuje wynik wyjątkiem.
Wygląda na to, że wyjątki w Javie Suna są dużo szybsze niż w GCC,
ale wolniejsze niż w OCamlu. Z czasów można wywnioskować, że żaden
kompilator nie wyoptymalizował całej pętli, więc mimo że to
microbenchmark, wynik wydaje się mierzyć prawdziwy koszt wyjątków.
----------------------------------------------------------------------
exception Exn
let test1 x y = x < y
let test2 x y = if x < y then raise Exn
let _ =
let count = ref 0 in
for i = 0 to 9999999 do
(* if test1 i 5000000 then count := !count + 1 *)
try test2 i 5000000 with Exn -> count := !count + 1
done;
print_int !count; print_newline()
......................................................................
ocamlopt exc-ml.ml -o exc-ml
time ./exc-ml
(ocaml-3.09.0)
----------------------------------------------------------------------
#include <iostream>
bool test1(int x, int y) {
return x < y;
}
void test2(int x, int y) {
if (x < y) throw 0;
}
int main() {
int count = 0;
for (int i = 0; i < 10000000; ++i) {
// if (test1(i, 5000000)) ++count;
try {test2(i, 5000000);} catch (int x) {++count;}
}
std::cout << count << std::endl;
}
......................................................................
g++ -O2 exc-cc.cc -o exc-cc
time ./exc-cc
(gcc-4.1.0)
----------------------------------------------------------------------
class ExcJava {
static RuntimeException exn = new RuntimeException();
static boolean test1(int x, int y) {
return x < y;
}
static void test2(int x, int y) {
if (x < y) throw exn;
}
public static void main(String[] args) {
int count = 0;
for (int i = 0; i < 10000000; ++i) {
// if (test1(i, 5000000)) ++count;
try {test2(i, 5000000);} catch (RuntimeException x) {++count;}
}
System.out.println(count);
}
}
......................................................................
javac ExcJava.java
time java ExcJava
(java-sun-1.5.0.01)
----------------------------------------------------------------------
--
__("< Marcin Kowalczyk
\__/ qrczak@knm.org.pl
^^ http://qrnik.knm.org.pl/~qrczak/
Technical Details
Message-ID:
<8764lpmt9q.fsf@qrnik.zagroda>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!newsfeed.gazeta.pl!news.nask.pl!news.nask.org.pl!newsfeed.tpinternet.pl!atlantis.news.tpi.pl!news.tpi.pl!not-for-mailReferences:
<e09c3r$lg3$1@news.onet.pl> <e09f0h$cis$1@news.task.gda.pl> <e09gjn$737$1@news.onet.pl> <e0b1re$bdc$1@news.onet.pl> <e0c8eh$ur8$1@news.onet.pl> <e0cd04$ljh$1@news.task.gda.pl> <e0ced6$f7g$1@news.onet.pl> <e0dabl$1sv$1@news.task.gda.pl> <87y7ytka81.fsf <873bgukx87.fsf@qrnik.zagroda> <06040410195853@polnews.pl>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!newsfeed.gazeta.pl!news.nask.pl!news.nask.org.pl!newsfeed.tpinternet.pl!atlantis.news.tpi.pl!news.tpi.pl!not-for-mail
From: Marcin 'Qrczak' Kowalczyk <qrczak@knm.org.pl>
Newsgroups: pl.comp.objects
Subject: Re: Wyrzucenie wyjątku, czy
zwrócenie null?
Date: Tue, 04 Apr 2006 14:15:13 +0200
Organization: Klub Nieszkodliwych Manjaków
Lines: 106
Message-ID: <8764lpmt9q.fsf@qrnik.zagroda>
References: <e09c3r$lg3$1@news.onet.pl> <e09f0h$cis$1@news.task.gda.pl> <e09gjn$737$1@news.onet.pl> <e0b1re$bdc$1@news.onet.pl> <e0c8eh$ur8$1@news.onet.pl> <e0cd04$ljh$1@news.task.gda.pl> <e0ced6$f7g$1@news.onet.pl> <e0dabl$1sv$1@news.task.gda.pl> <87y7ytka81.fsf <873bgukx87.fsf@qrnik.zagroda> <06040410195853@polnews.pl>
NNTP-Posting-Host: paf87.warszawa.sdi.tpnet.pl
Mime-Version: 1.0
X-Trace: nemesis.news.tpi.pl 1144153021 8432 217.96.225.87 (4 Apr 2006 12:17:01 GMT)
X-Complaints-To: usenet@tpi.pl
NNTP-Posting-Date: Tue, 4 Apr 2006 12:17:01 +0000 (UTC)
X-Face: .B/ouEO}=VFkSJWE}s0@!:diHI.Z,<Ilt`:~@*]7rnn^K_y"XV8AXf^E)x*|3yVg:$FCq0Y )iGn@Z[SOA<+p}TkAv'Lzu$w{z2?F);0Xt>`m}AqK#Vjuscq(Vf1B}H[)v\9tBN}>AdP,QSRbhO]=v 3?;I+cN/Z0HKPm_Eg99/pFrU!WfpjgQ!z":>A~qt0^4):0-UuPB(6^>j!mN$)RIb)rRhXeK:+MLPW[ RVb7Kepvby-ww6_zci7Yy_@IrWW
User-Agent: Gnus/5.1006 (Gnus v5.10.6) Emacs/21.4 (gnu/linux)
Cancel-Lock: sha1:jwKAn5NtAiV0RZWWcHYfjwc+LUE=
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit