|
|
1
27
相对计时(不应超过100的系数;-)
|
|
|
2
19
函数调用只是将内存中的帧指针移到堆栈上,并在此之上添加一个新帧。函数参数被转移到本地寄存器以供使用,堆栈指针被提升到堆栈的新顶部以执行函数。 与时间相比
函数调用~简单内存访问
|
|
|
3
8
与简单的内存访问相比-稍微多一点,实际上可以忽略不计。 与其他列出的事物相比-数量级更少。 对于任何操作系统上的任何语言,这都应该是正确的。 |
|
|
4
4
一般来说,函数调用比内存访问要慢一些,因为实际上它必须执行多个内存访问才能执行调用。例如,在x86上使用stdcall的大多数函数调用都需要多次推送和弹出堆栈。但是,如果内存访问的页面甚至不在二级缓存中,那么如果目标和堆栈都在CPU的内存缓存中,那么函数调用会更快。 对于其他一切,函数调用的速度都快很多(许多)。 |
|
|
5
3
很难回答,因为涉及很多因素。 首先,“简单内存访问”并不简单。因为在现代时钟速度下,CPU从芯片的一边到另一边(光速——这不仅是一个好主意,而且是规律)增加两个数字的速度比它得到一个数字的速度快。 那么,函数是否在CPU内存缓存中被调用?你也在比较内存访问吗? 然后我们让函数调用清除CPU指令管道,这将以非确定性的方式影响速度。 |
|
|
6
3
假设您指的是调用本身的开销,而不是被调用方可能做的事情,那么它肯定远比除“简单”内存访问之外的所有方法都快。 它可能比内存访问慢,但请注意,由于编译器可以进行内联,函数调用开销有时为零。即使不是这样,至少在某些体系结构上,对指令缓存中已有代码的某些调用可能比访问主(未缓存)内存更快。这取决于在调用之前需要将多少寄存器溢出到堆栈中,诸如此类。请参考编译器和调用约定文档,尽管您不可能比分解发出的代码更快地找到它。 另外请注意,有时“简单”的内存访问不是这样的——如果操作系统必须从磁盘导入页面,那么您就需要等待很长时间。如果您跳到当前在磁盘上调出的代码中,情况也是如此。 如果基础问题是“我应该在什么时候优化代码以最小化所做的函数调用总数?”那么答案是“非常接近永远”。 |
|
|
7
2
这个链接在谷歌中有很多。为了将来的参考,我用C语言运行了一个关于函数调用成本的简短程序,答案是:“大约是内联成本的六倍”。以下是详细信息,请参见底部的//输出。更新:为了更好地比较苹果和苹果,我更改了class1.method以返回“void”,因此:public void method1()//返回0;
使用系统; 使用system.collections.generic; 使用system.linq; 使用system.text; 使用System.Diagnostics; 命名空间函数调用开销 { 类程序 { 静态void main(string[]args) { debug.writeline(“stop1”); int imax=100000000;/100米 datetime funccall1=datetime.now; 秒表sw=stopwatch.startNew();
//类1 使用系统; 使用system.collections.generic; 使用system.linq; 使用system.text; 命名空间函数调用开销 { 班级一班 {
} //输出: 停止1 主功能运行时间(ms)为:595 停止2 helper类函数的运行时间(ms)为:3780 停止1 主功能运行时间(ms)为:592 停止2 助手类函数(ms)的运行时间为:4042 停止1 主功能运行时间(ms)为:626 停止2 helper类函数的运行时间(ms)为:3755 |
|
|
8
1
实际调用函数但不完全执行它的成本?或者实际执行该函数的成本?简单地设置一个函数调用不是一个昂贵的操作(更新PC?)但显然,一个函数的全部执行成本取决于该函数正在做什么。 |
|
|
9
1
让我们不要忘记C++具有虚拟调用(明显更昂贵,关于X10),在Windows上,你可以期待VS来内嵌调用(0的代价是定义,因为二进制中没有调用)。 |
|
10
0
取决于这个函数的功能,如果它对内存中的对象进行逻辑处理,它将在您的列表中排名第二。如果包括磁盘/网络访问,请在列表中进一步列出。 |
|
|
11
0
函数调用通常只涉及两个内存副本(通常是进入寄存器,因此它们不应该占用太多时间),然后是一个跳转操作。这将比内存访问慢,但比上面提到的任何其他操作都快,因为它们需要与其他硬件通信。对于任何操作系统/语言组合,这一点通常都适用。 |
|
|
12
0
如果函数在编译时是内联的,那么函数的开销将等于0。 0当然,如果没有函数调用,你会得到什么,例如:自己内联它。 当然,当我这样写的时候,这听起来非常明显。 |
|
|
13
0
函数调用的成本取决于体系结构。x86速度要慢得多(几个时钟加上每个函数参数的一个时钟左右),而64位则要慢得多,因为大多数函数参数是在寄存器中传递的,而不是在堆栈上传递的。 |
|
|
14
0
函数调用实际上是参数到堆栈(多内存访问)、寄存器保存、实际代码执行以及最终结果复制和寄存器恢复(寄存器保存/恢复取决于系统)的副本。 所以…相对而言:
|
|
|
15
0
只有内存访问比函数调用更快。 但是,如果具有内联优化的编译器(对于GCC编译器,不仅在使用优化的第3级(-O3)时激活),则可以避免调用。 |
|
|
giantjenga · 优化整数向量到二进制向量的转换 1 年前 |
|
|
Daniel Lobo · 使用约束进行优化 1 年前 |
|
Sergio · python中大量数字的乘法 2 年前 |
|
|
Sergey Dev · 临时表与表变量 2 年前 |
|
|
John · 减少C中的内存消耗++ 2 年前 |