Какая разница во времени выполнения для выделения кучи против стека? - PullRequest
3 голосов
/ 03 ноября 2011

Я немного застрял в этом домашнем задании на этот вопрос: Напишите три функции на 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 ]

6 голосов
/ 03 ноября 2011

Во-первых, позвольте мне немного разглагольствовать.

Назначение - предположительно в классе программирования C ++ - плохое.Это отвлекает ваше внимание на влияние динамического распределения на производительность по сравнению со статическим или автоматическим распределением, но это не является основной причиной, по которой вам следует выбирать одну форму распределения вместо другой.Скорее, требования к сроку службы и видимости в дополнение к семантике владения должны учитываться задолго до производительности при принятии решения о том, как распределить часть памяти.Даже если отбросить этот аргумент в сторону, тест по-прежнему недействителен, потому что аппаратное обеспечение, на котором вы запускаете код, размер отдельных элементов в массиве и сам массив, операционная система, то, как блокируется ядро ​​при выделении, и оптимизация компилятораразрешенное использование - все это влияет на скорость выполнения в любом реальном коде, который вы пишете.Но это назначение, похоже, предполагает, что вы должны сделать вывод: «Видите? Динамическое распределение медленнее. Мы никогда не должны его использовать».Это рассуждение неверно и учит вас использовать преждевременную оптимизацию.

ОК, конец моей напыщенной речи.

На вашем задании.Вы ошибаетесь в двух основных вещах.

  1. Присвоение никогда не запрашивает заполнение массива.
  2. Присвоение просит вас выделить массивы 10k раз,но вы делаете это только один раз.
  3. (Бонус!) Присвоение не просит вас освободить динамически распределенный массив - но оно должно.
3 голосов
/ 03 ноября 2011

Вы выделяете свои массивы только один раз, в начале программы, и только записываете их содержимое в цикл fillWithRandomNumbers.Программа вообще не измеряла распределение;чтобы это произошло, оператор new должен был находиться внутри цикла.

Попробуйте выполнить здесь следующее задание: напишите три функции , каждая из которых выделяет массив по-своему.

1 голос
/ 03 ноября 2011

Сначала вы не выполняете то, о чем просит назначение.

Во-вторых, вы должны ожидать, что выделение стека будет намного быстрее, поскольку единственное, что делает внутренне, - это перемещает указатель стека.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...