Jump to content

Алгоритмическая эффективность

(Перенаправлено с «Вычислительно эффективно »)

В информатике используемых алгоритмическая эффективность — это свойство алгоритма , которое связано с количеством вычислительных ресурсов, алгоритмом. Алгоритмическую эффективность можно рассматривать как аналог производительности разработки для повторяющегося или непрерывного процесса.

Для максимальной эффективности желательно минимизировать использование ресурсов. Однако различные ресурсы, такие как временная и пространственная сложность, нельзя сравнивать напрямую, поэтому какой из двух алгоритмов считается более эффективным, часто зависит от того, какой показатель эффективности считается наиболее важным.

Например, пузырьковая сортировка и временная сортировка — это алгоритмы сортировки списка элементов от меньшего к большему. Пузырьковая сортировка упорядочивает список за время, пропорциональное количеству элементов в квадрате ( , см. обозначение Big O ), но требует лишь небольшого объема дополнительной памяти , которая постоянна относительно длины списка ( ). Timsort сортирует список линейно по времени (пропорционально количеству, умноженному на его логарифм) по длине списка ( ), но требует пространства , линейно зависящего от длины списка ( ). Если для данного приложения необходимо сортировать большие списки с высокой скоростью, лучшим выбором будет timsort; однако, если минимизация потребления памяти при сортировке более важна, лучшим выбором будет пузырьковая сортировка.

Важность эффективности по отношению ко времени была подчеркнута Адой Лавлейс в 1843 году применительно к Чарльза Бэббиджа механической аналитической машине :

«Почти в каждом вычислении возможно большое разнообразие схем последовательности процессов, и на выбор среди них для целей вычислительной машины должны влиять различные соображения. Одной из важнейших задач является выбор такой схемы, которая будет иметь тенденцию сводиться к минимум времени, необходимого для завершения расчета» [1]

Ранние электронные компьютеры имели ограниченную скорость и ограниченную оперативную память . Таким образом, произошел компромисс между пространством и временем . Задача может использовать быстрый алгоритм , использующий большой объем памяти, или медленный алгоритм, использующий мало памяти. Поэтому инженерным компромиссом было использование самого быстрого алгоритма, который мог поместиться в доступную память.

Современные компьютеры значительно быстрее ранних компьютеров и имеют гораздо больший объем доступной памяти ( гигабайты вместо килобайтов ). Тем не менее, Дональд Кнут подчеркнул, что эффективность по-прежнему является важным фактором:

«В устоявшихся инженерных дисциплинах легко достижимое улучшение на 12% никогда не считается незначительным, и я считаю, что такая же точка зрения должна преобладать в разработке программного обеспечения». [2]

Алгоритм считается эффективным, если его потребление ресурсов, также известное как вычислительные затраты, находится на некотором приемлемом уровне или ниже. Грубо говоря, «приемлемый» означает: он будет работать в течение разумного периода времени или пространства на доступном компьютере, обычно в зависимости от размера входных данных. С 1950-х годов в компьютерах произошел резкий рост как доступной вычислительной мощности, так и доступного объема памяти, поэтому текущие приемлемые уровни были бы неприемлемы даже 10 лет назад. Фактически, благодаря приблизительному удвоению мощности компьютеров каждые 2 года , задачи, которые приемлемо эффективны на современных смартфонах и встроенных системах, могли быть неприемлемо неэффективны для промышленных серверов 10 лет назад.

Производители компьютеров часто выпускают новые модели, часто с более высокой производительностью . Затраты на программное обеспечение могут быть довольно высокими, поэтому в некоторых случаях самым простым и дешевым способом повышения производительности может быть просто покупка более быстрого компьютера, при условии, что он совместим с существующим компьютером.

