Вопрос

Если Закон Мура верно, и процессоры/графические процессоры становятся все более быстрыми, будет ли программное обеспечение (и, соответственно, вы, разработчики программного обеспечения) по-прежнему раздвигать границы до такой степени, что вам все еще нужно оптимизировать свой код?Или простое факториальное решение будет достаточно хорошим для вашего кода (и т. д.)?

Это было полезно?

Решение

Плохой код всегда может превысить скорость процессора.

Отличный пример: перейдите по этой ссылке Кодирование ужасов столбец и прокрутите вниз до раздела с описанием книги Жемчуг программирования.Воспроизведен график, показывающий, как при определенном алгоритме TRS-80 с 8-битным процессором 4,77 МГц может победить 32-битный чип Alpha.TRS-80 vs. Alpha

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

Поговорка «нет такой проблемы, которую не удалось бы преодолеть грубой силой и невежеством» не всегда верна.

Другие советы

Двукратное увеличение вычислительной мощности не сильно улучшит ужас вашего паршивого поиска n^2.

Чем быстрее становятся компьютеры, тем больше мы ожидаем от них.

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

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

Закон Мура говорит о том, сколько транзисторов мы можем разместить на чипе, но ничего не говорит о том, что эти транзисторы способны переключаться с все более высокой скоростью.Действительно, в последние несколько лет тактовые частоты более или менее стагнировали — мы просто продолжаем получать все больше и больше «ядер» (по сути, полноценных процессоров) на один чип.Чтобы воспользоваться этим, требуется распараллеливание кода, поэтому, если вы пишете «наивно», волшебный оптимизатор будущего будет занят поиском скрытого параллелизма в вашем коде, чтобы распределить его по нескольким ядрам (более реалистично, для тот предсказуемый в будущем вам придется много помогать своему компилятору ;-).

Закон Вирта:

Программное обеспечение становится медленнее быстрее, чем аппаратное обеспечение становится быстрее.

P.S.Если говорить более серьёзно:по мере того как вычислительная модель переходит к параллельной обработке, оптимизация кода становится более важной.Если вы оптимизируете свой код 2 раза и он будет работать 5 минут вместо 10 минут на одном компьютере, это может быть не так уж впечатляюще.Следующий компьютер с удвоенной скоростью компенсирует это.Но представьте, что вы запускаете свою программу на 1000 процессорах.Тогда любая оптимизация экономит МНОГО машинного времени.И электричество.Оптимизируйте и спасите Землю!:)

Вычислительные задачи, по-видимому, делятся примерно на две большие группы.

  1. Проблемы с ограниченными вычислительными потребностями.
  2. Проблемы с неограниченными вычислительными потребностями.

