Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.12.09;
Скачать: CL | DM;

Вниз

Объясните пожалуйста дельфисту, что такое шаблоны в Си?   Найти похожие ветки 

 
Alkid ©   (2007-11-07 10:23) [160]


> Код, приведенный в ссылке [130] ужасен. Причем как С#, так
> и C++. Я уж не говорю, что на моем ноуте в release версии
> C# обставил C++. Даже, пардон, не в 10 раз.

Что конкретно там тестировалось? Код из [130]?
А методику можешь рассказать?
Просто разные исследования авторитетно заявляют разные вещи, от превосходства кода С# над С++ на порядок по скорости выполнения до наоборот.


 
Юрий Зотов ©   (2007-11-07 10:37) [161]

> Alkid ©   (07.11.07 10:20) [159]

Ошибся человек. Посчитал, что речь идет о визуальных контейнерах.
:о)


 
Alkid ©   (2007-11-07 10:43) [162]


> Ошибся человек. Посчитал, что речь идет о визуальных контейнерах.

А может не ошибся. Может он стандартно для хранения списка строк в своём проекте использует TListView или TMemo :)


 
Юрий Зотов ©   (2007-11-07 10:57) [163]

> Alkid ©   (07.11.07 10:43) [162]

А че? Отличные контейнеры.
:о)

============

И кто скажет, что это девочка, пусть первым бросит в меня камень.
(с) Ося Б.


 
boa_kaa ©   (2007-11-07 12:03) [164]


> homm ©   (07.11.07 09:55) [158]

Я сказал релиз - значит релиз.

> Alkid ©   (07.11.07 10:23) [160]

Просто откомпилировал и запустил то, что дано по ссылке. Кстати, сейчас проверил на работе. То же самое:
Результаты:
C++: 2046 ms
C#: 0,002sec. = 2 ms
Могу скриншоты показать.

Я ни на грош не верю полученным результатам. Ибо там сравниваются не языки, а реализации контейнеров. Сравниваются криво. Код адиетский. Нет, чтобы просто создать 2 двумерных массива и перемножить...

Если будет сегодня время, тоже померяю их этими... ;)


 
Ega23 ©   (2007-11-07 12:10) [165]


> Юрий Зотов ©   (07.11.07 10:57) [163]
>
> > Alkid ©   (07.11.07 10:43) [162]
>
> А че? Отличные контейнеры.
> :о)


Шутки-шутками, но
http://delphimaster.net/view/2-1193740709/


 
homm ©   (2007-11-07 12:20) [166]

> [164] boa_kaa ©   (07.11.07 12:03)
> Просто откомпилировал и запустил то, что дано по ссылке.

Начнем с того, что в [130] нет ссылок ;) Если ты имел ввимду ссылку из [131], то я ее тоже тестировал, у меня получилась разница в 8 раз не в пользу СиДиез в релизе, и раз в 10 медленее в дебаге.


 
boa_kaa ©   (2007-11-07 12:50) [167]


> homm ©   (07.11.07 12:20) [166]
> Начнем с того, что в [130] нет ссылок ;)

Промахнулся :)

> у меня получилась разница в 8 раз не в пользу СиДиез в релизе,
>  и раз в 10 медленее в дебаге

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

Я реализовывал один и тот же алгоритм триангуляции Делоне на Delphi, C# и C++. Разница была, но незначительная (примерно 20% отклонения, C++ впереди). Я отношу ее на тот факт, что добиться полного соответствия в коде невозможно. К примеру, на C++ можно создать класс без new, а в C# и Delphi приходится использовать для этого структуры, что часто просто неудобно. Зато процесс разработки на C# несравнимо легче, чем даже в Delphi.


 
homm ©   (2007-11-07 12:53) [168]

> [167] boa_kaa ©   (07.11.07 12:50)
> Я реализовывал один и тот же алгоритм триангуляции Делоне
> на Delphi, C# и C++.

