HOME

Little test: Exceptions runtime overhead

const int LoopSteps = 1000000;
inline bool CheckError(int i)
{
  return i % 2 == 0;// 123456789;
}

void PartTwo(int& count)
{  
  if (CheckError(count))
    throw 1;
  count++;
}

void PartOne(int& count)
{
  PartTwo(count);
}

void Start(int& count)
{
  PartOne(count);
}

int PartTwo_(int& count)
{
  if (CheckError(count))
    return 1;
  count++;
  return 0;
}

int PartOne_(int& count)
{
  return PartTwo_(count);
}

int Start_(int& count)
{
  return PartOne_(count);
}


void ExceptionTest()
{
  Stopwatch st(true);
  int count = 0;
  int countError = 0;
  for (int i = 0 ; i < LoopSteps; i++)
  {
    try
    {
      Start(count);
    }
    catch(int) 
    { 
      countError++;
      count++;
    } 
  }
  
  std::cout << "ExceptionTest" << std::endl;
  std::cout << st << std::endl;
  std::cout << "Error count " << countError << std::endl;
  std::cout << std::endl;
}

void ReturnCodeTest()
{
  Stopwatch st(true);
  int count = 0;
  int countError = 0;
  for (int i = 0 ; i < LoopSteps; i++)
  {
    if (Start_(count) > 0)
    {  
      countError++;
      count++;
    }
  }
  
  std::cout << "ReturnCodeTest" << std::endl;
  std::cout << st << std::endl;
  std::cout << "Error count " << countError << std::endl;
  std::cout << std::endl;
}


int main()
{
  ExceptionTest();
  ReturnCodeTest();
}
Results: (VC++ 2008)
ExceptionTest
22 ms (running)
Error count 0

ReturnCodeTest
23 ms (running)
Error count 0

Changing CheckError to "return i % 2 == 0":

ExceptionTest
5220 ms (running)
Error count 500000

ReturnCodeTest
11 ms (running)
Error count 500000