Aquí está el código de medición que se me ocurrió. ¿Ves algún problema con eso?
funciona en Linux y Windows hasta ahora, compilar con:
g++ exception_handling.cpp -o exception_handling [ -O2 ]
o, por ejemplo Visual C++ Express.
para que el caso base ("apoyo excepción eliminado por completo de la lengua"), utilice:
g++ exception_handling.cpp -o exception_handling [ -O2 ] -fno-exceptions -DNO_EXCEPTIONS
o similares ajustes en MSVC.
Algunos resultados preliminares here. Es probable que todos sean aburridos debido a la carga variable de la máquina, pero dan alguna idea sobre la relativa sobrecarga de manejo de excepciones. (Resumen Ejecutivo: ninguno o poco cuando no se lanzan excepciones, enorme, cuando en realidad se tiran.)
#include <stdio.h>
// Timer code
#if defined(__linux__)
#include <sys/time.h>
#include <time.h>
double time()
{
timeval tv;
gettimeofday(&tv, 0);
return 1.0 * tv.tv_sec + 0.000001 * tv.tv_usec;
}
#elif defined(_WIN32)
#include <windows.h>
double get_performance_frequency()
{
unsigned _int64 frequency;
QueryPerformanceFrequency((LARGE_INTEGER*) &frequency); // just assume it works
return double(frequency);
}
double performance_frequency = get_performance_frequency();
double time()
{
unsigned _int64 counter;
QueryPerformanceCounter((LARGE_INTEGER*) &counter);
return double(counter)/performance_frequency;
}
#else
# error time() not implemented for your platform
#endif
// How many times to repeat the whole test
const int repeats = 10;
// How many times to iterate one case
const int times = 1000000;
// Trick optimizer to not remove code
int result = 0;
// Case 1. No exception thrown nor handled.
void do_something()
{
++result;
}
void case1()
{
do_something();
}
// Case 2. No exception thrown, but handler installed
#ifndef NO_EXCEPTIONS
void do_something_else()
{
--result;
}
void case2()
{
try
{
do_something();
}
catch (int exception)
{
do_something_else();
}
}
// Case 3. Exception thrown and caught
void do_something_and_throw()
{
throw ++result;
}
void case3()
{
try
{
do_something_and_throw();
}
catch (int exception)
{
result = exception;
}
}
#endif // !NO_EXCEPTIONS
void (*tests[])() =
{
case1,
#ifndef NO_EXCEPTIONS
case2,
case3
#endif // !NO_EXCEPTIONS
};
int main()
{
#ifdef NO_EXCEPTIONS
printf("case0\n");
#else
printf("case1\tcase2\tcase3\n");
#endif
for (int repeat = 0; repeat < repeats; ++repeat)
{
for (int test = 0; test < sizeof(tests)/sizeof(tests[0]); ++test)
{
double start = time();
for (int i = 0; i < times; ++i)
tests[test]();
double end = time();
printf("%f\t", (end - start) * 1000000.0/times);
}
printf("\n");
}
return result; // optimizer is happy - we produce a result
}
Me interesarán los resultados en su plataforma ... –
¿Intentó hacer una prueba en la que atraparía alguna excepción (captura (...)). Puede ser diferente a la captura de una sola clase de excepción ... –