среда, апреля 25, 2007

Ответ настоящего джедая...

Диалог на форуме RSDN:
N>>>Как лучше передавать значения (и хранить их) в классе коллекции — по ссылке или по значению. По-моему — это палка о 2-х концах — если хранить и возвращать по указателю (или ссылке) теряется контроль, ведь значние могут и удалить (delete) без ведома класса-коллекции. А если по значению — то если значение — это большая структура или класс — то это большие расходы времени на засылку в стек и извлечение и памяти в стеке. Так кто что посоветует?

L>> C# :)

N> Смешно. Да и идея в принципе неплохая. Один недостаток — не нравится мне очередная поделка мелкомягких. Все слишком просто — расслабляет.


P.S. Курсив мой :)

6 комментариев:

Alena комментирует...

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

Sergey Rozovik комментирует...

Человек, который разбирается в тонкостях предмета называется профессионалом. Код написанный профессионалом будет почти наверняка более эффективен, чем код новичка. Это не является особенностью C#, Алена, это общее правило.
Да, действительно на C# проще писать чем многих unmanaged языках. Он прощает большое количество огрехов и дурно пахнущего кода (smell code). Там где программа на плюсах свалится, .net будет продолжать кое как работать. Взять, к примеру утечки памяти. Многие думают что в C# утечки памяти невозможны. Как бы не так! Еще как возможны, только проявляют они себя не сразу и в коде их обнаружить гораздо труднее, чем в языках с явным выделением памяти.
Но, как говорится, каждому фрукту -свой сезон. Важно понимать, для чего предназначен этот язык. C# язык для массового применения в прикладных областях. Именно здесь он намного эффективнее чем, например С++. За счет чего? За счет того, что элементарно меньше кода надо писать, и более протого. Соответстенно и квалификация программистов нужна не слишком высокая, а это тоже эффективность для того, кто платит им зарплату :). Это, вобщем то не только C# касается. С PHP - та же история, просто область применения несколько уже.
Так что правильно джедай говорит – «все слишком просто…» :)

Анонимный комментирует...

Ответ настоящего джедая несколько удивил. Вместо того, чтобы сосредоточится на решении задачи с помощью языков высокого уровня, давайте будем придумывать жвачки для мозгов, совершенно отметая накопленный опыт миллионов программистов и человечества, потому что это "расслабляет". И еще не согласен с вердиктом, что C# язык для массового применения в прикладных областях , тоже самое можно сказать и про С++(взглянув на объем написанного кода и программ). Только в то время , пока многие программисты "простреливали себе ногу веревкой", другие пытались облегчить работу новым, во избежание "несчастных случаев" :), и работали над языками высокого уровня, будь то C# или Java, Perl и т.д. Эти языки позволяют экономить время людей, оно очень дорого стоит, по сравнению с машинным временем(мысль из книги "Искусcтво программирования для Unix")

Sergey Rozovik комментирует...

> Ответ настоящего джедая несколько удивил.
А меня, нет. Многие считают, что знание какого нибудь сложного языка или Framework-а поднимает их социальный статус. (У кого-то я читал, что в советские времена переводчики с восточных языков в МИД-е были самыми несносными снобами :). У некоторых это проходит с возрастом. у других - нет. .Net приобрел в глазах сообщества статус "попсовой" технологии, потеснив с этого почетного места Delphi. Все это имеет мало общего с реальностью, но зато создает прекрасный повод для различных холиваров :)

Fahrain комментирует...

На самом деле, в большинстве случаев код на C# - и так быстрый, стандартный компилятор успешно справляется со многиим распространенными ошибками. С другой стороны - есть вещи который должен знать каждый программирующий на С#. Советую почитать книжку "Maximizing .NET Performance", Nick Wienholt, ISBN:1590591410, Apress © 2004 (304 pages)

Что могу посоветовать знающим С++:
1. забыть про struct. Как правило структуры всегда применяют неправильно
2. _всегда_ помнить про то, что содержимое переданной в функцию переменной пользовательского класса может быть изменено в этой функции, причем оградить ее от этого обычными средствами нельзя.
3. Помнить/знать про боксинг!

Ну и напоследок:
код вида
int[] massiv=new int[15];
for(int i=0;i < massiv.Length;i++)
... //do some work

будет работать _быстрее_, чем если по С++ной привычке massiv.Length вынести в другую переменную:
int[] massiv=new int[15];
int len=massiv.Length;
for(int i=0;i < len;i++)
... //do some work

Причина - проверки безопасности.

P.S.: но по сравнению с "хитростями" С++ - это такие мелочи!

ivaliy комментирует...

[q]Ответ настоящего джедая несколько удивил. Вместо того, чтобы сосредоточится на решении задачи с помощью языков высокого уровня, давайте будем придумывать жвачки для мозгов, совершенно отметая накопленный опыт миллионов программистов и человечества, потому что это "расслабляет".[/q]
как говорится +1, действительно, неужели не надоело пережевывать одно и тоже, велосипедостроение- это "болезнь" которую надо лечить.