Benchmark of try/catch

Sergey Gromov snake.scaly at gmail.com
Mon Mar 23 06:55:44 PDT 2009


Mon, 23 Mar 2009 09:07:16 -0400, bearophile wrote:

> grauzone:
> 
>>From your site:<
> 
> I don't own LiveJournal :-) That's just my blog, my site is elsewhere.
> 
>> Using exceptions in a string->int conversion routine is really horrible and incredibly stupid.<
> 
> I agree that it's not nice looking, but in Python that's the standard idiom.
> In D I do the same thing when I want to know if a string contains an integer or float, with toInt/toFloat, how can I do it with no exceptions?
> 
> Python3 also removes the find() method of strings, and leaves only the index() method, that is like find(), but raise ValueError when the substring is not found. So you are forced to use exceptions here too.
> 
> So far in D I have used exceptions to control flow only once, in this library module (original code idea by Witold Baryluk, modified):
> http://www.fantascienza.net/leonardo/so/dlibs/generators.html

D is designed to make normal execution flow fast and allow error
handling be not-so-fast:

http://www.digitalmars.com/d/2.0/errors.html

so Python idioms simply do not fit.  Different languages require
different idioms, that's my strong opinion.  One really important
benchmark would be something like this:

*********************
*********************
D exceptions

-----main.d-----------------
import worker;
void main() {
  for (int i = 0;; i++) {
    try {
      do_stuff(i);
    } catch (TerminateException e) {
      break;
    }
  }
}
------worker.d----------------
class TerminateException {}
void do_stuff(int i)
{
  if (i == 1_000_000_000)
    throw new TerminateException;
}
-----------------------

*******************
*******************
C++ exceptions

------main.cpp--------------------
#include "worker.h"
int main() {
  for (int i = 0;; i++) {
    try {
      do_stuff(i);
    } catch (const TerminateException & e) {
      break;
    }
  }
  return 0;
}
------worker.h--------------------
struct TerminateException {};
void do_stuff(int i);
------worker.cpp--------------------
#include "worker.h"
void do_stuff(int i)
{
  if (i == 1000000000)
    throw TerminateException();
}
--------------------------

***************
***************
results

D: 5.52s
C++: 4.96s



More information about the Digitalmars-d mailing list