Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2007.12.09;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.8 MB
Время: 0.062 c
2-1194855331
art36
2007-11-12 11:15
2007.12.09
Как вырваться из локальной сети, используя indy или Socket?


8-1170734577
avprohorov
2007-02-06 07:02
2007.12.09
как перерисовать только Image


1-1189520493
VovaL
2007-09-11 18:21
2007.12.09
Как расширить компоненту диалога?


3-1185875301
ChaoX
2007-07-31 13:48
2007.12.09
2 связанные таблицы


11-1179405378
danger
2007-05-17 16:36
2007.12.09
Компонент TKOLHTTPDownload





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский