Hi All, I was wonder what are relative costs of a function call and a conditional statement? This is because I'm implementing a state machine as: static media_callback media_cb [EVENT_MAX][STATE_MAX] = { {dummy, media_hide, media_hide, media_hide }, ... }; Should I call the callback like, with dummy function above media_cb[media_event][media_state](a,b,c,d,e,f); Or, is introducing a conditional at the point of call the better solution? (& of course replacing dummy with NULL in media_cb array above) if (media_cb[media_event][media_state] != NULL) media_cb[media_event][media_state](x,y,z); Regards
Function Calls on ARM
Started by ●February 5, 2007
Reply by ●February 5, 20072007-02-05
"holysmoke" <sukrit.mehra@gmail.com> wrote in message news:1170654110.328688.216910@q2g2000cwa.googlegroups.com...> Hi All, > > I was wonder what are relative costs of a function call and a > conditional statement?A function call is usually more expensive on most CPUs - consider that a call implies 2 branches while a conditional statement is less than 1 branch. However calls are easier to predict on CPUs with branch prediction so if the conditional branch mispredicts often, it will be slower.> Should I call the callback like, with dummy function above > > media_cb[media_event][media_state](a,b,c,d,e,f); > > Or, is introducing a conditional at the point of call the better > solution? (& of course replacing dummy with NULL in media_cb array > above) > > if (media_cb[media_event][media_state] != NULL) > media_cb[media_event][media_state](x,y,z);Nobody but you can answer that question. It depends on the relative frequency of the dummy functions vs real functions, how much time is spent in the rest of the code, the exact CPU used and the compiler used (& settings). Benchmark your code to get the answer. Wilco
Reply by ●February 5, 20072007-02-05
holysmoke <sukrit.mehra@gmail.com> wrote:> > I was wonder what are relative costs of a function call and a > conditional statement? >This depends on a lot of things. Calls tend to be more expensive then branches, and both have different instruction cache behaviour as well. If you want to be sure, write some test code and measure. -- :wq ^X^Cy^K^X^C^C^C^C
Reply by ●February 5, 20072007-02-05
On 4 Feb 2007 21:41:50 -0800, "holysmoke" <sukrit.mehra@gmail.com> wrote:>Should I call the callback like, with dummy function above > >media_cb[media_event][media_state](a,b,c,d,e,f); > >Or, is introducing a conditional at the point of call the better >solution? (& of course replacing dummy with NULL in media_cb array >above) > >if (media_cb[media_event][media_state] != NULL) > media_cb[media_event][media_state](x,y,z);From the readability I'd go for the dummy function. Using ARM mode does not add a branch since the call could be conditional. What core does the code run on ? Do you have caches ? -- 42Bastian Do not email to bastian42@yahoo.com, it's a spam-only account :-) Use <same-name>@monlynx.de instead !
Reply by ●February 5, 20072007-02-05
On Feb 5, 9:39 pm, bastia...@yahoo.com (42Bastian Schick) wrote:> On 4 Feb 2007 21:41:50 -0800, "holysmoke" <sukrit.me...@gmail.com> > wrote: > > >Should I call the callback like, with dummy function above > > >media_cb[media_event][media_state](a,b,c,d,e,f); > > >Or, is introducing a conditional at the point of call the better > >solution? (& of course replacing dummy with NULL in media_cb array > >above) > > >if (media_cb[media_event][media_state] != NULL) > > media_cb[media_event][media_state](x,y,z); > > From the readability I'd go for the dummy function. > > Using ARM mode does not add a branch since the call could be > conditional. > > What core does the code run on ? Do you have caches ?It runs on a ARM9, not sure about the cache bit. Regards