Действительно ли медленная работа языков программирования - это плохо? [закрыто]


18

Вот как я это вижу.

Там есть машинный код, и это все, что нужно компьютерам для запуска чего-либо. Компьютеры не заботятся о языках программирования. Для них не имеет значения, является ли машинный код Perl, Python или PHP. Языки программирования не обслуживают компьютеры. Они служат программистам.

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

Итак, действительно ли медленная производительность языков программирования - это плохо?


22
чем медленнее? время компиляции, время выполнения, время записи, какой-то другой показатель?
Мэтт Эллен

1
Я просто хотел бы отметить, что быстрые компьютеры и компиляторы, которые генерируют эффективный машинный язык, очевидно хороши, за исключением того, что они позволяют программистам быть более ленивыми. Когда у продуктов возникают проблемы с производительностью, часто это происходит из-за того, что некоторые вещи «быстрые», такие как управление памятью и уведомления.
Майк Данлавей

5
@Mike: С другой стороны, программы работают медленно из-за отношения, которое Джефф недавно подытожил в своем блоге: «Алгоритмы предназначены для людей, которые не знают, как покупать оперативную память». Если программа выполняется в кубическое время, а не в O (N log n), мощность компьютера действительно не имеет значения для больших проблем.
Дэвид Торнли

2
@David: мы не можем получить больше 512 ГБ ОЗУ на нашем сервере, поэтому нам нужно написать лучшие алгоритмы сейчас.
JBRWilkinson

2
Зависит от того, где находятся узкие места. Если программа ожидает ввода-вывода в 99,9% случаев, не имеет значения, работает ли сама программа в 10 раз медленнее, чем если бы она была написана на ассемблере ручной работы.

Ответы:


50

Я не думаю, что это автоматически плохо. Python медленнее, чем C ++, но когда оба достаточно быстры , Python может быть лучшим выбором для рассматриваемой проблемы, даже если он медленнее .

Это всегда компромисс. Для небольших одноразовых задач гораздо быстрее написать сценарий Python, чем приложение C ++, которое делает то же самое (типичным примером для меня будет какая-то пакетная обработка текста или обход дерева каталогов и выполнение каких-либо действий с файлами), и мне все равно, занимает ли это 10 мс или 1000 мс, даже если это в 100 раз медленнее, потому что на написание и тестирование у меня уходит половину времени.

Конечно, было бы неплохо, если бы Python работал так же быстро, как C ++, поэтому в этом смысле я согласен с вашим утверждением, что «slow = bad». Но тогда у меня есть мощный язык, который работает так быстро, как я хочу, не делая некоторых вещей (скажем, проверка границ массивов на необработанных массивах), пока он позволяет мне решить, когда следует сделать этот компромисс (скажем, с помощью std: :вектор).


Я не утверждал, что "медленно = плохо". Тем не менее, спасибо, что поделились своими мыслями.
Эмануил Русев

9
+1 «достаточно быстро» Slow - это плохо, когда реализация «слишком медленная / недостаточно быстрая». В любое другое время это не имеет значения.
Кирк Бродхерст

4
+1 «достаточно быстро». В зависимости от того, что вы делаете, время программиста может стоить НАМНОГО больше, чем потенциальная экономия времени выполнения.
Джонас

3
@Jonas: это почти никогда не бывает, просто вы видите зарплату программиста; вы не видите, как пользователи в отчаянии склоняют головы, когда приложение ползет с криками «давай, как тяжело, куча дерьмового программного обеспечения». Если бы они опубликовали совокупную стоимость владения медленным программным обеспечением и быстрым программным обеспечением - вы бы сразу увидели, как меняются ваши приоритеты, и ваш отдел продаж.
gbjbaanb

1
@mcmcc: я говорил не о языках, а о пользовательском опыте. Когда вы нажимаете на кнопку, что-то должно произойти прямо сейчас. Когда вы запускаете вычисления, хорошо, если это займет некоторое время, если есть полезный индикатор прогресса.
Джонас

18

Довольно просто - медлительность - это плохо

когда программа требует определенного уровня производительности

потому что без этого исполнения вы не выполняете требования.

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


2
..и часто требования неписаны в виде «более чем X секунд, чтобы получить страницу, заставляет обычного пользователя веб-сайта перейти на другой сайт»
JBRWilkinson

1
@JBRWilkinson да, или если система работает слишком медленно, то внезапно появятся новые требования к производительности;)
Кирк Бродхерст,

12

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

ОДНА вещь, к которой стремится компьютер - это быстро. В самом деле! Ножка с картотекой может выполнять ту же работу, что и база данных. Какой-то парень, заводящий печатный станок, может делать то же, что и Apache. Шутки в сторону! И они СДЕЛАЛИ, на самом деле, сотни и сотни лет. Почему компьютер хорош для НИЧЕГО, так это его скорость.

Таким образом, язык программирования, который (по сравнению с другими языками) не в состоянии использовать, в котором отсутствует ЕДИНСТВЕННОЕ преимущество использования компьютеров.


13
Вы упускаете один важный момент: компьютеры глупы, быстры и подлые , в то время как erratum humanum est. И во многих случаях эта предсказуемость гораздо важнее, чем просто скорость.
SK-logic

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

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

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

2
И все же, если конечной целью является скорость (выполнения), почему бы нам всем не написать наши программы в машинном коде?
Эмануил Русев

5

Язык программирования может быть очень высокого уровня, «делать много», все еще быть очень быстрым. OCaml - это язык более высокого уровня, чем PHP, но он генерирует код почти так же быстро, как C. Javascript так же динамичен, как PHP, но он может быть выполнен очень быстро. Так что это в основном проблема с языковой реализацией, а не с дизайном. Динамические языки сложнее реализовать эффективно, но не невозможно.


Как вы думаете, языки, которые считаются медленными (с точки зрения работы), такие как PHP, могут быть реализованы для более быстрой работы?
Эмануил Русев

1
Zend Optimizer кто-нибудь?
user281377

Позвольте мне спросить об этом по-другому - что в реализации PHP делает это медленно?
Эмануил Русев

6
Да, это может быть реализовано лучше. Это потребует больших усилий - например, абстрактная интерпретация для специализации динамических типов - довольно сложная вещь, которая еще недостаточно изучена. Статический язык гораздо проще перевести в высокоэффективный код. Итак, PHP медленный в основном потому, что он динамический. И, ну, изначально у него была очень плохая и непрофессиональная реализация, как и у многих других языков сценариев.
SK-logic

Компилятор HipHop, запущенный Facebook, может переводить PHP в код C ++, поэтому он действительно быстрый.
JBRWilkinson

3

Скорость может быть измерена с точки зрения времени выполнения, начального времени разработки и времени обслуживания (время, затрачиваемое на решение проблем / ошибок, создание нового кода и его развертывание).

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

Поэтому многое зависит от необходимой вам скорости.

Контекст тоже важен. Загрузка вашей первоначальной конфигурации за 0,5 секунды вместо 0,1 секунды не представляет большой проблемы, но во время выполнения для выполнения запроса вместо 0,1 секунды может потребоваться 0,5 секунды, а не 0,1 секунды. 10.


100 мс фактически мгновенно в восприятии пользователя. 500мс довольно заметно. Если пользователь выполняет запросы, это заметная разница в рабочем процессе.
Дэвид Торнли

3

Просто - клиенты любят быстрое программное обеспечение. На самом деле вся цель компьютеров - это быстрые вычисления.


11
неправильно, на самом деле. Клиенты любят программное обеспечение, которое соответствует требованиям и в рамках бюджета. Им было бы наплевать, если для создания экрана требуется 19 миллисекунд, а не 15, потому что они никогда этого не замечают (если для создания требуется 15 секунд, это нечто другое). Их также не волнует, используете ли вы «быстрый язык», они просто хотят что-то, что соответствует спецификациям и в рамках бюджета.
С

4
19 мс против 15 мс может не иметь значения, но определенно имеет значение 500 мс против 300 мс, и это может иметь значение между успешным продуктом и отказом.
Неманя Трифунович

2
+1 «Клиенты любят программное обеспечение, которое соответствует требованиям и в рамках бюджета». С другой стороны, некоторые конечные пользователи, которые не платят напрямую за программное обеспечение, такие как сотрудники большой компании, на самом деле не заботятся о затратах на разработку. Конечно, как поставщик программного обеспечения ваша самая важная задача состоит в том, чтобы люди были довольны, кто на самом деле платит вам.
Жолт Тёрёк

@ Zsolt: Это действительно зависит от типа программного обеспечения, которое вы разрабатываете. Я обычно работаю над продуктами, где конечные пользователи либо платят за продукты напрямую, либо влияют на решения о покупке - они не дают нам спецификации и не заботятся о нашем бюджете. Возможно, мне следовало использовать термин «пользователи», а не «клиенты».
Неманя Трифунович

4
Говоря как пользователь (а не как разработчик), я могу сказать, что общая отзывчивость (примечание: отличается от скорости) является основным фактором в моем решении выбрать одну программу из другой. Это одна из причин, почему я использую несколько приложений Java, например; время запуска только на JVM приводит к тому, что приложения, начинающиеся с -5000 баллов в этой области;). Если серьезно, то отзывчивость может (часто делает) иметь значение, если пользовательский интерфейс вашего продукта неуклюжий или эффективный, а иногда это может быть трудно достичь, если язык, который вы используете, вызывает заикания или длительный дисковый ввод-вывод.
Билли Онил

3

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

Конечно, язык программирования может быть фактором, определяющим скорость выполнения, но это будет не сам язык, а компиляторы и / или среды выполнения, которые идут с ним. Это ясно видно на примере разработки Java, где производительность JVM (даже в идентичных аппаратных средах) за эти годы радикально возросла. И, конечно, всегда можно написать ужасно медленный код в любой среде, которую вы выберете. Так как такие утверждения, как «C ++ в десять раз быстрее, чем Java», автоматически являются фальшивыми, если они не уточнены и количественно не определены, какие именно условия были проверены и как. В равной степени возможно создать тест, в котором Java работает быстрее, чем C ++, все зависит от того, что вы используете в качестве тестового кода и как вы его выполняете.


3

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

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

Я являюсь частью команды, которая пишет управляющее программное обеспечение для вещательных СМИ. Существует большая вероятность того, что ваш любимый телевизор или радиостанция работает на нем, если вы находитесь в США. Производительность - это одна из вещей, о которой мы чаще всего слышим от клиентов. Первоначально он был написан для небольших операций на одной станции, но теперь мы подписываем крупные вещательные и кабельные сети с сотнями каналов, и масштабирование начинает становиться проблемой. Если мы не сможем заставить их работать быстро, они передадут свои многомиллионные контракты людям, которые могут, и мы останемся без работы. Вот почему мы используем быстрый, скомпилированный язык и оптимизируем наши базы данных.


3

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

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

Так что скорость на самом деле важна во многих программах. Медленные языки в настоящее время считаются «плохими», потому что они действительно слишком медленные (Python может быть в 50–100 раз медленнее, и это слишком много)


2

Языки программирования существуют для обслуживания программистов.

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

Некоторые языки программирования работают медленнее, чем другие, но это не потому, что с ними что-то не так.

Это тоже глупое заявление. Определите, что вы имеете в виду, используя слово «медленнее» здесь. Медленнее может означать:

  1. Конечные программы, которые достигают одного и того же, работают на одном языке медленнее, чем на другом.
  2. Время, затрачиваемое на создание окончательной программы, может быть больше (следовательно, некоторые описывают ее как «более медленную»).

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


3
Вы правы, говоря, что «разработчики программного обеспечения используют языки программирования для своих нужд». Это только подтверждает утверждение, что «языки программирования существуют для обслуживания программистов».
Эмануил Русев

1
Я бы сказал: разработчики программного обеспечения используют языки программирования для решения проблем (которые, как правило, не их собственные, а их клиентов).
Петер Тёрёк

@Emanuil: я бы не сказал, что «молот служит разнорабочему / человеку», но что молоток используется для выполнения задачи (например, забить гвоздь, ударить кого-то, кто вам не нравится, и т. Д.). @ Петер: Интересно, сколько людей просто пишут «@Peter». Но если вы можете придумать термин «проблема» для всего , я думаю, что наши заявления являются синонимами.
JK

1

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

Взять хотя бы классический ASP и ASP.net.


1

Кто-то сказал, что «Клиенты любят программное обеспечение, которое соответствует требованиям и в рамках бюджета». Что ж, это правда - но это имеет отношение к медленному программному обеспечению, и это почти по определению означает более медленные языки программирования (и платформы), алгоритмы и конфигурацию. Медленный язык программирования, возможно, является наиболее важной частью всего вышеперечисленного просто потому, что он является основой, из которой вам будет сложнее всего изменить. Если вы используете БД Oracle и вам нужно больше возможностей, вы можете оптимизировать таблицы / индекс / и т. Д. Легко. Если у вас плохой алгоритм в коде, вы можете написать другой код. Если ваш фреймворк работает медленно, вы можете заменить его - это не так просто, но это выполнимо без переписывания всего. Если ваш язык слишком медленный, вы должны начать практически заново.

Посетите Facebook, чтобы узнать о трудностях, с которыми они столкнулись, чтобы заставить PHP работать достаточно быстро, когда им нужно масштабироваться.

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

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

Много времени было потрачено на то, чтобы программисты как можно быстрее набирали код (а затем все время выполняли модульное тестирование и рефакторинг, смеется). Я обнаружил, что это не такой важный фактор, как думают люди - если вы эксперт в своем языке, вы можете написать его гораздо быстрее, чем если вы неопытны. Таким образом, опытный разработчик C ++ может писать код быстрее и точнее, чем начинающий PHP-разработчик. Поэтому я думаю, что стать экспертом важнее, чем выбрать «легкий» язык, и поэтому мне не нравится культ «переписать в классном, новом материале», который, кажется, повсюду сегодня.


1

Я укажу, что большинство проблем с производительностью существуют потому, что программист сделал плохую работу, а не потому, что язык был слишком медленным. На самом деле, есть гораздо больше уместных проблем с производительностью, чем выбранный вами язык. Это будет примерно номер 1 203 407-й в моем списке.


0

Итак, действительно ли медленная производительность языков программирования - это плохо?

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

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

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

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.