LINUX.ORG.RU

C vs C++ :)


0

0
Я не программист, я биохимик. Понадобилось напрограммировать одну модель. Грубо говоря, она сводится к рассчётам нескольких десятков тысяч объектов, каждый из которых представляет из себя по большому счёту 4 массива из floats и около десятка численных характеристик, из которых некоторые рассчитываются из этих двух массивов, другие заимствуются от других объектов, а третьи задаются конфигурацией системы и одинаковы для всех объектов. В общем случае размер массива от объекта к объекту может меняться, но на первом этапе можно оставить его постоянным. Т.к. в будущем модель будет дополняться новыми характеристиками объектов, первым в голову приходит С++. Почему-то часто приходится слышать о непригодности С++ для рассчётов (а у нас они будут довольно ресурсоёмкими). Скажите, в общем случае для подобной задачи можно ли сказать, что (очевидное по-моему) удобство С++ не окупает потери при числодроблении, и лучше попытаться сделать всё на С? Прототип модели бегает на данный момент на матлабе, но скорость удручает.
anonymous
Ответ на: комментарий от tche
Это я про то, что нужно использовать std::vector на цпп, а не писать свою бажную медленную реализацию на ц. Использовать виртуальные методы, а не свои бажные и медленные указатели на функции в структурах. Про C vs CPP вообщем :) Я просто часто подобное вижу, приходиться поддерживать такое вот г.
binnehex
()
Ответ на: комментарий от binnehex
> приходиться поддерживать такое вот г.

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

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

Одно преобразование числа в строку чего будет стоить. Можете продемонстрировать как оно выполняется в крестах?

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

Если не принимать во внимание случаи клинического идиотизма разработчиков (тут уж от конкретного языка ничего не зависит), то такую программу на голом Си раз в 5 больше времени писать и раз в 10 больше ошибок copy-paste. Более выразительный язык предоставляет более широкие уровени абстракций, позволяя сконцентрироваться на проблеме, а не на низкоуровневых реализациях. Если не перегибать палку и не пытаться на С++ реализовать особо сложные задачи, более подходящие для языков уровнем ещё выше, то вполне себе язык. КПД, конечно, низковат по современным меркам, но ничего особо страшного.

mv ★★★★★
()
Ответ на: комментарий от tche
Из описания проблемы -> "первым в голову приходит С++"
его и необходимо использовать.

>Скажите, в общем случае для подобной задачи можно ли сказать, что >(очевидное по-моему) удобство С++ не окупает потери при числодроблении, >и лучше попытаться сделать всё на С?

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

>а у нас они будут довольно ресурсоёмкими

наиболее ресурсоёмкими рассчётами (во всем мире),
на настоящиий момент, являются обработка и симуляция данных
ускорителя LHC в CERN (пентабайты данных).
"Рабочим" языком является C++, рабочей "framework" - система ROOT
http://root.cern.ch (в разработке которой я участвую).

> Прототип модели бегает на данный момент на матлабе,
> но скорость удручает.

Советую перейти на ROOT, как замену MatLab
Valeriy_Onuchin ★★
()
Ответ на: комментарий от mv
> string s = boost::lexical_cast<string>(123);

Красота! А нельзя от этого: "boost::lexical_cast<string>(" и ")" - как-нибудь абстрагироваться? Что бы сконцентрироваться на проблеме, а не на реализациях? Перегрузить там оператор присваивания строке для типа int, например?

anonymous
()
Ответ на: комментарий от anonymous
> Красота! А нельзя от этого: "boost::lexical_cast<string>(" и ")" - как-нибудь абстрагироваться? Что бы сконцентрироваться на проблеме, а не на реализациях?

Ну если вы хотите себе проблем, то С++ позволяет получить их просто неимоверное количество. lexical_cast с явным указанием типа приведения понятен даже вам, а вот практически каждый программист при просмотре текста программы, в которой будет string s = 123 (да ещё в завуалированном виде), как минимум притормозится на этой строчке. Будьте проще.

> Перегрузить там оператор присваивания строке для типа int, например?

Можно, в билдере, по-моему, так и сделано.

mv ★★★★★
()
Ответ на: комментарий от anonymous
>как в c/c++ проверить открыт ли файл не пользуя fopen&? ААААААААААААААААААААААААААААА Черт меня побери!!!!!!!!!!

int fstat(int filedes, struct stat *buf);