Большинство проблем попадает в первую категорию.Например, растеризация 3D в реальном времени.Долгое время эта проблема была вне досягаемости типичной бытовой электроники.Не существовало убедительных 3D-игр или других программ, которые могли бы создавать миры в реальном времени на Apple ][.Однако со временем технологии подтянулись, и теперь эта проблема стала достижимой.Аналогичная проблема – моделирование сворачивания белка.До недавнего времени было невозможно преобразовать известную пептидную последовательность в полученную белковую молекулу, но современное оборудование делает это возможным за несколько часов или минут обработки.

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

Оба типа задач широко используются для разного рода оптимизации.Второй тип достаточно очевиден.Если программу, выполняющую моделирование, немного улучшить, она будет работать немного быстрее, давая результаты немного раньше или с большей точностью.

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

Оптимизация – это нечто большее, чем скорость.Закон Мура не применим к компьютерной памяти.Кроме того, оптимизация часто представляет собой процесс компиляции вашего кода для использования инструкций, специфичных для процессора.Это лишь некоторые из оптимизаций, о которых я могу подумать, которые не будут решены более быстрыми процессорами.

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

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

Оптимизация будет по-прежнему необходима во многих ситуациях, в частности:

  • Системы реального времени, где процессорное время имеет большое значение

  • Встроенные системы, где память есть память, и она стоит дороже

  • Серверы, на которых одновременно требуют внимания множество процессов

  • Игры, в которых трассировка 3D-лучей, звук, искусственный интеллект и сети могут стать очень требовательной программой.

Мир меняется, и мы должны меняться вместе с ним.Когда я только начинал, чтобы быть хорошим программистом, нужно было знать все небольшие микрооптимизации, которые можно было сделать, чтобы выжать из программы еще 0,2%, манипулируя указателями в C и другими подобными вещами.Теперь я трачу гораздо больше времени на то, чтобы сделать алгоритмы более понятными, поскольку в долгосрочной перспективе это более ценно.Но всегда есть что оптимизировать, и всегда есть узкие места.Больше ресурсов означает, что люди ожидают большего от своих систем, поэтому неряшливость недопустима для профессионала.

Однако стратегии оптимизации меняются по мере того, как вы добавляете больше скорости/памяти/ресурсов для работы.

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

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

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

Скорость компьютера не всегда может преодолеть человеческую ошибку.Вопросы могут быть сформулированы так:Станут ли процессоры достаточно быстрыми? что составители могут потратить время выявлять (и исправлять) проблемы реализацииОчевидно, что потребуется оптимизация кода (в обозримом будущем), чтобы исправить Шлемиэль, художник-типовые проблемы.

Разработка программного обеспечения по-прежнему остается вопросом сообщения компьютеру точно что делать.Что «все более быстрые» процессоры дадут нам, так это возможность разрабатывать все более абстрактные и естественные языки программирования, в конечном итоге до такой степени, что компьютеры принимают наши намерения и реализуют все детали низкого уровня...когда-нибудь.

Наслаждаться,

Роберт С.Картаино

Компьютер похож на комнату подростка.

Он никогда не будет достаточно большим, чтобы вместить весь мусор.

Я думаю, что результатом всего этого является то, что вычислительная мощность дешевеет, и программист может тратить меньше времени на выполнение определенной задачи.Например, языки более высокого уровня, такие как Java или Python, почти всегда медленнее, чем языки более низкого уровня, такие как ассемблер.Но для программиста гораздо проще, что новые вещи возможны.Я думаю, конечным результатом будет то, что компьютеры смогут напрямую общаться с людьми и компилировать человеческую речь в байт-код.Тогда программисты перестанут существовать.(И компьютеры могут захватить мир)

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

Оптимизация бесспорна, но только тогда, когда она необходима.Я думаю, что дополнительная аппаратная мощность просто уменьшает количество случаев, когда она действительно необходима.Однако тому, кто пишет программу для запуска космического корабля на Луну, лучше оптимизировать свой код :)

Учитывая, что компьютеры примерно в тысячу раз быстрее, чем несколько десятилетий назад, но, как правило, не кажутся намного быстрее, я бы сказал, что нам предстоит пройти ДОЛГИЙ путь, прежде чем мы перестанем беспокоиться об оптимизации.Проблема в том, что по мере того, как компьютеры становятся более мощными, они заставляют нас выполнять все больше и больше работы, поэтому мы можем работать на более высоких уровнях абстракции.Оптимизация на каждом уровне абстракции остается важной.

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

Оптимизация будет важна в обозримом будущем.Однако, микрооптимизации гораздо менее важны, чем раньше.Самой важной оптимизацией в наши дни может стать выбор алгоритма.Вы выбираете O(n log n) или O(n^2)....и т. д.

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

В конечном итоге мы не сможем стать быстрее, в конечном итоге мы будем ограничены пространством, поэтому вы видите новые процессоры с частотой ниже 3 ГГц и многоядерные.Так что да, оптимизация по-прежнему необходима.

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

Да, мы находимся на этапе, когда оптимизация имеет значение, и будем там в обозримом будущем.Потому что:

  • Скорость оперативной памяти увеличивается медленнее, чем скорость процессора.Таким образом, разрыв в производительности между процессором и оперативной памятью продолжает увеличиваться, и если ваша программа часто обращается к оперативной памяти, вам необходимо оптимизировать шаблоны доступа для эффективного использования кэша.В противном случае сверхбыстрый процессор будет простаивать 90% времени, просто ожидая поступления данных.
  • Количество ядер увеличивается и увеличивается.Получает ли ваш код пользу от каждого добавленного ядра или он работает на одном ядре?Здесь оптимизация означает распараллеливание, и, в зависимости от поставленной задачи, это может быть сложно.
  • Скорость процессора никогда не догонит экспоненциальные алгоритмы и другие методы грубой силы.Как хорошо иллюстрируется этим отвечать.

Будем надеяться, что скорость сети сохранится, и мы сможем передавать по проводу достаточно данных, чтобы не отставать от процессоров...

Как уже упоминалось, всегда будут узкие места.

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

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

Или, если вы хотите стать по-настоящему профессионалом, добавьте еще один уровень абстракции.

Это не сложно :-)

Несмотря на то, что процессоры становятся все быстрее и быстрее, вы всегда можете оптимизировать их.

  • пропускная способность сети,
  • диск ищет,
  • использование диска,
  • использование памяти,
  • транзакции базы данных,
  • количество системных вызовов,
  • планирование и блокировка детализации,
  • вывоз мусора.

(это реальные примеры, которые я видел за последние полгода).

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top