А можно выложить куданить? Мне бы дома было бы интересно помотреть. Или на мыло в анкете.


 
Alkid ©   (2007-11-07 13:02) [169]


> Шутки-шутками, но
> http://delphimaster.net/view/2-1193740709/

Да я это внутренне и поминал, когда писал :)
А для студенческих поделок это вообще - классика.


 
boa_kaa ©   (2007-11-07 13:37) [170]


> А можно выложить куданить? Мне бы дома было бы интересно
> помотреть. Или на мыло в анкете.

Можно. Но уже не сегодня. 2 кода нашел (Delphi и C#). Не могу найти от C++ (все в старых архивах).
Протестровал еще раз:
C#: 0.7 сек. для 1000 точек.
Delphi: 0.5 сек. для тех же 1000 точек.

Алгоритм там тоже старый, инкрементный сложности O(n2).
Как найду остальное - вышлю


 
Lamer@fools.ua ©   (2007-11-07 13:42) [171]

>>Mystic ©   (01.11.07 16:37) [80]

>Это мне показал cordbg.exe. Скомпилировано в релизе.

1.
Если не студией, а "csc.exe", то главное "/optimize+".

2.
(cordbg) m JitOptimizations 1
?

3.
FYI,
System.Runtime.InteropServices.Marshal.SizeOf(typeof(System.Drawing.Color)) = 24


 
Lamer@fools.ua ©   (2007-11-07 13:50) [172]

>>Lamer@fools.ua ©   (07.11.07 13:42) [171]

P.S.
Если же смотреть дизассемблер в VS, то стОит иметь в виду опции:
* Debugging | Suppress JIT optimization on module load (Managed Only)
* Debugging | Enable Just My Code


 
Lamer@fools.ua ©   (2007-11-07 13:53) [173]

Прочитал http://rsdn.ru/forum/Message.aspx?mid=2544936
Похоже, всё сложнее :-)


 
pasha_golub ©   (2007-11-07 14:15) [174]


> vpbar ©   (01.11.07 14:05) [29]
>
> Alkid ©   (01.11.07 13:58) [27]
> Для таких случаев можно симулировать :)
> http://www.delphikingdom.com/asp/viewitem.asp?catalogid=744
> и ww.delphikingdom.com/asp/viewitem.asp?catalogid=453 есть
> статья получше. Но ссылку не помню.
>

Ребяты. А там пусто. Не могу я скачать Tems_Pub.zip

Други, киньте мне на мыло шоли pasha_golub (at) yahoo.com  - попробовать хоцца. А то действительно запаривает контейнеры рисовать :)


 
Фрейм   (2007-11-08 02:33) [175]


> Alkid ©   (07.11.07 10:20) [159]
> Не, ну я конечно каких-то тонкостей Дельфи и VCL не знаю,
>  но не надо меня полным ослом считать :) Фреймы я знаю и
> активно их использовал.
> Вот только не прикину, как фреймы относятся к теме данного
> топика.
> Можешь поясните?


Я хочу просто понять в чём проблема с написанием этих контейнеров, и поискать её решение без использования шаблонов.

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


 
Джо ©   (2007-11-08 04:41) [176]

> [175] Фрейм   (08.11.07 02:33)
>
> > Alkid ©   (07.11.07 10:20) [159]
> > Не, ну я конечно каких-то тонкостей Дельфи и VCL не знаю,
>
> >  но не надо меня полным ослом считать :) Фреймы я знаю
> и
> > активно их использовал.
> > Вот только не прикину, как фреймы относятся к теме данного
>
> > топика.
> > Можешь поясните?
>
>
> Я хочу просто понять в чём проблема с написанием этих контейнеров,
> и поискать её решение без использования шаблонов.
>
> Можно хотя бы пример того кода который вы по многу раз писали?

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


 
Alkid ©   (2007-11-08 12:26) [177]


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