before
()
Ответ на: комментарий от dave
> Еще хороший вариант - старый добрый паскаль. Возможно delphi.

Зачем эти посредственности, когда есть Ада?

Nihilist ★
()
Ответ на: комментарий от Jini
> Это есть даже в классическом труде Страуструпа. Причина в том, что без const& параметр копируется, соответственно, тратится время на лишние операции с памятью и вызов конструкторов/деструкторов.

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

Nihilist ★
()
Ответ на: комментарий от Valeriy_Onuchin
>наиболее ресурсоёмкими рассчётами (во всем мире), на настоящиий момент, являются обработка и симуляция данных ускорителя LHC в CERN (пентабайты данных). "Рабочим" языком является C++, рабочей "framework" - система ROOT

Наиболее ресурсоемкие расчеты на LHC -- это монте-карло детекторов на GEANT4, рабочим фреймворком ROOТ является только для конечной стадии анализа данных и как средство для хранения классов C++ в файлах. Рабочим же фреймворком для эксперимента ATLAS. например, является Athena. И GEANT4 и Athena (под Athena я подразумеваю весь набор алгоритмов для реконструкции, симуляции и т.д.) обладают дерьмовой документацией и охрененным количеством классов. Так что предлагать их в качестве хорошего примера я бы не стал. А любителям покричать, что система классов С++ делает документацию не столь необходимой я предлагаю в качестве упражнения до конца разобраться в коде GEANT4.

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

C этим полностью согласен.

anonymous
()
Ответ на: комментарий от anonymous
Насчет GEANT4 могу еще добавить, что по существу это достаточно тупая программа, на которую можно составить техзадание, спроектировать ее и несколько десятков лет ей пользоваться не особо развивая ее. Так этот GEANT4 собственно и появился на свет. Поэтому мне, как конечному пользователю абсолютно наплевать, на чем он написан, единственное требование к таким системам --- это полноценная документация, а не краткое введение + набор примеров.

anonymous
()
Ответ на: комментарий от anonymous
Продолжу :). СЕRN --- это организация с приличным бюджетом и большим количеством людей. Поэтому CERN может себе позволить довести до рабочего состояния даже полное дерьмо. Поэтому то, как делают в CERN --- это не всегда верх совершенства.
anonymous
()
Для полноты картины могу предложить еще такой вариант. Написать всю бизнеc-логику на Java, а потом заюзать ее с помощью AnyLogic, которая тоже, кстати, написана на Java, но, правда, стоит хороших денег... ;)

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

Мне вот интересно, а почему прототип бегает медленно. Может быть, даже переписав на C/C++, вы получите не намного более быстрый код? Я просто никогда не использовал Mathlab, хотя многие знакомые его нахваливали. Неужели его скрипты так сильно уступают в скорости самописному коду?! Одолевают меня смутные сомнения...

dave ★★★★★
()
Ответ на: комментарий от dave
>Мне вот интересно, а почему прототип бегает медленно. Может быть, даже переписав на C/C++, вы получите не намного более быстрый код? Я просто никогда не использовал Mathlab, хотя многие знакомые его нахваливали. Неужели его скрипты так сильно уступают в скорости самописному коду?! Одолевают меня смутные сомнения...

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

anonymous
()
Ответ на: комментарий от anonymous
> > Никто не будте писать

> Это свойство языка, компилятора и неких "всех", от имени которых вы высказались?

Т.е. вы таки пишете спагетти-код?

> > j = 3; k = i << j; и k = i << 3;

> С этим к производителю конкретного компилятора, при чем тут язык?

если функция имеет вид

inline unsigned char c_nth_byte(unsigned long long value, unsigned byteno) {
  assert(byteno <= sizeof(value));
  return value >> (byteno * CHAR_BIT);
}

то она всегда будет медленнее, чем

template<unsigned byteno> inline unsigned char cpp_nth_byte(unsigned long long value) {
      assert(byteno <= sizeof(value));
      return value >> (byteno * CHAR_BIT);
}

Да, я знаю, что они не эквивалентны.
anonymous
()
Ответ на: комментарий от anonymous
>всегда будет медленнее

Неправда. При inline-подстановке компилятор точно так же может заменить byteno на константу, если соответствующий параметр функции -- константа.