Существует множество способов измерения ресурсов, используемых алгоритмом: двумя наиболее распространенными показателями являются скорость и использование памяти; другие меры могут включать скорость передачи, временное использование диска, долгосрочное использование диска, энергопотребление, общую стоимость владения , время реакции на внешние воздействия и т. д. Многие из этих показателей зависят от размера входных данных для алгоритма, т. е. объем данных, подлежащих обработке. Они также могут зависеть от способа организации данных; например, некоторые алгоритмы сортировки плохо работают с данными, которые уже отсортированы или отсортированы в обратном порядке.

На практике существуют и другие факторы, которые могут повлиять на эффективность алгоритма, например требования к точности и/или надежности. Как подробно описано ниже, способ реализации алгоритма также может оказать существенное влияние на фактическую эффективность, хотя многие аспекты этого связаны с оптимизации проблемами .

Теоретический анализ

[ редактировать ]

При теоретическом анализе алгоритмов обычной практикой является оценка их сложности в асимптотическом смысле. Наиболее часто используемая нотация для описания потребления ресурсов или «сложности» — это Кнута Дональда нотация Big O , представляющая сложность алгоритма как функцию размера входных данных. . Обозначение Big O — это асимптотическая мера сложности функции, где грубо означает, что время, необходимое для алгоритма, пропорционально , опуская члены низшего порядка , вклад которых меньше к росту функции как вырастает сколь угодно большим . Эта оценка может ввести в заблуждение, если мала, но, как правило, достаточно точна, когда велико, поскольку обозначения асимптотические. Например, пузырьковая сортировка может быть быстрее сортировки слиянием, если необходимо отсортировать только несколько элементов; однако любая реализация, скорее всего, будет соответствовать требованиям к производительности для небольшого списка. Обычно программисты интересуются алгоритмами, которые эффективно масштабируются для больших размеров входных данных, и сортировка слиянием предпочтительнее пузырьковой сортировки для списков длины, встречающихся в большинстве программ с интенсивным использованием данных.

Некоторые примеры нотации Big O, применяемой к асимптотической временной сложности алгоритмов, включают:

Обозначения Имя Примеры
постоянный Нахождение медианы из отсортированного списка измерений; постоянного размера Использование таблицы поиска ; Использование подходящей хэш-функции для поиска элемента.
логарифмический Поиск элемента в отсортированном массиве с помощью двоичного поиска или сбалансированного дерева поиска , а также всех операций в биномиальной куче .
линейный Поиск элемента в несортированном списке, искаженном дереве (в худшем случае) или в несортированном массиве; Сложение двух n -битных целых чисел методом пульсирующего переноса .
линейный , логлинейный или квазилинейный Выполнение быстрого преобразования Фурье ; пирамидальная сортировка , быстрая сортировка ( лучший и средний случай ) или сортировка слиянием
квадратичный Умножение двух n -значных чисел по простому алгоритму ; пузырьковая сортировка (худший случай или примитивная реализация), сортировка Шелла , быстрая сортировка ( худший случай ), сортировка выбором или сортировка вставкой
экспоненциальный Нахождение оптимального (неприближенного ) решения задачи коммивояжера с помощью динамического программирования ; определение эквивалентности двух логических утверждений с помощью перебора

Измерение производительности

[ редактировать ]

Для новых версий программного обеспечения или для сравнения с конкурирующими системами иногда используются тесты , которые помогают оценить относительную производительность алгоритмов. если создан новый алгоритм сортировки Например, , его можно сравнить с его предшественниками, чтобы убедиться, что он, по крайней мере, по-прежнему эффективен с известными данными, принимая во внимание любые функциональные улучшения. Клиенты могут использовать эталонные тесты при сравнении различных продуктов от альтернативных поставщиков, чтобы оценить, какой продукт лучше всего соответствует их конкретным требованиям с точки зрения функциональности и производительности. Например, в мире мэйнфреймов некоторые проприетарные продукты сортировки от независимых компаний-разработчиков программного обеспечения, таких как Syncsort, с продуктами таких крупных поставщиков, как IBM конкурируют за скорость .