Очень просто : есть свои классы, надо под них забацать контейнеры.
Например, есть некий TMyClass. Можно его коллекции хранить тремя способами:
1. Использовать TObjectList. Проблема в том, что этот подход не типобезопасен, т.е. в контейнер по ошибке может быть положено нечто левое. Да и при взятии элемента приходится каждый раз писать:
myClassRef := TMyClass(Container[index]);
либо:
myClassRef := Container[index] as TMyClass;

При том, что и так жить можно, меня это в целом не устраивает.

2. Содзать один универсальный контейнер (TSafeTypedObjectList), в котором проверка типов производится в Run-Time с использованием RTTI.
Уже лучше, чем первый вариант, но:
 1. Низкая производительность операции добавления эелмента.
 2. Обшибуки ловятся в Run-Time.
 3. Явное приведение типов при взятии элемента остаётся

3. Создавать специализированные контейнеры (TMyClassList), в которых самому определять все методы (Add, Remove, Get, и проч.) с использованием своего типа. Тут всё замечательно: статическая проверка типов на этапе компиляции, нет ненужных накладных расходов и нет приведений типов. Но приходится писать однобразный и на 90% повторяющийся код, различающийся только именами типов. Вот тут шаблоны и нужны - они позволяют делать статически типизированные контейнеры для заданных классов (т.е. получить все их преимущества) без необходимости прерписывать кучу почти одинакового кода вручную (т.е. устраняя главный их недостаток).

И при чём тут фреймы?


 
Фрейм   (2007-11-09 02:06) [178]


> Alkid ©   (08.11.07 12:26) [177]
> Но приходится писать однобразный и на 90% повторяющийся
> код, различающийся только именами типов.


А просто скопировать код и автозамену сделать нельзя? И если можно, то разве это долго?


 
celades ©   (2007-11-09 09:25) [179]


> А просто скопировать код и автозамену сделать нельзя? И
> если можно, то разве это долго?
>

это не долго, это глупо.


 
Alkid ©   (2007-11-09 10:26) [180]


> А просто скопировать код и автозамену сделать нельзя? И
> если можно, то разве это долго?

Можно но если всякое дублирование кода есть зло, то дублирование кода путём Copy/Paste есть зло в квадрате. Вообще-то, это азы правильного проектирования программ.


 
Mystic ©   (2007-11-09 12:44) [181]

> Alkid ©   (09.11.07 10:26) [180]

Слишком категорично. Какие проблемы возникают при Copy/Paste? (a) копирование ошибок (b) сложности с последующим внесением изменений. Соответственно, когда код отлажен или тривиален, а также самодостаточен (изменения в него не планируются), то Copy/Paste вполне допустимое решение. Например,


function Iif(Condition: boolean; TrueValue, FalseValue: Integer): Integer;
begin
 if Condition then Result := TrueValue else Result := FalseValue
end;


Ну и далее по мере необходимости

function Iif(Condition: boolean; TrueValue, FalseValue: string): string;
function Iif(Condition: boolean; TrueValue, FalseValue: TMyObject): TMyObject;
function Iif(Condition: boolean; TrueValue, FalseValue: WideString): WideString;

В данном случае от Copy/Paste опасности нет, разве только некоторым педантам будет действовать на нервы.

С другой стороны, человек, твердо уверовавший в то, что Copy/Paste зло, и пытающийся всеми силами от него избавится, имхо, иногда приносит даже больший вред, чем человек, делающий Copy/Paste. Иногда код только выглядит похожим образом, хотя алгоритмы разные. И когда человек пытается их объединить, то... потом в этом коде сам черт ногу сломит: метод обрастает флагами, в особо тяжких случаях используется полиморфизм, внесение изменений (которое обычно вносится только в один вариант) приводит к еще большему разбуханию кода, ...

