我有以下代码,包含两个函数,一个用于分配静态数组,另一个用于在堆栈上分配数组。这些函数运行很多次并计算它们的执行时间。堆栈分配始终(略微)快于静态分配。我的印象是,因为静态变量在运行时被绑定,它的执行速度比在堆栈上分配的数组要快
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAX_ARRAY 8192
void statArray()
{
static int statArray[MAX_ARRAY];
}
void stackArray()
{
int stackArray[MAX_ARRAY];
}
int main(int argc, char * argv[]) {
clock_t start, end;
double staticTime, stackTime;
int i;
int comparisons = 5000000;
start = clock();
for (i = 0; i < comparisons; i++) {
statArray();
}
end = clock()-start;
staticTime = (double)end / CLOCKS_PER_SEC;
start = clock();
for (i = 0; i < comparisons; i++) {
stackArray();
}
end = clock() - start;
stackTime = (double) end / CLOCKS_PER_SEC;
由于
反汇编statArray
0x0000000000400594 <+0>: push %rbp
0x0000000000400595 <+1>: mov %rsp,%rbp
0x0000000000400598 <+4>: leaveq
0x0000000000400599 <+5>: retq
反汇编的stackArray
0x000000000040059a <+0>: push %rbp
0x000000000040059b <+1>: mov %rsp,%rbp
0x000000000040059e <+4>: sub $0x7f88,%rsp
0x00000000004005a5 <+11>: leaveq
0x00000000004005a6 <+12>: retq
答案 0 :(得分:3)
正如您在汇编列表中看到的那样,statArray是一个空函数,stackArray包含单个分配指令(sub rbp,imm)。该指令的时间效应可能隐藏在序言/结尾指令的延迟中,并且差异只能用cpu温度计来测量。您遇到的实际差异是由于轻微的时间测量错误,如果您交换代码块的顺序可能会改变。
编辑:值得注意的是,堆栈分配只不过是通过从堆栈指针寄存器中减去来修复堆栈顶部而不涉及任何复杂的逻辑(与malloc相对),而静态vs堆栈“速度”似乎是一种常见的误解。