Некоторые тесты предоставляют возможности для проведения анализа, сравнивающего относительную скорость различных компилируемых и интерпретируемых языков, например [3] [4] и The Computer Language Benchmarks Game сравнивает производительность реализаций типичных задач программирования на нескольких языках программирования.

Даже создание тестов « сделай сам » может продемонстрировать относительную производительность различных языков программирования, используя множество критериев, заданных пользователем. Это довольно просто, как показывает на примере «Обзор производительности девяти языков» Кристофера Коуэлла-Шаха. [5]

Проблемы реализации

[ редактировать ]

Проблемы реализации также могут влиять на эффективность, например, выбор языка программирования или способа фактического кодирования алгоритма. [6] или выбор компилятора для определенного языка, или используемые параметры компиляции , или даже операционную систему используемую . Во многих случаях язык, реализованный интерпретатором , может быть намного медленнее, чем язык, реализованный компилятором. [3] См. статьи о JIT-компиляции и интерпретируемых языках .

Существуют и другие факторы, которые могут влиять на проблемы времени или пространства, но могут находиться вне контроля программиста; к ним относятся выравнивание данных , гранулярность данных , локальность кэша , согласованность кэша , сбор мусора , параллелизм на уровне инструкций , многопоточность (на аппаратном или программном уровне), одновременная многозадачность и подпрограмм . вызовы [7]

Некоторые процессоры имеют возможности векторной обработки , которые позволяют одной инструкции работать с несколькими операндами ; Программисту или компилятору может быть легко или сложно использовать эти возможности. Алгоритмы, разработанные для последовательной обработки, возможно, придется полностью перепроектировать для использования параллельной обработки , или их можно легко переконфигурировать. Поскольку в конце 2010-х годов важность параллельных и распределенных вычислений растет, все больше инвестиций делается в эффективные высокоуровневые API для параллельных и распределенных вычислительных систем, таких как CUDA , TensorFlow , Hadoop , OpenMP и MPI .

Другая проблема, которая может возникнуть при программировании, заключается в том, что процессоры, совместимые с одним и тем же набором команд (например, x86-64 или ARM ), могут реализовывать инструкции по-разному, поэтому инструкции, которые относительно быстры на некоторых моделях, могут быть относительно медленными на других моделях. . Это часто создает проблемы для оптимизации компиляторов , которые должны обладать обширными знаниями о конкретном процессоре и другом оборудовании, доступном в цели компиляции, чтобы наилучшим образом оптимизировать производительность программы. В крайнем случае компилятор может быть вынужден эмулировать инструкции, не поддерживаемые на целевой платформе компиляции, заставляя его генерировать код или связывать вызов внешней библиотеки для получения результата, который в противном случае не поддается вычислению на этой платформе, даже если он поддерживается изначально. и более эффективен в аппаратном обеспечении на других платформах. Это часто имеет место во встроенных системах в отношении арифметики с плавающей запятой , где небольшие и маломощные микроконтроллеры часто не имеют аппаратной поддержки арифметики с плавающей запятой и, следовательно, требуют дорогостоящих в вычислительном отношении программных процедур для выполнения вычислений с плавающей запятой.

Меры использования ресурсов

[ редактировать ]

Меры обычно выражаются как функция размера входных данных. .

Двумя наиболее распространенными мерами являются:

  • Время : сколько времени занимает выполнение алгоритма?
  • Пространство : сколько оперативной памяти (обычно ОЗУ) необходимо алгоритму? Это имеет два аспекта: объем памяти, необходимый коду (использование вспомогательного пространства), и объем памяти, необходимый для данных, с которыми работает код (внутреннее использование пространства).

Для компьютеров, питание которых осуществляется от аккумулятора (например, ноутбуков и смартфонов ) или для очень длительных/больших вычислений (например, суперкомпьютеров ), представляют интерес другие меры:

  • Прямое энергопотребление : мощность, необходимая непосредственно для работы компьютера.
  • Косвенное энергопотребление : мощность, необходимая для охлаждения, освещения и т. д.