tche
()
Ответ на: комментарий от anonymous
Сейчас простая числодробильня типа а+b работает почти везде одинаково, что на C/C++, что на Java/.NET, что даже на JScript.NET. Вероятно, Mathlab не должен сильно отставать.

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

dave ★★★★★
()
Ответ на: комментарий от dave
>Что касается кеша и оптимизации работы с матрицами, то неужели у вас все так серьезно?!

У меня да, но я не тот анонимус с матлабом :)

anonymous
()
Ответ на: комментарий от dave
> Что касается кеша и оптимизации работы с матрицами, то неужели у вас все так серьезно?!

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

mv ★★★★★
()
Ответ на: комментарий от mv
> Perfomance drop при обработке больших матриц с помощью обычных, незаточенных алогоритмов просто дикий.

Это я понимаю. Вопрос в том, знают ли об этом биохимики? ;)

dave ★★★★★
()
Ответ на: комментарий от dave
>Это я понимаю. Вопрос в том, знают ли об этом биохимики? ;)

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

anonymous
()
Ответ на: комментарий от tche
> Неправда. При inline-подстановке компилятор точно так же может заменить byteno на константу, если соответствующий параметр функции -- константа.

Идея примера взята из реализации radix sort одним коллегой. Там внешний цикл по byteno, и компилятор, естественно, его не разворачивает и 8 разных инлайнов не генерирует, если обычной фунцией пользоваться. А если заменить цикл на рекурсивный шаблонный вызов - то разворачивает и генерирует, и становится (вся реализация в целом) на 30% быстрее...

anonymous
()
Ответ на: комментарий от anonymous
Линейная система с 1000 переменными - задача довольно необычная для обычного программирования (с моей точки зрения как прикладного математика) :)

Я тут по телику не так давно одного перца видел, который советы давал о выборе будущей профессии. Так, он на полном серьезе заявил, что для того, чтобы стать "программистом", поступать в вуз не надо, а лучше годов с 17 устроиться работать на какую-нибудь фирму и дальше продолжать в таком же духе свою "карьеру". Еще этот перец обмолвился о ВМК МГУ, что мол тамошних дядек, студентов переростков, можно нагнать года за два... А ты говоришь LAPACK... :)

dave ★★★★★
()
Ответ на: комментарий от dave
> Это я понимаю. Вопрос в том, знают ли об этом биохимики? ;)

Инженер по специальности Котло- и Реакторостроение знает, отчего ж биохимику не знать? ;)

mv ★★★★★
()
Ответ на: комментарий от dave
> а лучше годов с 17 устроиться работать на какую-нибудь фирму

Конечно же, полная фигня. Математика хотя бы в том объёме, что дают на начальных курсах, крайне необходима. А систематизация и обработка данных, которую прививают на старших курсах инженерной специальности, вообще в принципе думать учит :) Если в голове нужного базиса нет, чтобы дисциплины самостоятельно освоить, то code monkey на php очередная получится.

mv ★★★★★
()
Ответ на: комментарий от mv
> Ну если вы хотите себе проблем, то С++ позволяет получить их просто неимоверное количество. lexical_cast с явным указанием типа приведения понятен даже вам, а вот практически каждый программист при просмотре текста программы, в которой будет string s = 123 (да ещё в завуалированном виде), как минимум притормозится на этой строчке. Будьте проще.

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

anonymous
()
Ответ на: комментарий от dave
> Так, он на полном серьезе заявил, что для того, чтобы стать "программистом", поступать в вуз не надо, а лучше годов с 17 устроиться работать на какую-нибудь фирму и дальше продолжать в таком же духе свою "карьеру".

А чо? Всё правильно: вызубрил несколько десятков паттернов - и вперёд. Что ещё надо программисту?

anonymous
()
Ответ на: комментарий от mv
> Если в голове нужного базиса нет, чтобы дисциплины самостоятельно освоить, то code monkey на php очередная получится.

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

dave ★★★★★
()
Ответ на: комментарий от dave
> Если в голове нужного базиса нет, чтобы дисциплины самостоятельно
> освоить, то code monkey на php очередная получится.

лично меня впечатляет, как преподают программирование буржуи.
Вот пример одного из курсов по графике:
http://cagd.cs.byu.edu/~557/
а ведь это только малая толика того, что должен изучить студент ...
Valeriy_Onuchin ★★
()
Вы не можете добавлять комментарии в эту тему: топик перемещен в архив.