Мы должны использовать C “по соображениям производительности” [закрыто]

StackOverflow https://stackoverflow.com/questions/1223710

Вопрос

В наш век множества языков, кажется, есть отличный язык практически для любой задачи, и я ловлю себя на том, что профессионально борюсь с мантрой "ничто, кроме C, не является быстрым", где "быстро" на самом деле означает "достаточно быстро".Я работаю с очень рациональными непредубежденными людьми, которым нравится сравнивать цифры, и все, что у меня есть, - это мысли и мнения.Не могли бы вы помочь мне преодолеть субъективные мнения и войти в "реальный мир"?

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


Итак, это мои конкретные требования

  • память не является серьезным ограничением
  • переносимость не является серьезной проблемой
  • это не система реального времени
Это было полезно?

Решение

"Ничто, кроме C, не является быстрым [достаточно]" - это ранняя оптимизация, и она неверна по всем причинам, по которым ранние оптимизации неверны.Если ваша система настолько сложна, что желательно что-то отличное от C, то в системе будут части, которые должны быть "достаточно быстрыми", и части с более легкими ограничениями.Если написание вашего кода, например, на Python позволит завершить проект быстрее с меньшим количеством ошибок, то вы можете дополнить его некоторым кодом на C или ассемблере, чтобы ускорить выполнение критически важных по времени частей.

Даже если окажется, что весь код должен быть написан на C или ассемблере, чтобы соответствовать требованиям к производительности, прототипирование на таком языке, как Python, может принести реальные выгоды.Вы можете взять свой рабочий прототип Python и постепенно заменять части кодом на C, пока не достигнете необходимой производительности.

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

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

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

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

Использование C для встраиваемых систем имеет несколько очень веских причин, из которых "производительность" является лишь одной из второстепенных.Встроенный очень близок к аппаратному обеспечению, вы потребность ручная адресация памяти для связи с оборудованием.Все API и SDK доступны в основном для C.

Существует всего несколько платформ, которые могут запускать виртуальную машину для Java или Mono, что частично связано с последствиями для производительности, но также и с высокими затратами на реализацию.

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

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

Для C:

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

C будет существовать еще много лет.Во встроенной разработке это монополия, которая подавляет любую попытку изменений.Язык, которому нужна виртуальная машина, такая как Java или Lua, никогда не станет основным во встроенной среде.У скомпилированного языка может появиться шанс, если он предоставит новые привлекательные возможности по сравнению с C.

В Интернете существует несколько тестов для разных языков.В большинстве из них вы найдете реализацию на C или C ++ вверху, поскольку они дают вам больше контроля для реальной оптимизации.

Пример: Компьютерная Языковая игра Benchmarks.

Трудно спорить против C (или других языков процедур, таких как Pascal, Modula-2, Ada) и assembly для embedded.У этих языков большая история успеха.Как правило, вы хотите устранить риск неизвестности.Попытка использовать что-либо иное, кроме C или assembly, на мой взгляд, является неизвестным.Сказав это, нет ничего плохого в смешанной модели, где вы используете одну из схем, которые идут на C, или Python, или Lua, или JavaScript в качестве языка сценариев.

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

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

Эта статья (автор Майкл Барр) рассказывает об использовании C, C ++, ассемблера и других языков во встроенных системах и включает график, показывающий относительное использование каждого из них.

А вот еще одна статья, озаглавленная соответствующим образом, Плохие причины для отказа от C ++.

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

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

Ознакомьтесь со следующими статьями

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

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

В эта ссылка у вас есть сравнение между Ada и C.

Возможно, вы захотите взглянуть на D язык программирования.Для этого могла бы потребоваться некоторая настройка производительности, поскольку есть некоторые области, в которых Python может превзойти его.Я действительно не могу указать вам на сравнительные тесты, поскольку не вел список, но, как указал Питер Олссон, Контрольные показатели и языковые реализации имеет D Digital Mars.

Вероятно, вы также захотите ознакомиться с этими прекрасными вопросами:

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

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

Java и C # (на Micro.Net или WinCE) могут быть жизнеспособными альтернативами для работы не в реальном времени.

Я на самом деле не системный / встроенный программист, но мне кажется, что встроенным программам обычно требуется детерминированная производительность - это сразу исключает многие языки, собирающие мусор, потому что они не детерминированный в целом.Однако велась работа над детерминированной сборкой мусора (например, Metronome для Java: http://www.ibm.com/developerworks/java/library/j-rtj4/index.html)

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

C действительно - ваш лучший выбор.

Существует разница при написании переносимого кода на C и слишком глубоком погружении в особенности ghee whiz конкретного компилятора или угловых вариантов языка (всего этого следует избегать).Но переносимость между компиляторами и версиями компилятора.Количество сотрудников, которые будут способны разрабатывать или поддерживать код.Компиляторам будет легче с этим справиться, и они создадут лучший, более чистый и надежный код.

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

Вот пара статей, в которых сравнивается C # с C ++ :

http://systematicgaming.wordpress.com/2009/01/03/performance-c-vs-c/

http://journal.stuffwithstuff.com/2009/01/03/debunking-c-vs-c-performance/

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

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

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

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

C в этом отношении, вероятно, наиболее известен команде и наиболее широко поддерживается доступными библиотеками и инструментами.

Правда в том, что - не всегда.

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

Компиляторы C намного быстрее даже на настольных системах из-за того, что в них мало языковых возможностей по сравнению с C ++, поэтому я бы предположил, что разница нетривиальна во встроенных системах.Это приводит к более быстрому времени итерации, хотя OTOH у вас нет удобств C ++ (таких как коллекции), которые могут замедлить работу в долгосрочной перспективе.

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