调用一个函数的花销大吗
调用一个函数的开销大吗?
书上说,调用函数有一定的时间开销。所以如果函数很简单,可以把它定义为内联函数,这样实际上并没有函数调用,只是把代码嵌入到调用的地方而已。
我想问的是:函数调用的开销有多大?按照我的想象:就是把几个参数压入堆栈,然后一个跳转指令,就开始执行了。执行完了,再跳转回来,似乎开销并不大。
我们算一笔帐,现在的CPU主频有几个G,就算2G吧,那一秒钟就有20亿个时钟周期,把几个参数压入堆栈需要花多长时间?一个参数只需要一到两个最后两到三个时钟周期就够了,再加上跳转指令,最后再跳回来。就算总共20个时间周期吧,那也就亿分之一秒就完成了。
这样算来,函数调用的开销并不大。
我担心的是函数调用是不是还有别的开销,是不是要建立新的堆栈?或者还有什么别的我不知道的开销?
请达人指教,函数调用的时间开销大不大?亿分之一秒能完成吗?
------解决思路----------------------
回答一个问题:不需要建新堆栈!程序加载运行时候,堆栈已经建立完成。OS分配固定大小栈。直到程序消亡才收回这部分栈所占内存。效率是个相对而言的话题,具体问题具体分析,折中吧!
------解决思路----------------------
这里涉及的东西太多了
对于现代CPU来说,跳转会造成指令预取队列失效,所以优化掉跳转,很多时候能够加快代码执行效率。
但是任何事情都不是绝对的,就像#12楼所述Cache失效,也会影响效率
不过一般跳转,也有可能造成Cache失效,
所以没法直接笼统的确定,何种情况效率更高。
一般都是都是根据具体环境决定的。
多数情况下,inline 比非inline 效率高
但是并非总是这样。
书上说,调用函数有一定的时间开销。所以如果函数很简单,可以把它定义为内联函数,这样实际上并没有函数调用,只是把代码嵌入到调用的地方而已。
我想问的是:函数调用的开销有多大?按照我的想象:就是把几个参数压入堆栈,然后一个跳转指令,就开始执行了。执行完了,再跳转回来,似乎开销并不大。
我们算一笔帐,现在的CPU主频有几个G,就算2G吧,那一秒钟就有20亿个时钟周期,把几个参数压入堆栈需要花多长时间?一个参数只需要一到两个最后两到三个时钟周期就够了,再加上跳转指令,最后再跳回来。就算总共20个时间周期吧,那也就亿分之一秒就完成了。
这样算来,函数调用的开销并不大。
我担心的是函数调用是不是还有别的开销,是不是要建立新的堆栈?或者还有什么别的我不知道的开销?
请达人指教,函数调用的时间开销大不大?亿分之一秒能完成吗?
------解决思路----------------------
回答一个问题:不需要建新堆栈!程序加载运行时候,堆栈已经建立完成。OS分配固定大小栈。直到程序消亡才收回这部分栈所占内存。效率是个相对而言的话题,具体问题具体分析,折中吧!
------解决思路----------------------
这里涉及的东西太多了
对于现代CPU来说,跳转会造成指令预取队列失效,所以优化掉跳转,很多时候能够加快代码执行效率。
但是任何事情都不是绝对的,就像#12楼所述Cache失效,也会影响效率
不过一般跳转,也有可能造成Cache失效,
所以没法直接笼统的确定,何种情况效率更高。
一般都是都是根据具体环境决定的。
多数情况下,inline 比非inline 效率高
但是并非总是这样。