2009-08-03 2 views
21

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

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


Так это мои особые требования

  • памяти не является серьезным сдерживающим фактором
  • портативность не является серьезной проблемой
  • это не система реального времени
+2

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

+0

Преждевременная оптимизация - это корень всего зла: я успешно записал встроенное программное обеспечение в Python. В конечном итоге вам необходимо сбалансировать стоимость написания на более низком уровне, например, C, а также преимущество RAD на языке более высокого уровня (и стоимость с точки зрения производительности). – jkp

+15

будет осторожно относиться к досрочному аргументу оптимизации. Если вычислительная мощность ограничена, и определенный объем работы необходимо выполнить в режиме реального времени или в режиме реального времени, и вы выбираете язык, требующий большей вычислительной мощности для работы, чем у вас, вы ввернуты на крыльях, потому что вы теперь нужно начинать с способного языка. Больше информации на http://weblogs.mozillazine.org/roc/archives/2005/11/immature_optimization.html –

ответ

27

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

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

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

+0

Лучше еще, прототип с английским (текст), блок-схемы, диаграммы структуры данных и т. Д., А затем пишите приложение один раз. Прототипирование на любом языке, зная, что это не соответствует вашим требованиям, - это действительно плохая идея. Лично я считаю, что C/C++ очень хорошо сочетаются друг с другом и используют один и тот же набор навыков, в то время как Java, Python и т. Д. Создают много вмешательств в обучении, потому что они достаточно различны, что C накажет вас, когда вы вернетесь к нему. «Футболисты, которые тренируются на шинах, хорошо справляются с работой по шинам». – RocketRoy

0

Правда - не всегда.

Кажется, что среда выполнения .NET (но любая другая среда выполнения может быть взята в качестве примера) накладывает несколько МБ служебных данных во время выполнения. Если это все, что у вас есть (в ОЗУ), вам не повезло. JavaME кажется более компактным, но все равно все зависит от ресурсов, которые у вас есть в вашем распоряжении.

+1

dotNet Compact - мобильный эквивалент JavaME. – Dykam

1

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

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

6

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

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

проверить следующие статьи

+1

www.pythononachip.org - проект, который запускает PyMite VM на микроконтроллерах без ОС, без MMU и всего 8 КБ ОЗУ. – dwhall

18

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

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

48

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

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

+1

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

+1

Конечно, Python написан на C, как и многие интерпретируемые инструменты. С небольшой работой вы можете использовать Python на многих платформах. – Christopher

+3

Да - Python может быть. Я даже использовал Lua (поскольку он довольно крошечный с точки зрения накладных расходов). Это накладные расходы на память и поддержка библиотек, которые могут быть проблемой с такими вещами, как pythong. –

2

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

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

+0

Удаление GC не устраняет проблему, malloc/free не являются детерминированными. Язык программирования D позволяет отключить GC, чтобы он не запускался во время критического кода. –

+1

Программное обеспечение для нижнего конца встроенных процессоров имеет тенденцию не использовать malloc/free, но, скорее всего, он будет использовать прерывания, вызванные внешними событиями, которые непредсказуемы и, следовательно, не детерминированы - независимо от используемого языка. –

+0

, как правило, malloc/free запрещены в детерминированных системах (или они переписываются). @Steve: вы можете создавать детерминированные обработки прерываний, предоставляя вам во времени. –

14

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

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

1

Вот несколько статей, которые сравнивают 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++ могут быть явным победителем в плане производительности во многих случаях. Но часто раз край является тонким. Использовать C или нет - это совсем другая тема. По-моему, это действительно должно зависеть от поставленной задачи. Но во встроенных системах у вас часто нет большого выбора.

+0

или вы можете сказать: «показывает, что если вы напишете код C# немного иначе, производительность будет еще медленнее». Не так медленно, как раньше, но тем не менее медленнее. Теперь, на моем 3xcore, 4 ГБ настольном ПК, который может не означать, что я когда-либо заметлю разницу ... но на встроенном CPU с тактовой частотой 10 МГц с 64 Мб ОЗУ разница, вероятно, будет чрезвычайно значительной. – gbjbaanb

+0

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

8

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

Пример: The Computer Language Benchmarks Game.

5

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

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

В this link у вас есть сравнение между Ada и С.

+3

Я использовал ADA в прошлом и хотел бы использовать его сейчас, но я не могу найти версию, которая будет генерировать код для работы в моей среде RAM 2K ROM/256 байт. –

7

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

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

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

1

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

3

Возможно, вы захотите ознакомиться с языком программирования D. Он может использовать некоторую настройку производительности, так как есть некоторые области, которые Python может превзойти. Я не могу направить вас на сравнительные сравнения, так как не сохранил список, но, как указал Питер Олссон, Benchmarks & Language Implementations имеет D Digital Mars.

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

9

Для C:

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

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

+0

eLua используется, однако, в дикой природе встроенных устройств. – Kamiccolo

+0

Базы данных имеют свойства ACID, FAT был заменен отказоустойчивыми ext4, HFS + и NTFS, и аналогичным образом C необходимо поэтапно исключить. Возможно, не полностью, так же, как FAT всегда рядом, но не в чувствительных местах. Запись в C откладывает прогресс. – OCTAGRAM

+0

@OCTAGRAM: Почему downvote? ext4 был написан на C. Написание в C, казалось бы, из вашего примера, чтобы добиться прогресса. Да, C не является правильным ответом везде, но для встроенной и OS-среды это хорошее совпадение. – Gerhard

2

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

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

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

6

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

И вот еще одна статья, под заглавием, Poor reasons for rejecting C++.

3

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

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

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

-1

Много кода C работает невероятно быстро, потому что люди, которые его написали, были Zen Masters of software. Они должны быть хозяевами, кусая пулю и узнавая не только то, что хочет пользователь, но и то, что хочет компилятор, что хочет O/S, что хочет оборудование, зная структуры данных и алгоритмы, как задние части рук, зная, как сжать все возможное из кэшей на кристалле, а также то, что следующее поколение процессоров & будет делать с их кодом.

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

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

После 20 лет написания кода C Недавно я написал приложение, которое превышает требования, требуемые 10 000X. Мне довелось пересмотреть его сегодня, все 500 строк кода. Для каждой строки кода на странице я написал и удалил как минимум еще 10, сравнивал их, проверял и в конечном итоге отбрасывал. Какой смысл в достижении производительности до сих пор выше того, что было указано? Потому что в какой-то момент ничего не получилось бы.

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

Печальная истина: «Ничего не получается, как успех». Я бы предпочел, чтобы производительность мне не нужна, чем нужна производительность, которой у меня нет. Если вы приближаетесь к 2-му условию, ваша компания выходит из бизнеса и, вероятно, намного раньше, чем вы думаете. Мне не нравится писать «провалившиеся киты», успех которых в том, что их разрушает. C уходит с моего пути и позволяет мне внедрять новшества так, как ни один другой язык не делает.

+0

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

+0

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

+1

«Спекуляции» производительности подразумевают текущий размер бизнеса, а не ожидаемый размер. Не было горячих точек, и редко они работали вблизи голого металла. Только около 30% было связано с алгоритмической оптимизацией. Мне просто нравится, как ваши программные богословы живут в мире фантазий, где алгоритмы работают на идеальном оборудовании с однородным доступом к неограниченным ресурсам. В реальном мире структуры данных и алгоритмы работают на очень коротких ресурсах, таких как кеши L1, L2, L3, конвейеры, блокировки потоков mutex, память NUMA и совершенно разные графические процессоры. Попытайтесь сделать сложнее Скиппи. – RocketRoy

-2

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

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

Смежные вопросы