Например, если если библиотека для игр, я все-таки предпочту, чтобы для каждой фигуры был отдельный не связанный с другими фигурами класс. Когда конь я китайских шахматах будет наследоваться от коня в обычных шахматах, пушка будет наследоваться от ладьи, лалья от пики в сеги... Один класс для короля, золотого и серебрянного генералов... Это надо пресекать на корню!


 
_Слоник   (2007-11-09 13:00) [182]

про производительность шарпа и оптимизацию (ссылка на исходную статью + обсуждение (особенно интересны последние комменты))
http://forum.vingrad.ru/forum/topic-180722/view-all.html


 
Alkid ©   (2007-11-09 14:28) [183]


> Mystic ©   (09.11.07 12:44) [181]

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

Конечно, если код тривиален, отлажен и не будет меняться, то его можно и тиражировать. Вот только 100% уверенности в этом быть не может. Мы не знаем будущего. А занимаясь копипастом мы на будущее себе подкладываем мину, если всё-таки окажется, что в коде есть ошибка или возникнет необходимость его модифицировать. Т.е. сужаем возможную свободу действий.

Касаемо вреда от особых умников, пытающихся избавиться от дублирующего кода флагами и полиморфизмом: конечно всё можно сделать через задницу. А можно и по-нормальному.

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


 
Джо ©   (2007-11-09 14:30) [184]

Вот как-раз на днях избавился от кучи «лишнего» кода (на 70% дублирующегося по разным юнитам) с помощью полиморфизма.
Теперь вот сижу и гадаю — через Ж это было или не через Ж.
:)


 
Alkid ©   (2007-11-09 14:33) [185]


> Вот как-раз на днях избавился от кучи «лишнего» кода (на
> 70% дублирующегося по разным юнитам) с помощью полиморфизма.
>
> Теперь вот сижу и гадаю — через Ж это было или не через
> Ж.
> :)

:), ну, если у тебя остался "code smell" значит через Ж.  :)


 
Джо ©   (2007-11-09 14:48) [186]

> [185] Alkid ©   (09.11.07 14:33)
>
> > Вот как-раз на днях избавился от кучи «лишнего» кода (на
>
> > 70% дублирующегося по разным юнитам) с помощью полиморфизма.
> >
> > Теперь вот сижу и гадаю — через Ж это было или не через
>
> > Ж.
> > :)
>
> :), ну, если у тебя остался "code smell" значит через Ж.
> :)

Вроде уже два дня как не пахнет. :) Сегодня уже даже на дальнейшую работу пошло, до рефакторинга это было немыслимо.


 
Alkid ©   (2007-11-09 16:00) [187]


> Вроде уже два дня как не пахнет. :) Сегодня уже даже на
> дальнейшую работу пошло, до рефакторинга это было немыслимо.

Мда, а мне щас приходится с таким кодом, что от его "code smell" надо зажимать нос, рот, глаза и уши. Собственно по-этому я сейчас готов пришибить чем-нибудь тяжёлым любого, кто будет меня убеждать, что "дублирование кода, это вообщем-то и неплохо" :)


 
umbra ©   (2007-11-10 02:16) [188]

копипаст по ученому называется "editor inheritance" :)


 
Джо ©   (2007-11-10 02:28) [189]

> [188] umbra ©   (10.11.07 02:16)
> копипаст по ученому называется "editor inheritance" :)

Вот буржуи! До чего додумались :-D



Страницы: 1 2 3 4 5 вся ветка

Текущий архив: 2007.12.09;
Скачать: CL | DM;

Наверх




Память: 0.81 MB
Время: 0.043 c
15-1194550591
С№
2007-11-08 22:36
2007.12.09
Такое и на С#


2-1195214548
no3ep
2007-11-16 15:02
2007.12.09
printers


15-1194939406
TYuD
2007-11-13 10:36
2007.12.09
Не всегда получается отладка dll.


2-1194785097
петрович07
2007-11-11 15:44
2007.12.09
отрисовка на канве грида


15-1194608090
Piter
2007-11-09 14:34
2007.12.09
Пятница? Вася Пупкин?