Исследование эффективности способов работы с динамическими массивами
Авторы: Коптенок Елизавета Викторовна, Капчерина Алина Алексеевна, Пескова Марина Юрьевна, Лядов Вячеслав Сергеевич, Дудлин Андрей Дмитриевич
Рубрика: Информатика и кибернетика
Опубликовано в Техника. Технологии. Инженерия №1 (15) февраль 2020 г.
Дата публикации: 28.01.2020
Статья просмотрена: 45 раз
Библиографическое описание:
Исследование эффективности способов работы с динамическими массивами / Е. В. Коптенок, А. А. Капчерина, М. Ю. Пескова [и др.]. — Текст : непосредственный // Техника. Технологии. Инженерия. — 2020. — № 1 (15). — С. 1-5. — URL: https://moluch.ru/th/8/archive/152/4838/ (дата обращения: 23.12.2024).
При работе с массивами часто возникает ситуация, когда количество элементов заранее неизвестно. Именно в таких случаях используют динамические массивы. При создании массива выделяется участок памяти, дальнейшая работа с массивом происходит через указатель на этот участок памяти.
В основном для работы с динамическими массивами используются обычные указатели, но иногда возникают ситуации, в которых их использование неэффективно. Такое часто случается из-за того, что обычный указатель не имеет встроенного механизма самостоятельной отчистки памяти, что приводит к ее утечке. Для решения этой проблемы можно использовать умные указатели.
Умный указатель — это класс, предназначенный для управления динамически выделенной памятью и обеспечения освобождения выделенной памяти при выходе объекта этого класса из области видимости. Стандартная библиотека в C++11 имеет 4 класса умных указателей:
– std::auto_ptr (удалён в C++17);
– std::unique_ptr;
– std::shared_ptr;
– std::weak_ptr.
Указателем на уникальный объект является std::unique_ptr, а std::shared_ptr и std::weak_ptr — указатели на объекты, которыми могут владеть сразу несколько объектов.
Цель данной статьи — выяснить, оказывает ли влияние на скорость выполнения алгоритма использование умных указателей. Сравнение проводилось на следующих алгоритмах:
- поиск минимального элемента;
- обмен местами соседних элементов;
- умножение отрицательных элементов на 10;
- циклический сдвиг на 5 позиций.
Использовались: обычный указатель, std::unique_ptr и std::shared_ptr. Для каждого из них был создан массив из 100000 случайных чисел. Выполнялись многократные замеры времени выполнения алгоритмов и вычислялось их среднее значение. В таблице 1 представлено, сколько секунд выполнялся каждый алгоритм в зависимости от типа указателя.
Таблица 1
Среднее время выполнения алгоритмов для 100000элементов
Тип указателя |
Среднее время всекундах |
|||
Поиск минимума |
Обмен соседних элементов |
Умножение отрицательных элементов на 10 |
Циклический сдвиг |
|
Обычный |
0.0004 |
0.0009 |
0.0011 |
0.0023 |
Умный уникальный |
0.0174 |
0.0625 |
0.0258 |
0.1532 |
Умный неуникальный |
0.0101 |
0.0382 |
0.0187 |
0.0791 |
По диаграмме (рис.1) видно, что по времени наиболее эффективно использование обычных указателей. Умный неуникальный указатель менее эффективен, чем обычный, но более эффективен, чем умный уникальный указатель. Также можно заметить, что применение умных указателей при поиске минимума или умножении отрицательных элементов на число занимает в обоих случаях примерно одинаковое время, но умный неуникальный указатель все равно оказывается выгоднее.
Аналогичный эксперимент проведен для массива из 1000000 элементов. Результаты представлены в табл.2. и на диаграмме (рис.2).
Таблица 2
Среднее время выполнения алгоритмов для 1000000элементов
Тип указателя |
Среднее время всекундах |
|||
Поиск минимума |
Обмен соседних элементов |
Умножение отрицательных элементов на 10 |
Циклический сдвиг |
|
Обычный |
0.0041 |
0.0076 |
0.0104 |
0.0282 |
Умный уникальный |
0.1764 |
0.6594 |
0.2319 |
1.7386 |
Умный неуникальный |
0.094 |
0.3377 |
0.1386 |
0.8397 |
Рис. 1. Среднее время выполнения алгоритмов для 100000 элементов
Диаграммы на рис.1 и рис.2. иллюстрируют одинаковую зависимость, следовательно, эффективность использования рассмотренных типов указателей аналогична предыдущему случаю.
Таким образом, можно сделать вывод: наиболее эффективным по времени для данных алгоритмов оказалось использование обычных указателей, наименьшей эффективностью обладают умные уникальные указатели, а умные неуникальные указатели имеют преимущество перед уникальными, но проигрывают обычным указателям.
Рис. 2. Среднее время выполнения алгоритмов для 1000000 элементов
Литература:
- Интеллектуальные указатели (современный C++) [Электронный ресурс]. — https://docs.microsoft.com/ru-ru/cpp/cpp/smart-pointers-modern-cpp?view=vs-2019
- Массивы (C++) [Электронный ресурс]. — https://docs.microsoft.com/ru-ru/cpp/cpp/arrays-cpp?view=vs-2017
- Павловская Т. А. П12 С#. Программирование на языке высокого уровня. Учебник для вузов. — СПб.: Питер, 2009. — 432 с: ил.