Jump to content

  • Log In with Google      Sign In   
  • Create Account


#Actualfrob

Posted 29 April 2013 - 11:55 AM

There are actually two things.

 

First, the average cost of those function call.

 

It is something very specific to the hardware and the compiler combination.  It is something that lots of people have researched and measured over the years.  

 

However, since compilers have converged on the near-optimal case for function calls, and since processor speeds have basically top-lined around 2.5-3.0 GHz range a decade ago, the timing remains basically unchanged.

 

The amortized cost of an optimized build function call is approximately 7 nanoseconds overhead per function call, vs. the cost of direct access.  There is an additional approximately 7 nanoseconds overhead for virtual functions.

 

Again, for an optimized build, non-virtual functions generally average around 7ns each, virtual functions generally average around 14ns each.

 

Assuming you have all optimizations enabled in your code and it has been either directly compiled or JIT-optimized, you will probably see similar results.

 

 

 

Now for the bigger issue.

 

Your code has a nasty code smell.  It is often called "inappropriate intimacy".  The solution pattern is called the Law of Demeter, where basically you should only talk to the objects immediately available to you.  The most you should do is a.b().  

 

You have a.b().c().d().e().f(), which is less of a a 'code smell' and more like a reeking 2-day-old diaper.  Don't do that.


#1frob

Posted 29 April 2013 - 11:53 AM

There are actually two things.

 

First, the average cost of those function call.

 

It is something very specific to the hardware and the compiler combination.  It is something that lots of people have researched and measured over the years.  

 

However, since compilers have converged on the near-optimal case for function calls, and since processor speeds have basically top-lined around 2.5-3.0 GHz range a decade ago, the timing remains basically unchanged.

 

The amortized cost of a virtual function call --- that is, the time to find the index of the function and then call it --- is approximately 7 nanoseconds overhead per function call, vs. the cost of direct access.  There is an additional approximately 7 nanoseconds overhead for virtual functions.

 

I'm guessing your functions will be about the same as that long-held average.  For non-virtual functions they will probably average around 7ns each, for virtual functions they will probably average around 14ns each.

 

 

 

Now for the bigger issue.

 

Your code has a nasty code smell.  It is often called "inappropriate intimacy".  The solution pattern is called the Law of Demeter, where basically you should only talk to the objects immediately available to you.  The most you should do is a.b().  

 

You have a.b().c().d().e().f(), which is less of a a 'code smell' and more like a reeking 2-day-old diaper.  Don't do that.


PARTNERS