влияет ли использование в C++ классов на скорость проги?

NataNata

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

slonishka

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

Ivan8209

> придется использовать много объектов типа матриц
BLAS, LAPACK и никаких сей, тем более --- приплюснутых.
---
"Real Programmers do Accounting (if they do it at all) in Fortran."

kokoc88

насколько, в принципе, будет различаться скорость работы, к примеру, с матрицами, реализованными в виде класса и скорость работы с матрицами, работа с которыми реализована процедурами в стиле обычного си?
Программа, написанная на Си, будет работать медленнее, чем написанная на Си++. Только ты вряд ли сможешь написать программу именно на Си++, да ещё так, чтобы она работала быстрее каких-то специализированных математических пакетов или других языков, типа C# и Java. Ключевым моментом в программировании таких вещей на Си++ будут шаблоны и, как сейчас видится, правильное использование оператора new.
Так же стоит посмотреть на uBLAS в boost.

banderon

нужно писать с нуля.
Нужно все совсем самому писать? или можно не изобретать велосипед, и использовать уже готовое, отлаженное, и хорошо работающее?
Я, вообще, согласен с КОНТРОй. Мне еще вспоминается название ATLAS. Но я пользовался всеми этими blas/lapack'ами очень давно и мало.
PS: может и оффтопик, но все же хоть как-то связано с C vc C++
Первоисточник можно найти на форуме ФДС в архивах примерно год назад.
Вопрос (автор: Jikon):
Исходя из простейших представлений о компиляции, можно предположить, что
int a;
cin >> a;

будет компилироваться с оптимизацией в простое чтение int, поскольку на этапе компиляции уже известно, какой тип надо считывать, в то время как вариант
int a;
scanf("%d", &a);

должен определять этот тип во время исполнения, разбирая по косточкам форматную строку.
Тем не менее, на практике (VC++ 2003) второй вариант быстрее на порядок. Почему?

Vladu

мне нужно написать вычислительную прогу. считать будет много. нужно писать с нуля. придется использовать много объектов типа матриц и т.д.
http://www.mathcom.com/corpdir/techinfo.mdir/q160.html#q160....
Библиотека blitz++ существует уже больше 10 лет
и хорошо себя зарекомендовала
http://www.oonumerics.org/blitz/
http://www.oonumerics.org/blitz/benchmarks/acoustic.html

rosali

> Почему?
потому что смысл библиотеки iostream не в том чтобы работало быстро, а в том чтобы удобно было писать и получалось без ошибок. оператор >> синхронизует треды, синхронизует потоки между собой (см. tie и делает много чего другого, что scanf-у и не снилось. а если нужно чтобы io работал быстро, то пользуются write/read или даже mmap.

pitrik2

scanf("%d", &a);
должен определять этот тип во время исполнения, разбирая по косточкам форматную строку.
от компилятора зависит
кажись gcc если включенаоптимизация - парвит этот %d во время компиляции
если отключена, то не парсит

banderon

Ну не знаю, мне это кажется маловероятным. Все же компилит gcc, а scanf берется из glibc. Ну это и не очень важно.
Вот что мне больше всего не нравится в glibc, так это то, что вот такой код:
  char* pc; // указатель на ОЧЕНЬ длинную строку
int n;

sscanf(pc, "%d", &n); // считать только первый int
Такой код работает за время линейно зависящее от длины "строки" pc. Не знаю зачем, но sscanf явно ищет первый '\0' после pc, и только потом начинает парсить форматную строку

laki

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

Reves2

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

Olenenok

мне нужно написать вычислительную прогу. считать будет много. нужно писать с нуля. придется использовать много объектов типа матриц и т.д. насколько, в принципе, будет различаться скорость работы, к примеру, с матрицами, реализованными в виде класса и скорость работы с матрицами, работа с которыми реализована процедурами в стиле обычного си?
смысла писать вычислительные программы на цепепе нет вообще, Си достаточно. Максимум, что цепепе в данном случае может предложить удобного - autoptr (auto_ptr ?).
Ну а если использовать в качестве массивов векторы, то, по сравнению с обычными массивами при хорошо написанной программе, скорость падает раза в 3.

okunek

> смысла писать вычислительные программы на цепепе нет вообще, Си достаточно
срочно иди ботай, чем отличается си от си++
> Максимум, что цепепе в данном случае может предложить удобного - autoptr (auto_ptr ?)
жесть! ты советуешь то, чем никогда не пользовался (ибо даже не знаешь как правильно пишется)
> если использовать в качестве массивов векторы, то, по сравнению с обычными массивами при хорошо написанной программе, скорость падает раза в 3
а вот это хит сезона! ты код вектора из стл-я какого-нибудь компилятора вообще смотрел когда-нибудь?

kokoc88

а вот это хит сезона! ты код вектора из стл-я какого-нибудь компилятора вообще смотрел когда-нибудь?
Насколько я помню, автор пишет свои "крутые" массивы, т.к. не может эффективно использовать stl.

okunek

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

Olenenok

а вот это хит сезона! ты код вектора из стл-я какого-нибудь компилятора вообще смотрел когда-нибудь?

более того, я пытался его использовать как раз в вычислительной задаче . В случае тупо написанного метода вращений скорость при использлвании вектора и сишного массива была одинаковой. При использовании блочного метода с одномерным вектором скорость была как раз в три раза ниже чем с сишным массивом (примерно 4.3 секунды у Си и > 15 секунд у вектора). Уверен, что в многомерном векторе получилась бы мегажесть.
жесть! ты советуешь то, чем никогда не пользовался (ибо даже не знаешь как правильно пишется)

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

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

Olenenok

В любом случае, можно реализовать многомерные массивы через вектор, при этом, грамотно их используя, не особо потерять в производительности.
При этом в сравнении с сишными массивами, появится доп. приемущества.
ну это просто лол, ты предлагаешь матрицу делать как
std::vector<std::vector<double>>  

?
Уахаха!

kokoc88

я знаю чем он отличается, поэтому и не советую его использовать для численных методов, смысла нет никакого
Как минимум ты не знаешь про шаблоны, на которых можно легко поднять производительность вычислительной задачи.
использовании блочного метода с одномерным вектором скорость была как раз в три раза ниже чем с сишным массивом (примерно 4.3 секунды у Си и > 15 секунд у вектора). Уверен, что в многомерном векторе получилась бы мегажесть

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

okunek

std::vector<std::vector<double>>
нет, я пробел добавлю между двумя последними символами

Olenenok

Насколько я помню, автор пишет свои "крутые" массивы, т.к. не может эффективно использовать stl.
Во-первых, "свой крутой массив" в том алгоритме был лучше вектора (нужно было часто увеличивать вместимость, при этом никакой верхней оценки не было, размер мог становиться очень большим, частенько доходил до 100-120Мб).
Во-вторых, многие контейнеры из std довольно неэффективные. Например, стринги.
Ну а в-третьих, лучше бы я тогда изменил алгоритм, на самом деле, чтобы использовать вектор и не клеить велосипеды

okunek

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

ava3443

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

Olenenok


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

ну-ну, -O3 --ffast-math --march=....

kokoc88

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

okunek

Значит ты гонишь. С двумерными массивами - еще можно поверить, с одномерными оптимизатор сделает свое дело.

kokoc88

ну-ну, -O3 --ffast-math --march=....
Давай поступим иначе. Напиши код, в котором вектор проигрывает обычному массиву. А то совсем не понятно, что ты имеешь ввиду.

Olenenok

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

Olenenok

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

Olenenok

Как минимум ты не знаешь про шаблоны, на которых можно легко поднять производительность вычислительной задачи.
valarray штоле? ну нафек, между взбатыванием валаррея и взбатыванием уже готовой счётной библиотеки я всеми силами буду советовать второе.

kokoc88

valarray штоле?
Нет, я говорю про слово template в коде Си++ и о том, как с его помощью писать производительный код. Мы уже давно не говорим об использовании готовых решений. Обсуждаем проблемы производительности Си++ vs Си.

Olenenok

Давай поступим иначе. Напиши код, в котором вектор проигрывает обычному массиву. А то совсем не понятно, что ты имеешь ввиду.
Я обычный vector<vector<double> > и struct { int row, col; double* } и имею ввиду. В этом случае при блочном методе и происходило падение скорости. Использовать vector<double> уже не имело смысла, т.к. нужно хранить две размерности.

kokoc88

Я обычный vector<vector<double> > и struct { int row, col; double* } и имею ввиду. В этом случае при блочном методе и происходило падение скорости. Использовать vector<double> уже не имело смысла, т.к. нужно хранить две размерности.
Напиши тест, начиная от функции main? А я перепишу так, чтобы векторы не проигрывали Си-шным массивам.

Olenenok

Ну так и чего, сишные массивы инкапсулировать? Это нужно? Я говорю, что почти всегда разницы в скорости между c++ и c решением в данной области почти не будет. Так же, как почти не будет разницы во времени разработки. А с понятностью, боюсь, проблемы будут как раз у c++ программ. Так что смысла в использовании c++ здесь нет, имхо.

kokoc88

Ну так и чего, сишные массивы инкапсулировать? Это нужно?
Ты не понимаешь. Шаблоны - они гораздо интереснее. Почитай про template expressions. Подумай про другие возможности шаблонов, типа compile-time вычислений.

ava3443

compile-time вычислений
во-во
Joe , почитай что-нибудь из статей, которые на сайте рядом с Blitz++ лежат: http://www.oonumerics.org/blitz/papers/

Olenenok

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

Olenenok

ну вот, например. Перемножение матриц.

kokoc88

ну вот, например. Перемножение матриц.
Нет, это не то. Это код на Си, где, кроме прочего, куча неточностей, свойственных этому языку. И вообще при выходе из main, если это готовая программа, принято освобождать память.
Меня интересует твой бенчмарк, где ты используешь либо std::vector, либо Си-шный массив; и где у тебя получается так, что вектор работает медленнее.

Oper

свойственных этому языку
вот ты фанатик, а в сиплюсплюс нет типа ни одной неточности ?

Olenenok

принято освобождать память.
бугога, правда, отвык уже. Вот почему цепепе тоже отстой - надо вручную освобождать.
либо std::vector, либо Си-шный массив  

как тут предлагал товарищ пропеллер, надо заменить в matrix_block double* на vector<vector<double>>, после чего наблюдать картину всоса

okunek

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

kokoc88

вот ты фанатик, а в сиплюсплюс нет типа ни одной неточности ?
Есть. Причём довольно много. Но в этой ветке настоящие проблемы этого языка не озвучены.

kokoc88

бугога, правда, отвык уже. Вот почему цепепе тоже отстой - надо вручную освобождать.
В Си++ как раз вручную не надо.
как тут предлагал товарищ пропеллер, надо заменить в matrix_block double* на vector<vector<double>>, после чего наблюдать картину всоса
Вот я и прошу: напиши простой для понимания тест, где ты сравниваешь vector<double> и double* или какие ты хочешь. (Мягко говоря не ясно, как ты предлагаешь заменять double* на vector<vector<double>>) Строчек 20-100, иначе разбираться нет смысла.

Oper

Но в этой ветке настоящие проблемы этого языка не озвучены
а ты этого хочешь ?

kokoc88

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

salora

напиши простой для понимания тест
в "простом для понимания" разница вряд ли будет значительной. Она выявляется на блочных алгоритмах, в которых как раз, разница между кодом на С и С++ будет очень незначительной, и шаблоны здесь ничуть не помогут, они в данном случае не нужны.

kokoc88

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

pitrik2

Ну не знаю, мне это кажется маловероятным. Все же компилит gcc, а scanf берется из glibc. Ну это и не очень важно.
http://www.ciselant.de/projects/gcc_printf/gcc_printf.html
правда это про printf, а scanf может он и не оптимизит

karkar

Мне довелось писать один вычислительный алгоритм (MSU Super Resolution) на С++ и С (Real Networks любит чистый С, понимаете ли). По скорости работы разницы не было. По скрорости и удобству разработки разница значительная. Например, на С++ шаблоны позволили один раз реализовать множество алгоритмов работы с изображением, и было не важно, из чего оно состоит - из байтов, из даблов или из троек-четверок байтов или даблов. При переписывании на С пришлось некоторые методы реализовывать по несколько раз для каждого типа изображения.

salora

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

Marinavo_0507

При переписывании на С пришлось некоторые методы реализовывать по несколько раз для каждого типа изображения.
Это препроцессором делается.

Ivan8209

> И вообще при выходе из main, если это готовая программа,
> принято освобождать память.
Нафиг?
Кем, когда и где это принято?
Освобождением неразделяемой памяти занимается ОС,
большого смысла освобождать то, что и так окажется свободным,
нет.
---
SINT VT SVNT AVT NON SINT

Oper

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

Ivan8209

>> compile-time вычислений
> во-во
Очевидно, что идеальный оптимизатор должен произвести все
расчёты во время компиляции, только где при этом выигрыш
времени, если оптимизатор может работать медленнее, чем
неоптимизированная программа, пока неясно.
---
...Я работаю антинаучным аферистом...

Ivan8209

> 1. Если в дальнейшем программа будет преобразована в библиотеку,
А если нет?
> освобождать ее все равно придется.
Даже при однократном использовании и быстром выходе.
> 2. При отладке можно будет убедиться в отсутствии утечек памяти.
Если они несущественны, то время, затрачиваемое на их устранение,
ничем не оправдывается.
---
...Я работаю антинаучным аферистом...

Oper

Даже при однократном использовании и быстром выходе.
Библиотека на то и создается, что она не знает кто и как ее будет использовать. Утечка памяти в библиотеке — это уже серьезная уязвимость.

kruzer25

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

Ivan8209

> Я могу помочь сделать производительную программу на Си++ и переубедить,
> но для этого мне нужно видеть, какую именно ошибку ты совершаешь.
Раньше ты говорил вот это:
M> Напиши тест, начиная от функции main? А я перепишу так,
M> чтобы векторы не проигрывали Си-шным массивам.
Кроме того, если инструмент слишком сложен для использования,
то он просто не годится. Например, очевидно, что если правильно
использовать двоичный редактор, можно уделать и компилятор сей,
и компилятор приплюснутых сей. Только это надо уметь, но для
этого надо нехило много знать, причём сразу много. Кроме того ---
обладать, мягко говоря, не средними человеческими способностями.
---
...Я работаю антинаучным аферистом...

Ivan8209

> Библиотека на то и создается, что она не знает кто и как ее
> будет использовать.
Ой, насмешил!
И многие могут использовать Blitz++, не зная плюсов?
К BLAS, LAPACK и иже с ними хотя бы куча обёрток идёт,
почти ко всем языкам.
Не будем пока касаться случаев, когда библиотека создаётся
исключительно для внутреннего использования или просто из
технических удобств.
> Утечка памяти в библиотеке — это уже серьезная уязвимость.
Ну и каковы убытки при взломе? При неправильной работе?
У тебя на руках экспертная оценка риска?
Тогда числа на стол.
---
...Я работаю антинаучным аферистом...

Ivan8209

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

Oper

Ну и каковы убытки при взломе? При неправильной работе?
У тебя на руках экспертная оценка риска?
 - Оценки убытков при взломе оцениваются не только исходя из степени "опасности" уязвимости, и даже стоимости взломанной вычислительной системы. Еще важно, например, знать ценность (или критичность) объекта автоматизации, скажем так.
 - Прямое следствие утечки памяти в библиотеке, равно как и любой накапливающейся утечки памяти (в цикле, например) — приводит к отказу в обслуживании. Дальнейшее зависит от того где и при каких обстоятельствах отказ происходит.
Стоимость рассчитывается исходя из всех перечисленных параметров, кстати какие-то эвристические методики оценки рисков уже существуют, хотя я не буду утверждать, что они сильно хорошие.

Ivan8209

Ну так числа у тебя есть готовые или нет?
Вопрос-то конкретный.
---
"Абстрактной истины нет."

Oper

Ну так числа у тебя есть готовые или нет?
Вопрос-то конкретный.
А ты мне задашь конкретные значения всех параметров — будут числа.

Ober

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

Ober

А ты мне задашь конкретные значения всех параметров — будут числа.
Ну ладно, так ещё можно. Но один раз.

kruzer25

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

Ivan8209

Да на самом деле хоть миллионы.
Или ты стал писать сайты на высокооптимизированных сях?
---
...Я работаю антинаучным аферистом...

kokoc88

Раньше ты говорил вот это:
Я вижу мастер "придерусь хуй знает к чему, хотя сам нихуя не знаю" снова активировался... И как обычно, не в той теме, где он что-то соображает. Думаешь, мы забыли твои самые очевидные проёбы, где ты так и не сказал "да, ребята, я проебался, извините"? Про Ленина , Паскаль, а также отмазки на scheme, которые ты назвал "рабочим кодом", и где я потом отловил ряд багов? Нет, не забыли. Можем напомнить ссылками. А ты определённо забыл, что тебе надо поботать что-нибудь про программирование, прежде чем писать в этот раздел.

banderon

http://www.ciselant.de/projects/gcc_printf/gcc_printf.html
правда это про printf, а scanf может он и не оптимизит
В любом случае в приведенной статье printf меняется только на puts/putchar. И все случаи тривиальны. Нет ни одного, где в форматной строке встретился бы вывод числа.
И это правильно, так как вывод printf("%.2f", 3.1415926) может зависеть от LC_NUMERIC во время выполнения программы.

sbs-66

Рассмотрим такую задачу.
Есть массив каких-нибудь данных. Ну, это будут какие-нибудь простенькие структуры с 2-3 перемеными типа int или double, например. И нам надо этот массив несколько раз отсортировать по каким-нибудь простым (по временной сложности сравнения но запутанным критериям, вроде такого:
если старший бит первого int отличается у двух данных, то раньше должны идти данные, у которых он 0.
если старший бит первого int равен, и равен 0, то сортируем по возрастанию второго int,
а если равен 1, то по убыванию третьего int.
Ну, лили что-то такого рода. Таких способов сортировки у нас пара десятков, скажем.
Как решить задачу на C? Надо написать метод сортировки, которому в качестве параметра передавать указатель на нужную функцию, задающую порядок данных.
Как решить задачу на C++? Надо написать шаблонную функцию (или метод) сортировки, которому в качестве параметра шаблона передаётся класс, у которого есть inline-функция, задающая порядок данных.
Разнича, на первый взгляд не существенная. Но в случае С++ функция сортировки будет inline, и она при компиляции подставится в коде, съэкономив накладные расходы на вызов функции (сворацивание и разворачивание стека). Если метод сравнения достаточно простой, то эти накладные расходы будут занимать очень сущесвенную часть времени сортировки, и код на С++ может работать в несколько раз быстрее, чем код на С. Чтобы добиться на C того же результата надо тупо писать несколько десятков одинаковых методов сортировки.
Спасибо за внимание.

pitrik2

а помойму контра в этот раз прав
вы петушитесь как незнамо кто
а на деле ничего не можете
другой вопрос что все петушаться
видимо так принято
но это не мешает контре спросить: хули петушитесь?

banderon

Микробенчмарка (автор: , я надеюсь он не против будет)
Задача: считать несколько строчек из символов 'a'..'z' (по 1000 символов разделённые '\n', отсортировать, вывести.
В сишном варианте для строк использовались char[1024] (*char[1024] для сортировки - sort(data, n, 1024, strcmp) , для ввода/вывода - printf/scanf. В приплюснутом — string (vector<string> шаблонный алгоритм sort (из STL >>/<< соответственно.
C
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

typedef char str[1024];

int main
{
str *x = malloc(4096*sizeof(str;
int alloc=4096, i;

time_t t = clock t1;

for (i=0; scanf("%s", x[i])==1; i++)
if (i+1==alloc)
x = realloc(x, (alloc*=2)*sizeof(str;

t1 = clock;
fprintf(stderr, " read: %lld\n", (long longt1-t;

qsort(x, i, sizeof(str strcmp);

t = clock;
fprintf(stderr, " sort: %lld\n", (long longt-t1;

for (i--; i>=0; i--)
printf("%s\n", x[i]);

t1 = clock;
fprintf(stderr, "print: %lld\n", (long longt1-t;

free(x);

return 0;
}

C++
#include <iostream>
#include <string>
#include <ctime>
#include <vector>

int main
{
typedef std::vector<std::string> Vi;
Vi x;
int y;
std::string s;

std::ios_base::sync_with_stdio(0);

std::time_t t1, t = std::clock;

while (std::cin >> s)
x.push_back(s);
t1 = std::clock;

std::cerr << " read: " << t1-t << std::endl;
std::sort(x.begin x.end;
t = std::clock;
std::cerr << " sort: " << t-t1 << std::endl;

for (y = x.size-1; y>=0; y--)
std::cout << x[y] << std::endl;
t1 = std::clock;
std::cerr << "print: " << t1-t << std::endl;
return 0;
}

gcc 4.1.2
Using built-in specs.
Target: i486-linux-gnu
Configured with: ../src/configure -v --enable-languages=c,c++,fortran,objc,obj-c++,treelang --prefix=/usr --enable-shared --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --enable-nls --program-suffix=-4.1 --enable-__cxa_atexit --enable-clocale=gnu --enable-libstdcxx-debug --enable-mpfr --enable-checking=release i486-linux-gnu
Thread model: posix
gcc version 4.1.2 (Ubuntu 4.1.2-0ubuntu4)

Ключи (первый запуск был с -fprofile-generate)
 -W -Wall -Wextra -O3 -march=prescott -fprofile-use

Результаты: (время в секундах, среднее по нескольким последовательным запускам, размер файла ~256Mb)

C C++
read: 3.480 0.995
sort: 3.890 0.680
print: 0.260 0.260

slonishka

в сишном варианте malloc и qsort все тормозят.
если массив размещать в стеке, в первой строчке результатов должно получиться меньше расхождение.
впрочем, на фоне тормозов qsort-а это будет незаметно.

kokoc88

а помойму контра в этот раз прав
Ты посты-то читаешь или нет?.. В чём он прав в ответе на мои сообщения? Простая придирка к словам и мозгоёбство. За это я его и посылаю куда подальше.
Как показала многолетняя практика, каждый, кто говорит "кохтпа прав" обычно просто не читает форум. Кохтпа бывает прав, но в разделе "Development" в 5% случаев, в 95% он просто ебёт всем мозг.

pitrik2

Ты посты-то читаешь или нет?.. В чём он прав в ответе на мои сообщения? Простая придирка к словам и мозгоёбство. За это я его и посылаю куда подальше.
Как показала многолетняя практика, каждый, кто говорит "кохтпа прав" обычно просто не читает форум. Кохтпа бывает прав, но в разделе "Development" в 5% случаев, в 95% он просто ебёт всем мозг.
ну я сам с ним частенько не соглашаюсь
но тут он прав
числа ты фиг покажешь, но орать что так делать нельзя будешь, потому что все орут, а не потому что ты понимаешь что так делать нельзя
попросту петушиться

procenkotanya

qsort понятно что тормозит, про это ещё выше писал, но вот malloc-то каким боком?
и как ты предлагаешь массив переменной длины размещать на стеке?

kokoc88

числа ты фиг покажешь, но орать что так делать нельзя будешь, потому что все орут, а не потому что ты понимаешь что так делать нельзя
Какие числа? Давай подождём пока напишет либо краткий Си код, который он не может производительно перевести с double* на vector либо код, где у него получается, что vector медленнее. Затем, если я откажусь или не смогу переписать этот код, то буду не прав. А пока что мы ждём ответа от Си-шника.
В имеющемся примере с матрицами делать вообще нечего, я могу просто заменить double* на vector, malloc на ::resize, обход на итератор или double*. И код будет абсолютно эквивалентен, даже 5% производительности не убавится. Это ничего не покажет, потому что никто не будет копать такой огромный кусок кода.

slonishka

сорри, я не заметил сходу, что он у тебя умеет расти.

trobak

вставлю и свои пять копеек
на тему эффективных программ на С++ (в частности, и для математических вычислений) может кому-нибудь будет интересна/полезна книга "Efficient C++ Performance Programming Techniques" товарищей Dov Bulka и David Mayhew (например, тут http://lib.mexmat.ru/books/3918, ну и в инете много где лежит)
Там про то, что на C++ вполне можно писать эффективные (по быстродействию) программы.
Ну и обоих Мейерсов (Effective... и More Effeсtive...) тоже можно посоветовать; там кое что на тему эффективности есть.

kruzer25

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

karkar

> Это препроцессором делается.
Подскажи, пожалуйста, как препроцессором сделать так, чтобы код
A = B*k + (C-D)*(1-k);
будучи написан единожды, работал бы с байтами, даблами и тройками байтов и даблов.

Marinavo_0507

Подскажи, пожалуйста, как препроцессором сделать так, чтобы код
A = B*k + (C-D)*(1-k);
будучи написан единожды, работал бы с байтами, даблами и тройками байтов и даблов.

Это ты уже о перегрузке операций говоришь, а не о шаблонах. На C придётся, видимо, использовать бинарные операции в префиксной записи.

karkar

Да, перегрузка используется, но именно благодаря шаблонам достаточно описать это выражение единожды.
Реально код содержал выражения типа
GT t = (pData[si]+pData[si+1])*9 - pData[si-1] - pData[si+2] +8)>>4;
(полупиксельный сдвиг бикубиком где GT - параметр шаблона.
Если это int, то получается обычная операция с целыми числами. А когда в качестве GT подставлялся мой класс для работы с RGB с определенными в нем нужными операциями (тоже шаблонный - для разных типов компонентов то получалось уже нечто посложнее.
На макросах это было бы не слишком удобно.

Marinavo_0507

> На макросах это было бы не слишком удобно.
Слишком удобно не бывает, но писать всё по 4 раза всё-таки незачем.

tamusyav

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

Marinavo_0507

> Но сопровождать макрос в сотню-другую строк все-таки напряжнее,
А чем он отличается от шаблона функции с таким же количеством строк?

tamusyav

Ну, например, тем, что ни компилятор, ни отладчик не скажут тебе конкретно, в какой из этой сотни строк макроса ошибка.
Оставить комментарий
Имя или ник:
Комментарий: