Модераторы: LSD

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Нужен ли С++ 
:(
    Опции темы
Фантом
Дата 20.9.2009, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вы это прекратите!
***


Профиль
Группа: Участник Клуба
Сообщений: 1516
Регистрация: 23.3.2008

Репутация: нет
Всего: 49



Цитата(W4FhLF @  20.9.2009,  09:20 Найти цитируемый пост)

На С++ у меня реализован класс Matrix<T>, где оптимизировано хранение больших матриц в памяти, операции над ними. 

Что ты мне предложишь на С? Как бы оно выглядело? А если захочу поменять тип данных в матрице? Или добавить ещё 3-4 операции в формулу с разными типами?

Если же говорить про C#/Java/Lisp, то я уверен, что реализация такого класса и интерфейса с классической нотацией проиграет в скорости моей на порядок на больших матрицах (от 512х512). 


Выскажусь не совсем по теме, но пример очень неудачен. 

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

Во-вторых, это как раз тот случай, когда с помощью предлагаемого инструмента можно успешно решать проблемы, которые при использовании других инструментов просто не возникают.  smile В нормальных условиях такие вещи пишутся на Фортране - он для них специально предназначен, поэтому все необходимое уже встроено в язык, а конечный результат будет работать заметно быстрее, чем код на C (о C++, C#, Java и т.д. можно и не вспоминать).
PM   Вверх
W4FhLF
Дата 20.9.2009, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 2
Всего: 121



Цитата(Fatkh @  20.9.2009,  12:38 Найти цитируемый пост)
Перечитай предыдущие посты. Началось с определения ниши для плюсов. И этим я хотел сказать, что в таких случаях лучше применить что-то более высокоуровневое, (Питон?).


Для кого лучше? Давай больше конкретики. Для приведённого случая я не понимаю чем "лучше".

Цитата(Фантом @  20.9.2009,  12:47 Найти цитируемый пост)
А вот производительность полученного кода (которая в задачах такого рода обычно является наиболее критичной) будет, мягко говоря, невысокой. 


Производительность будет не НИЖЕ, чем при реализации на С. С чего ей быть невысокой? 

Цитата(Фантом @  20.9.2009,  12:47 Найти цитируемый пост)
Во-вторых, это как раз тот случай, когда с помощью предлагаемого инструмента можно успешно решать проблемы, которые при использовании других инструментов просто не возникают.   В нормальных условиях такие вещи пишутся на Фортране - он для них специально предназначен, поэтому все необходимое уже встроено в язык, а конечный результат будет работать заметно быстрее, чем код на C (о C++, C#, Java и т.д. можно и не вспоминать).


Не попал. На фортране это будет выглядеть также громоздко как и на С. И насчёт производительности опять мимо. Давай код на фортране, сравним. 



--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
Фантом
Дата 20.9.2009, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вы это прекратите!
***


Профиль
Группа: Участник Клуба
Сообщений: 1516
Регистрация: 23.3.2008

Репутация: нет
Всего: 49



Цитата(W4FhLF @  20.9.2009,  13:01 Найти цитируемый пост)

Производительность будет не НИЖЕ, чем при реализации на С. С чего ей быть невысокой? 


Пробовал?  smile 

Проблема в "накладных расходах" на создание и уничтожение промежуточных экземпляторов матриц. Вот в этой твоей строчке:
Код

Matrix C = A * B / tr(D) + v; // tr() - транспонирование матрицы, v -- вектор

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

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

Цитата(W4FhLF @  20.9.2009,  13:01 Найти цитируемый пост)
Не попал. На фортране это будет выглядеть также громоздко как и на С. И насчёт производительности опять мимо. Давай код на фортране, сравним. 


Опять тот же вопрос - пробовал?  smile 

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

PM   Вверх
Anikmar
Дата 20.9.2009, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 1
Всего: 59



Цитата(Fatkh @  20.9.2009,  12:44 Найти цитируемый пост)
1. Я нигде не говорил про плюс-минус пару сотен функций. Если у вас так - вы не умеете проектировать.

Вы говорили про пару (на конкретный класс). Если брать крупный проект, в нем пара сотен классов будет. По паре на класс - и вперед.

Цитата(Fatkh @  20.9.2009,  12:44 Найти цитируемый пост)
2. Чем не нравится double? (для бызовых типов, как я и писал) 

Вы прекрасно знаете о чем речь. Применяя возможности языка можно не заботится и перемене типов. Написание собственных типов - это основное преимущество С++ перд Си. Если понадобится матрица объектов, то на Си (как вы суже сказали) это делается при помощи указателя на void. Естественно это самый надежный и защищенный механизм  smile  Речь шла не о конкретной матрице, а о возможности языка.
Цитата(Fatkh @  20.9.2009,  12:44 Найти цитируемый пост)
3. Где??? Где пару гигов? Где вы такое видели? За всю жизнь видел только одного такого монстра, и написанного как раз на плюсах.

Я говорил про работспособность "супер языков высокого уровня". Для того, чтобы заработал шарп сколько дополнительного надо поставить? Сколько это весит?

Добавлено через 5 минут и 54 секунды
Цитата(Фантом @  20.9.2009,  13:41 Найти цитируемый пост)
каждый перегруженный оператор и функция tr() (кстати, что понимается под "делением"?) создают экземляр результата, который после использования, кстати, еще и уничтожить нужно. В одной этой строке это произойдет как минимум три раза, и при больших размерах матриц это весьма накладно.

Почему вы уверены, что там не ссылки?
Цитата(Фантом @  20.9.2009,  13:41 Найти цитируемый пост)
Опять тот же вопрос - пробовал?

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

PM MAIL ICQ   Вверх
W4FhLF
Дата 20.9.2009, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 2
Всего: 121



Цитата(Фантом @  20.9.2009,  13:41 Найти цитируемый пост)
Проблема в "накладных расходах" на создание и уничтожение промежуточных экземпляторов матриц.


Нет тут никаких накладных расходов.

Цитата(Фантом @  20.9.2009,  13:41 Найти цитируемый пост)
каждый перегруженный оператор и функция tr() (кстати, что понимается под "делением"?) создают экземляр результата, который после использования, кстати, еще и уничтожить нужно. В одной этой строке это произойдет как минимум три раза, и при больших размерах матриц это весьма накладно.


Ты знаешь, что такое передача по ссылке, inline и NRVO? В этой строчке не произойдёт ниодного копирования.

Цитата(Фантом @  20.9.2009,  13:41 Найти цитируемый пост)
Опять тот же вопрос - пробовал?


Ты ведь изначально утверждаешь, что код на фортране будет работать намного быстрее, чем код на С++. Вот и докажи. Я не вижу никаких предпосылок в пользу этого утверждения. 

Цитата(Фантом @  20.9.2009,  13:41 Найти цитируемый пост)
Код на Фортране дать не проблема, но мне нужно иметь образец, который требуется переписать.


Т.е. ты даже никогда не писал подобного кода на фортране? smile Я думал твои заявления подкреплены хоть каким-то опытом (пускай односторонним и ошибочным).





--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
Фантом
Дата 20.9.2009, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вы это прекратите!
***


Профиль
Группа: Участник Клуба
Сообщений: 1516
Регистрация: 23.3.2008

Репутация: нет
Всего: 49



Цитата(Anikmar @  20.9.2009,  13:51 Найти цитируемый пост)

Почему вы уверены, что там не ссылки?


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

Вот совсем простой пример. Пусть у нас есть такая строка:
Код

D= A+B+C;

где A,B,C,D - матрицы, оператор "+" соответствующим образом перегружен. Что произойдет? Будет вызван первый "+", соответствующий метод сложит A и B, и ему надо куда-то деть результат. Соответственно, будет вызван конструктор Matrix и в итоге появится еще один экземпляр, в который будет записан результат. Потом будет вызван второй "+", которому будет скормлен этот новый экземпляр и C, результат попадет в D. Итого по дороге был создан (и спасибо, если не забыт в памяти) лишний экземпляр.

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

Цитата(Anikmar @  20.9.2009,  13:51 Найти цитируемый пост)
Я пробовал. Но не спора ради, а помогал человеку - заядлому фортранисту. Он академик по статистике, у него там матрицы были порядка 5000х5000. Мне было лень разбираться с фортраном и я помог ему на С++.
В общем может быть он слабый программист, может фортран у него был какой-то медленный не знаю. В общем на С++ пошустрее получилось.


Скорее всего, и то, и другое. Фортран достаточно сильно эволюционировал за время своего существования, и, к сожалению, добрых 90% людей, "знающих Фортран", пишет не на современном языке, а на том, который был современным в пору их молодости. Ну и естественно, что результаты получаются так себе - во-первых, подавляющее большинство преимуществ появляется при использовании двух-трех последних по времени вариантов, во-вторых, на оптимизациею конструкций, актуальных, например, для Fortran 77, разработчики современных компиляторовЮ по понятным причинам, тратят весьма немного времени и сил.
PM   Вверх
GoldFinch
Дата 20.9.2009, 14:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: нет
Всего: 26



Фантом, ты про шаблоны чтонить слышал? 
PM MAIL ICQ   Вверх
zim22
Дата 20.9.2009, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: -1
Всего: 69



Цитата(Фантом @  20.9.2009,  14:22 Найти цитируемый пост)
Ссылки на что? Если обсуждаемый класс хоть сколько-нибудь функционален, то при каждой бинарной операции результат должен куда-то записываться, причем это "куда-то" не может совпадать ни с одним из операндов. 

на лицо плохое знание С++ smile
***
из книги "Язык программирования С++. Специальное издание" Страуструп. 11.6. Большие объекты. стр. 331.
Цитата

Существуют методы, позволяющие избежать копирования результата. Простейшим из них является использование буфера статических объектов. Например:

Код

class Matrix {
  double m[4][4];
};

const int max_matrix_temp = 7;
Matrix &get_matrix_temp() {
  static int nbuf = 0;
  static Matrix buf[max_matrix_temp];
  
  if (nbuf == max_matrix_temp) nbuf = 0;
  return buf[nbuf++];
}
Matrix &operator+(const Matrix &lhs, const Matrix &rhs) {
  Matrix &res = get_matrix_temp();
  // ... bla-bla-bla
  return res;
}

Цитата

Теперь Matrix копируется только при присванивании результата выражения. Да помогут вам небеса, если вы напишете выражение, в котором потребуется более, чем max_matrix_temp временных переменных!

smile

Это сообщение отредактировал(а) zim22 - 20.9.2009, 14:35


--------------------
PM MAIL   Вверх
Фантом
Дата 20.9.2009, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вы это прекратите!
***


Профиль
Группа: Участник Клуба
Сообщений: 1516
Регистрация: 23.3.2008

Репутация: нет
Всего: 49



Цитата(W4FhLF @  20.9.2009,  14:01 Найти цитируемый пост)

Нет тут никаких накладных расходов.


См. чуть выше.

Цитата(W4FhLF @  20.9.2009,  14:01 Найти цитируемый пост)
Ты знаешь, что такое передача по ссылке, inline и NRVO? В этой строчке не произойдёт ниодного копирования.


Знаю. Только ты объясни внятно, куда денется, например, результат умножения матриц A и B при прогонке твоего кода, и как этому помогут передача по ссылке, inline и NRVO? Или у тебя все расчеты делаются не программой, а сразу компилятором?  smile 

Цитата(W4FhLF @  20.9.2009,  14:01 Найти цитируемый пост)
Ты ведь изначально утверждаешь, что код на фортране будет работать намного быстрее, чем код на С++. Вот и докажи. Я не вижу никаких предпосылок в пользу этого утверждения. 

Т.е. ты даже никогда не писал подобного кода на фортране? smile Я думал твои заявления подкреплены хоть каким-то опытом (пускай односторонним и ошибочным).


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

Что тебе сейчас можно написать? Ты даже не сподобился объяснить, во что перегрузил деление. Если его убрать, то близкий аналог твоего 
Код

Matrix C = A * tr(D) + v;

 на Фортране перепишется так:
Код

С=matmul(A,transpose(D))+v


Очень громоздко, правда?  smile 

PM   Вверх
GoldFinch
Дата 20.9.2009, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: нет
Всего: 26



Фантом, 
если A, B, C, D -  матрицы,
то в С++ код
A = B + C + D;

преобразуется к виду

цикл( i,j )
  A[i,j] = B[i,j] + С[i,j] + D[i,j];


потому что перегруженные операторы сложения построят AST, а перегруженный оператор присваивания это дерево преобразует в оптимальный вид, и сгенерирует при компиляции оптимальный код

Это сообщение отредактировал(а) GoldFinch - 20.9.2009, 14:43
PM MAIL ICQ   Вверх
Фантом
Дата 20.9.2009, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вы это прекратите!
***


Профиль
Группа: Участник Клуба
Сообщений: 1516
Регистрация: 23.3.2008

Репутация: нет
Всего: 49



Цитата(GoldFinch @  20.9.2009,  14:32 Найти цитируемый пост)
Фантом, ты про шаблоны чтонить слышал?  


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

PM   Вверх
zim22
Дата 20.9.2009, 14:48 (ссылка)  | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: -1
Всего: 69



Цитата(Фантом @  20.9.2009,  14:37 Найти цитируемый пост)
Или у тебя все расчеты делаются не программой, а сразу компилятором?

кстати вариант. метапрограммирование называется smile
Цитата(Фантом @  20.9.2009,  14:42 Найти цитируемый пост)
Юноша, давай для определенности сразу договоримся о том, что я "чтонить" о "чемнить" слышал еще тогда, когда тебя еще в проекте не было. 

вспомнилась подпись Qraizer: одни с годами умнеют, другие просто становятся старше.

Это сообщение отредактировал(а) zim22 - 20.9.2009, 14:50


--------------------
PM MAIL   Вверх
NightmareZ
Дата 20.9.2009, 14:52 (ссылка)  | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


[хакер]
**


Профиль
Группа: Участник
Сообщений: 699
Регистрация: 10.8.2006

Репутация: -1
Всего: 13



Цитата(Леопольд @  20.9.2009,  09:02 Найти цитируемый пост)
Я спрашиваю с целью выяснить насколько хорошо ты знаешь С++.

На C++ участвовал только в одном коммерческом проекте. Как только предоставилась возможность, перешёл в другой - на C# и чувствую себя в нём гораздо удобнее.

Цитата(Леопольд @  20.9.2009,  09:02 Найти цитируемый пост)
Тогда расскажи, пожалуйста, чем ООП в Лиспе лучше или хуже ООП в С++. Хотелось бы увидеть от тебя хотя бы немного конкретики а не юморески про какашки.

ООП - оно и в африке ООП.
Лисп действительно мультипарадигменный язык, в отличие, от C++. Это раз.
Лисп проще, чем C++, но при этом гибче. Это два.
Пока достаточно.

Цитата(Леопольд @  20.9.2009,  09:02 Найти цитируемый пост)
Для того что-бы писать те же дрова, программисту С++ не надо будет изучать новый язык. В чём его преимущество, он придерживается тех же принципов что и С - делай что хочешь, если знаешь что делаешь.

Человек, способный писать на одном ЯП - быдлокодер.

Цитата(Леопольд @  20.9.2009,  09:02 Найти цитируемый пост)
Я конечно не могу знать, не интересовался, но почему-то почти уверен что С++ на этом уровне на голову выше Лиспа.

Слышал про лисп-машины? Как думаешь, системный язык там какой?

Цитата(Леопольд @  20.9.2009,  09:02 Найти цитируемый пост)
Qt4 хуже по сравнению с тем же Делфи?

Зелёное хуже, чем мокрое?

Цитата(zim22 @  20.9.2009,  09:16 Найти цитируемый пост)
так не спрашивают. нужно попросить решить какую-нибудь простенькую задачку на С++ и уже по уровню кода можно будет сказать насколько человек хорошо/плохо знает С++.это как игра в шахматы: более опытный игрок может определить уровень своего оппонента по том, как он ходит(фигурами)

Хорошо, давай я пишу твою задачу на C++, а ты мою на лиспе. Ок?

Добавлено через 53 секунды
Цитата(zim22 @  20.9.2009,  14:48 Найти цитируемый пост)
кстати вариант. метапрограммирование называется

Метапрограммирование в C++ убогое по сравнению с тем же Nemerle.


--------------------
NightmareZ.net - мой блог и сайт, мои проекты и прочий трэш
Ely-Art.ru - наша маленькая домашняя арт-студия
mugcraft.ru - кружки на любой вкус
PM WWW ICQ Skype GTalk AOL YIM   Вверх
Фантом
Дата 20.9.2009, 14:54 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вы это прекратите!
***


Профиль
Группа: Участник Клуба
Сообщений: 1516
Регистрация: 23.3.2008

Репутация: нет
Всего: 49



Цитата(zim22 @  20.9.2009,  14:33 Найти цитируемый пост)

на лицо плохое знание С++


Нет, скорее невнимательное чтение кое-кем предшествующей переписки.  smile 

Эта идея, конечно, частично спасает положение. Правда, ниоткуда не следует, что 
  •  W4FhLF ее реализовал,
  •  W4FhLF реализовал ее более эффективно, чем разработчики какого-нибудь IFC,
  •  получившееся в результате является "удобным и лаконичным".

Однако остаются и проблемы. 

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

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

В-третьих, модификация того же примера для случая матриц произвольного размера (а в реальных задачах редко когда все матрицы сплошь одинаковые) приведет к необходимости написать нечто, весьма сильно напоминающее полноценный менеджер памяти. Человек, конечно, может все, но стоит ли изобретать велосипед самому и собирать его из подручных материалов?
PM   Вверх
zim22
Дата 20.9.2009, 14:56 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: -1
Всего: 69



 smile 
Цитата(NightmareZ @  20.9.2009,  14:52 Найти цитируемый пост)
Хорошо, давай я пишу твою задачу на C++, а ты мою на лиспе. Ок?

а смысл? ну докажу я, что я круче тебя в тысячу раз. тебе же от этого лучше не станет  smile 


--------------------
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила ведения Религиозных войн
Smartov
1. Уважайте собеседника
2. Собеседник != враг
3. Старайтесь воздерживаться от тем вида "Windows Rulez" или "Linux Rulez"

С уважением, Smartov.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Религиозные войны | Следующая тема »


 




[ Время генерации скрипта: 0.0751 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.