По состоянию на 2018 год Энергопотребление растет как важный показатель для вычислительных задач всех типов и во всех масштабах: от встроенных Интернета вещей устройств до системных устройств и серверных ферм . Эту тенденцию часто называют « зелеными вычислениями» .

Менее распространенные меры вычислительной эффективности также могут быть актуальны в некоторых случаях:

  • Размер передачи : пропускная способность может быть ограничивающим фактором. Сжатие данных можно использовать для уменьшения объема передаваемых данных. Отображение изображения или изображения (например, логотипа Google ) может привести к передаче десятков тысяч байтов (в данном случае 48 КБ) по сравнению с передачей шести байтов для текста «Google». Это важно для вычислительных задач, связанных с вводом-выводом .
  • Внешнее пространство : необходимое пространство на диске или другом внешнем запоминающем устройстве; это может быть временное хранение во время выполнения алгоритма или долгосрочное хранение, необходимое для дальнейшего использования.
  • Время отклика ( задержка ): это особенно актуально в приложении реального времени , когда компьютерная система должна быстро реагировать на какое-то внешнее событие .
  • Общая стоимость владения : особенно если компьютер предназначен для одного конкретного алгоритма.

Анализ алгоритмов , обычно с использованием таких понятий, как временная сложность , может использоваться для получения оценки времени работы как функции размера входных данных. Результат обычно выражается с использованием нотации Big O. Это полезно для сравнения алгоритмов, особенно когда необходимо обработать большой объем данных. Для сравнения производительности алгоритма при небольшом объеме данных необходимы более подробные оценки, хотя это, вероятно, будет иметь меньшее значение. Параллельные алгоритмы может быть сложнее анализировать .

Упражняться

[ редактировать ]

Тест можно использовать для оценки производительности алгоритма на практике. Многие языки программирования имеют доступную функцию, которая обеспечивает использование процессорного времени . Для долговыполняющихся алгоритмов также может представлять интерес затраченное время. Результаты обычно следует усреднять по нескольким тестам.

Профилирование на основе запуска может быть очень чувствительным к конфигурации оборудования и возможности одновременного запуска других программ или задач в многопроцессорной и многопрограммной среде.

Этот вид теста также во многом зависит от выбора конкретного языка программирования, компилятора и его опций, поэтому все сравниваемые алгоритмы должны быть реализованы в одинаковых условиях.

Этот раздел посвящен использованию ресурсов памяти ( регистров , кэша , ОЗУ , виртуальной памяти , вторичной памяти ) во время выполнения алгоритма. Что касается анализа времени, описанного выше, анализируйте алгоритм, обычно используя анализ пространственной сложности , чтобы получить оценку необходимой оперативной памяти в зависимости от размера входных данных. Результат обычно выражается с использованием нотации Big O.

Необходимо учитывать до четырех аспектов использования памяти:

Ранние электронные компьютеры и первые домашние компьютеры имели относительно небольшой объем рабочей памяти. Например, автоматический калькулятор с электронным запоминанием задержки (EDSAC) 1949 года имел максимальную рабочую память в 1024 17-битных слов, а Sinclair ZX80 1980 года изначально имел 1024 8-битных байта рабочей памяти. характерно В конце 2010-х годов для персональных компьютеров иметь от 4 до 32 ГБ оперативной памяти, что более чем в 300 миллионов раз больше памяти.

Иерархия кэширования и памяти

[ редактировать ]

Современные компьютеры могут иметь относительно большие объемы памяти (возможно, гигабайты), поэтому необходимость втиснуть алгоритм в ограниченный объем памяти уже не является той проблемой, которая была раньше. Однако различные типы памяти и их относительная скорость доступа могут иметь важное значение:

Алгоритм, объем памяти которого соответствует кэш-памяти, будет намного быстрее, чем алгоритм, который помещается в основную память, что, в свою очередь, будет намного быстрее, чем алгоритм, который должен прибегать к подкачке. По этой причине политики замены кэша чрезвычайно важны для высокопроизводительных вычислений, равно как и программирование с поддержкой кэша и выравнивание данных . Проблема еще больше усложняется тем, что некоторые системы имеют до трех уровней кэш-памяти с разной эффективной скоростью. Различные системы будут иметь разные объемы этих различных типов памяти, поэтому влияние потребностей алгоритма в памяти может сильно различаться от одной системы к другой.

На заре электронных вычислений, если алгоритм и его данные не помещались в основную память, алгоритм нельзя было использовать. Сегодня использование виртуальной памяти обеспечивает гораздо больше памяти, но за счет производительности. Гораздо более высокую скорость можно получить, если алгоритм и его данные помещаются в кэш-память; в этом случае минимизация пространства также поможет минимизировать время. Это называется принципом локальности , и его можно разделить на локальность отсчета , пространственную локальность и временную локальность . Алгоритм, который не полностью помещается в кэш-память, но обеспечивает локальность ссылки, может работать достаточно хорошо.

См. также

[ редактировать ]
  1. ^ Грин, Кристофер, Классика по истории психологии , получено 19 мая 2013 г.
  2. ^ Кнут, Дональд (1974), «Структурированное программирование с операторами перехода» (PDF) , Computing Surveys , 6 (4): 261–301, CiteSeerX   10.1.1.103.6084 , doi : 10.1145/356635.356640 , S2CID   207630080 , заархивировано из оригинал (PDF) 24 августа 2009 г. , получено 19 мая 2013 г.
  3. ^ Jump up to: а б «Бенчмарк с плавающей запятой: сравнение языков (Fourmilog: никто не смеет называть это разумом)» . Fourmilab.ch. 4 августа 2005 г. Проверено 14 декабря 2011 г.
  4. ^ «История точильного теста» . Ройлонгботтом.org.uk . Проверено 14 декабря 2011 г.
  5. ^ Сотрудники OSNews. «Обзор производительности девяти языков: сравнительный анализ математических вычислений и файлового ввода-вывода» . osnews.com . Проверено 18 сентября 2018 г.
  6. ^ Кригель, Ханс-Петер ; Шуберт, Эрих; Зимек, Артур (2016). «(Черное) искусство оценки времени выполнения: сравниваем ли мы алгоритмы или реализации?». Знания и информационные системы . 52 (2): 341–378. дои : 10.1007/s10115-016-1004-2 . ISSN   0219-1377 . S2CID   40772241 .
  7. ^ Гай Льюис Стил-младший «Разоблачение мифа о« дорогом вызове процедур »или реализации вызовов процедур, считающиеся вредными, или Лямбда: окончательный GOTO». Лаборатория искусственного интеллекта Массачусетского технологического института. Памятка лаборатории искусственного интеллекта AIM-443. Октябрь 1977 г. [1]
  8. ^ Jump up to: а б с д Хеннесси, Джон Л; Паттерсон, Дэвид А; Асанович, Крсте ; Бакос, Джейсон Д; Колвелл, Роберт П.; Бхаттачарджи, Абхишек; Конте, Томас М; Дуато, Хосе; Франклин, Диана; Гольдберг, Дэвид; Жуппи, Норман П ; Ли, Шэн; Муралиманохар, Навин; Петерсон, Грегори Д.; Пинкстон, Тимоти Марк; Ранганатан, Пракаш; Вуд, Дэвид Аллен; Янг, Клиффорд; Заки, Амр (2011). Компьютерная архитектура: количественный подход (Шестое изд.). Эльзевир Наука. ISBN  978-0128119051 . OCLC   983459758 .
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: d09206f9ca1731b4535873f856364a00__1721097960
URL1:https://arc.ask3.ru/arc/aa/d0/00/d09206f9ca1731b4535873f856364a00.html
Заголовок, (Title) документа по адресу, URL1:
Algorithmic efficiency - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)