|
tux21
|
|
Посоветуйте C/C++ компилятор под Linux28.04.2008, 23:12. Показов 53830. Ответов 31
Метки нет (Все метки)
Интересует максимальная оптимизация по скорости. Какой выбрать? GCC/Intel/SUN/lcc?/etc? На liberatum.ru ничего не нашел.
|
|
| 28.04.2008, 23:12 | |
|
Ответы с готовыми решениями:
31
подскажите, где можно скачать компилятор для C++ под Linux? Посоветуйте что-то почитать по сокетам в C++ под linux. Компилятор (Visual C++ 6.0) в плохой совместимости с Windows 7. Посоветуйте другой компилятор |
|
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
|
||||
| 18.04.2009, 18:31 | ||||
гсс некоторые вещи можно простить ввиду поддержки в нем многоплатформенности. Когда какой-нибудь, VC++ изначально под вантуз и все в нем под это дело заточено, то gcc явно будет отставать в плане многих конструкций (и то не факт, что всех). Да и в некоторых случаях ненамного. В моей практике мне приходилось сравнивать по скорости конструкции только gcc и intel compiler. Так вот, в некоторых случаях отставал и гсс, и интел компилер. Ну и несколько взглядов мельком на сравнение компилеров показывало, что гсс совсем не на последнем месте. Отсюда делаем вывод, что под линухом спокойно можно юзать gcc. И ничего страшного в этом нет. P. S. правда, его последние версии меня несколько разочаровали. Использую более старые. P. P. S. вот я уже много лет пользуюсь gcc(g++). Иногда Intel C++ Compiler. Скажи, с какими трудностями я должен был столкнуться при его использовании? Есть ли причина, не использовать его больше? Или ее нет? (повторю, что прощаю гсс многое ввиду того, что он несет на себе большой груз кроссплатформенности. за все нужно платить )
0
|
||||
|
|
||||||||
| 18.04.2009, 18:55 | ||||||||
![]() Добавлено через 11 минут 24 секунды У меня дома только gcc-4.2 Известные мне косяки на ней что-то не проявляются. Попробую на работе с более ранними версиями
0
|
||||||||
|
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
|
||||
| 18.04.2009, 18:58 | ||||
Но, я не вижу в этом ничего плохо, так как, код сгенеренный гсс меня вполне во всем устраивает. Ну почти ![]()
Ошибки есть в любом компиляторе. В gcc они, тем более, виднее, он открытый, обо всех багах известно.
И не забываем, что гсс направлен на многоплатформенность.
0
|
||||
|
|
|||||||||||||||||||||||||||||||||||
| 18.04.2009, 19:11 | |||||||||||||||||||||||||||||||||||
|
Приведу немного другой пример. Правда он не очень хороший
Теперь сделаем константу 257 плавающей
Идём дальше, теперь константу предварительно загоним в глобалдьную переменную, чтобы в момент компиляции не было свёртки констант
Добавлено через 4 минуты 43 секунды Способен ли он сам из кода на Си родить mmx - для меня большой вопрос. Хотя если это строить на распознавании некоторых шаблонов, то может быть и строит
0
|
|||||||||||||||||||||||||||||||||||
|
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
|
|||
| 18.04.2009, 19:22 | |||
А глюки были, есть и будут во всех компилерах. Кстати, пример который ты привел мне не показал ничего необычного или неправильного.
0
|
|||
|
|
|||||
| 18.04.2009, 19:39 | |||||
|
В сравнении gcc с другими компиляторами аргументация в пользу того, что gcc "хуже" коммерческих компиляторов было качество генерируемого кода. Собственно для наглядной демонстрации нужно проводить серьёзную исследовательскую работу, поскольку вот так с ходу я тебе пример врядли приведу. Хотя по данному пункту мы с тобой вроде бы как пришли к консенсусу. В любом случае, если что-то попадётся под руку по этому вопросу - кину на форум По поводу "достаточно хорошо сделан" - это вопрос несколько субъективный. Исходники gcc я видел и в них ковырялся. Правда ещё во времена gcc-2.95. Принцип построения компилятора сделан безусловно на высшем уровне - часть их опыта я перенял себе. Что касается качества кода (имею ввиду код самогО компилятора) - всё-таки он хромает и очень сильно. Правда после структурных переделок в gcc-3 и gcc-4 там скорее всего стало всё гораздо лучше. Но опять-таки многоплатформенность как ни крути влечёт за собой кучу затычек в коде Больше аргументации "против" компилятора gcc с моей стороны не было Всё вышесказанное было мной заявлено именно с точки зрения программиста-разработчика по результату 9 лет работы с gcc В широком смысле компилятор gcc конечно же "плохим" назвать нельзя. Хотя бы потому, что им собрано чёрт-те знает сколько всего и под практически все современные платформы. По этому вопросу мы с тобой также единодушны Добавлено через 4 минуты 36 секунд
0
|
|||||
|
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
|
||||
| 18.04.2009, 19:48 | ||||
![]() Но ни разу не сталкивался с тем, чтобы у меня что-то не работало, или работало не так. Я с gcc дрова делаю и ниче. Работают, не слетают, ведут себя предсказуемо. Пример приведенный тобой выше не ошибка. Если дурак сидит за редактором, то он убьет и Intel C++ compiler и любой другой. Абсолютно любой. Поэтому, однозначно, для линукса gcc ![]()
![]() Не читая описание функции, я бы не знал, что printf сможет на терминал строку вывести ) Добавлено через 34 секунды
0
|
||||
|
|
|||||||
| 18.04.2009, 20:13 | |||||||
![]() ![]() Там, где средства языка недоступны (ОС, драфверы, ещё что-то низкоуровневое), ассемблерные вставки безусловно необходимы. Но всё-таки вытягивать поизводительность за счёт ассемблерных вставок - занятие неблагодарное. По многим причинам: во первых надо найти места, где теряется производительность, во вторых, надо аккруатно решить, что будет написано на вставках, а что на языке, в-третьих место состыковки вставки и кода на языке в результате не всегда получается оптимальным, в четвёртых само это дело писать много времени может уйти, в-пятых нужно чётко себе представлять ABI данной архитектуры, чтобы не напортачить и не испортить регистры и т.д. А потому сейчас разработчики компиляторов стараются вытягивать максимум именно с языкового уровня, пусть даже и с pragma'ми. Ну, или как варинт, использование неких строительных кубиков, написанных на ассемблере или сделанных в виде builtin'ов, как в gcc. Тут скорее из разряда "на вкус и цвет". Лично я считаю, что ассемблерных вставок по возможности надо избегать. Если падение производительности за счёт написания на языке терпит, то лучше писать на языке - так надёжнее и на душе спокойнее. Из разряда "ну и пусть пидо$ас, зато живой остался". Т.е. я считаю, что на первом месте безоговорочно должна быть надёжность, а производительность - вопрос второй. Естественно, бывают специфические случаи (типа обработки данных с локатора в режиме реального времени), где нужно выжимать 100% производительности машины. Но если случай не такой, то мне кажется, лучше сделать перекос в сторону надёжности
1
|
|||||||
|
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
|
||||
| 18.04.2009, 20:17 | ||||
![]() Добавлено через 1 минуту 18 секунд
0
|
||||
|
|
|
| 18.04.2009, 23:27 | |
|
Попробую подвести итог
(to tux21) Под линухом всё-таки используй gcc. В местах, критичных на производительность, попробуй переписать код или использовать ассемблерные вставки. Можно попробовать поиграть флагами оптимизаций, но, если нет глубокого понимания, что они делают, то скорее всего в этом месте улучшения производительности ты не получишь. К тому же если возникнут вопросы по gcc, то на форуме ты скорее всего сможешь получить ответ (остальным, кому вопрос может показаться интересной, но в нашу дискуссию вникать было влом) Сошлись во мнениях: - под линухом альтернативы gcc скорее всего нету (по крайней мере среди бесплатного или известного платного) - уровень gcc по надёжности качеству в принципе соотвествует уровню промышленного компилятора и его можно использовать для серьёзных разработок - компилятор универсальный: на нём можно разрабатывать пользовательские приложения, низкоуровневые приложения класса ОС или драйверов, а так же высокопроизводительные коды, правда последнее почти наверняка потребует написания ассемблерных вставок или использования builin'ов, а потому этот вариант условно считаем только для экспертов Не до конца сошлись во мнениях: - производительность полученного кода по отношению к коммерческим компиляторам. Вопрос как исследовательский занимает много времени, а потому каких-то конкретных материалов для подтверждения той или другой точки зрения не имеется - надёжность не всегда на высоком уровне. Здесь я постараюсь привести конкретные примеры. Надо покопаться в истории ошибок Со своей стороны хочу поблагодарить оппонента за аргументированный спор и потречанное на него время. Прсто хотябы потому, что нечасто в наши дни это удаётся, особенно на форуме
0
|
|
|
|
|||||||||||||||||||||||||||||||||||||||||
| 20.04.2009, 22:14 | |||||||||||||||||||||||||||||||||||||||||
Сообщение было отмечено как решение
Решение
Итак, начну с косяками gcc. Возможно не всё сразу, т.к. хочется это дело изложить аккуратно. Свалка с косяками оказалась приличной, но во многих случаях не было подробного описания что да как, а потому некоторые ситуации даже воспроизвести не смог. Отобрал несколько случаев не сильно замороченных и с подобранными короткими примерами. Возможно, что не всё сразу (терпения скорее всего не хватит)
Более того, если мы тождествнно переделаем тест (минус уберём в статическую инициализацию)
Рассмотрим фрагменты кода в "плохом" и "хорошем" случае. Стрелочками отмечу различия "Плохой" случай:
У себя эту ситуацию мы встретили в единичных случаях. Как показывает практика в "обычных" задачах (т.е. обычных прикладных программах) "тяжёлое" преобразование "uint64 -> floatXX" встречается нечасто, однако в счётных задачах типа моделирования физических процессов или каких-нибудь математических расчётов (особенно на фортране) - ситуация встречается сплошь и рядом. Поскольку ошибка присутсвует в компиляторе несколько лет (ибо как минимум это диапазон от "стабильной" версии 3.4.6 до 4.1.3), возможно, что счётными задачами компилятором gcc в мире активно не пользуются. Либо при этом используют какие-нибудь дополнительные опции оптимизации с плавающей арифметикой, при работе с которыми код строится по другому и данная ошибка не проявляется. Мы у себя это дело заткнули и приняли к сведению. Но на поиск ошибки, когда переходили от gcc-2.95.3 на gcc-3.4.6, потратили немало времени Добавлено через 48 минут 17 секунд ======================================== =================== ======================================== =================== ======================================== =================== Аналогично предыдущей, эта ошибка проявляется на gcc-3 и gcc-4 и не проявляется на gcc-2.95
"Правильный" случай
Понятно дело, что такие отличия критичны только для математических расчётов, где требуется высокая точность. Т.е. в обычных прикладных программах мы этой разницы не почуствуем, зато скорость исполнени будет выше, чем при "честных" расчётах. Однако опасность этого дела такая, что когда мы вычисляем "простое" выражение (т.е. одну арифметическую операцию, затем запись результата), то оно вычисляется с "честной" точностью, а когда вычисляем "сложное" выражение (несколько операций, а потом запись результата), то вычисления происходят с "НЕчестной" точностью. В этом месте начинает появляться некоторое отклонение, которое для некоторых алгоритмов при больших данных начинает накапливаться и со временем выливается в ощутимую разницу. Т.е. для программ типа 3d-studio это может очень хорошо стрельнуть Теоретически в компиляторе есть какие-то опции, которые запрещают схлопавание пары плавающих store-load, на практике на коротких примерах вроде бы как работало, а на длинных возникают косяки. Один из косяков оказался принципиальным. Если у нас есть вызов плавающей стандартной функции типа sqrt, то в случае без оптимизаций компилятор оставляет вызов процедуры, а в случае с оптимизациями принудительно заменяет вызов sqrt на __builtin_sqrt, который реализует через аппаратные интеловские операции вычисления корня. Если всё это находится в сложном выражении, то всё равно это делается через float80. В итоге мы так и не смогли побороть проблему (для нас в первую очередь критичным оказалось различное поведение в release'ной и отладочной версии программы). Лечится просто - везде использовать long double. Но для большой программы везде всё поменять, это тоже куча потраченного времени, далее нужно везде менять значения в эталонных тестах - опять-таки огромная поетря времени. Для программ с большими данными это ещё и влечёт за собой увеличение потребления памяти (что для критично задач типа тех, что в реальном времени обрабатывают данные с локаторов). Ну и проблемы при совместном использовании разных компиляторов (которая косвенным образом появляется при использовании другого компилятора но при этом используется glibc, собранная gcc'ями) или же проблемы при переходе с одной версии компилятора на другую. Есть ли какие-то различия между gcc-3 и gcc-4 мы уже смотреть не стали, ибо заткнув всё через float80 уже не стали исследовать вопрос дальше
3
|
|||||||||||||||||||||||||||||||||||||||||
|
13 / 13 / 0
Регистрация: 29.10.2009
Сообщений: 71
|
|
| 06.11.2010, 18:24 | |
|
под линукс intel c compiler бесплатен
0
|
|
| 06.11.2010, 18:24 | |
|
Помогаю со студенческими работами здесь
32
Посоветуйте компилятор для написания программ под Linux знаю только CodeLite
Компилятор C++ под Ubuntu Linux 9.04 Посоветуйте бесплатный C++ компилятор под Windows Посоветуйте, пожалуйста, адекватную графическую библиотеку под Linux Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Символьное дифференцирование
igorrr37 13.02.2026
/ *
Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2).
Унарный минус обозначается как !
*/
#include <iostream>
#include <stack>
#include <cctype>. . .
|
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
|
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу,
и светлой Луне.
В мире
покоя нет
и люди
не могут жить в тишине.
А жить им немного лет.
|
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила»
«Время-Деньги»
«Деньги -Пуля»
|
|
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога
Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога
Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
|
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
|