分配给堆与堆栈的执行时间有什么不同?

时间:2011-11-03 13:56:41

标签: c++ performance

我在作业中对这个问题有点困惑: 用C或C ++编写三个函数:一个静态声明一个大数组,一个在堆栈上声明相同的大数组,另一个从堆中创建相同的大数组。每次调用每个子程序{至少100,000次}并输出每个子程序所需的时间。解释结果。

    int main(void)  
{
    int staticIntArray[ARRAY_SIZE];//array on the stack
    int *ptrArray = new int[ARRAY_SIZE]; // pointer on the stack but array on the heap.
    double timeItTakes;
    clock_t tStart = clock();
    fillWithRandomNumbers(staticIntArray, ARRAY_SIZE);
    double time = static_cast<double>(clock() - static_cast<double>(tStart)/static_cast<double>(CLOCKS_PER_SEC));
    printf ("Array on stack time is %.10f\n", time);
    clock_t tStart2 = clock();
    fillWithRandomNumbers(ptrArray, ARRAY_SIZE);
    double time2 = static_cast<double>(clock() - static_cast<double>(tStart2)/static_cast<double>(CLOCKS_PER_SEC));
    printf ("Array on heap time is %.10f\n", time2);
    //cout << "Array on the heap time is " << (timeIntStack - time(NULL));
}
void fillWithRandomNumbers(int intArray[], int size)
{
    for(int i = 0; i<size; i++)
        intArray[i] = rand();
}

输出结果为:

Array on stack time is 1.9990000000
Array on heap time is 2.9980000000
Press any key to continue . . .

我理解的是,堆栈是用于局部变量和参数的小得多的内存分配,而堆是动态分配的内存的大型池。这是我的问题...... 使用随机类会影响函数执行所需的时间吗?是否在堆栈上分配大型数组的速度较慢,因为可用内存较少?

我不是要求你做我的作业,但我只是需要一些帮助来澄清这些概念......任何帮助都会非常感激......

3 个答案:

答案 0 :(得分:6)

首先,请允许我轻微咆哮。

分配 - 可能是在C ++编程类中 - 是一个糟糕的。它将您的注意力转移到动态分配与静态或自动分配的性能影响上,但这不是主要的原因,您应该选择一种形式的分配而不是另一种形式。相反,在决定如何分配一块内存时,应该在性能之前考虑除了所有权语义之外的生命周期和可见性要求。即使抛开这个论点,测试仍然无效,因为你运行代码的硬件,数组中各个元素的大小和数组本身,操作系统,内核在分配时如何阻塞以及编译器的优化是允许使用都会影响您编写的任何真实代码的执行速度。但是这个任务似乎暗示你应该总结,“看?动态分配是慢的。我们永远不应该使用它。”这种推理是不正确的,并教你采用过早的优化。

好的,我的咆哮结束了。

关于你的作业。你做错了两件事。

  1. 分配从不要求您填充数组。
  2. 分配要求您分配10k次数组,但您只需要执行一次。
  3. (Bonus!)赋值不会要求您释放动态分配的数组 - 但它应该。

答案 1 :(得分:3)

您只是在程序开始时分配一次数组,并且只在fillWithRandomNumbers循环中写入它们的内容。该计划根本没有衡量分配;为此,new运算符应该在循环中。

尝试按照此处的分配:编写三个函数,每个函数以不同的方式分配数组。

答案 2 :(得分:1)

首先,你没有做任务要求的事。

第二,你应该期望堆栈分配更快,因为内部唯一的事情是移动堆栈指针。