Re[24]: История одной оптимизации
От: Pavel Dvorkin Россия  
Дата: 10.11.05 09:09
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Здравствуйте, Pavel Dvorkin, Вы писали:


PD>> Там то, что называется передачей по ссылке и по значению — в любом случае есть передача ссылки на объект, поскольку к самим объектам доступа нет.

S>Опять двойка. Читать про value-типы.

Ну если мы начнем двойки друг другу ставить — боюсь, давно уже друг друга бы отчислили
По существу — естественоо, я имел в виду классы, а не структуры.
With best regards
Pavel Dvorkin
Re[25]: История одной оптимизации
От: Sinclair Россия https://github.com/evilguest/
Дата: 10.11.05 09:22
Оценка:
Здравствуйте, Lazy Cjow Rhrr, Вы писали:
Как где?
System.Console.Write(10.ToString())


Для примера более интересного поведения, рекомендую ознакомиться со структурой System.DateTime.
1.1.4 stable rev. 510
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[14]: История одной оптимизации
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 10.11.05 09:44
Оценка: :)
Здравствуйте, TK, Вы писали:

TK>Интересно, а какой смысл вести дискуссию цель которой доказать, что твой собеседник чего-то там не знает? Какая в этом польза для сообщества?


Польза очень простая — товарищь агитирует за крайне вредную для новичком идею — что паттерны вредны.
... << RSDN@Home 1.2.0 alpha rev. 617>>
AVK Blog
Re[23]: История одной оптимизации
От: GlebZ Россия  
Дата: 10.11.05 09:56
Оценка: 2 (1) +3
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Вполне возможно. Кстати, студент вовсе не пострадал

PD>Еще раз — не в POINT дело. Его вполне можно и по значению передать. Дело в принципе — незачем большие структуры по значению передавать.
Да нет, проблема в другом. При современном развитии железа и компиляторов, очень трудно прогнозировать как та или иная операция выйдет по производительности. В принципе от алгоритмической сложности отойти невозможно. Но вот сложность того или иного метода дизайна спрогнозировать сложно. Java — пытается запихнуть объекты по возможности в стек. Пытаются выдавить лишние действия из циклов. Пытаются работать через регистровую память. Пытаются уместить данные в кэше процессора. Пытаются ублажить конвейры процессора. И многое многое многое о чем я не знаю. Я только знаю что эта шняга будет работать, но каждый раз лазить в ассемблер и узнавать как оно в реальности работает, и узнавать что куча кода скомпилировалось в одну ассембленую команду(как это часто бывает в STL), я не могу и не буду. Знания конечно сила, я могу примерно прогнозировать во что это выльется для знакомых мне платформ. Но явно этими знаниями я пользуюсь редко и только для наибольшего криминальных команд и подсистем.
Лучше я отдам эти вопросы на откуп умному компилятору и заумному процессору. А сам буду делать логику, которая нужна мне а не им. Они сами справятся.

С уважением, Gleb.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[26]: История одной оптимизации
От: Lazy Cjow Rhrr Россия lj://_lcr_
Дата: 10.11.05 10:12
Оценка: -2
Sinclair,

S>Как где?

S>
S>System.Console.Write(10.ToString())
S>

S>)
S>Для примера более интересного поведения, рекомендую ознакомиться со структурой System.DateTime.

Упс. Да, здесь синтаксически насахарили хорошо. А вот тебе примеры того, что есть кое-что, что применимо к ссылочным объектам, и неприменимо к плоским значениям:
1. Деструкторы.
2. Выделение на куче.
3. Управление временем жизни с помощью ГЦ.
...
n. % уверен ты ещё много чего вспомнишь...

Лично мне это даёт основание не называть value-значения объектами. И фраза П. Дворкина в этом смысле верна. Ты можешь называть всё объектами, но тогда в определённые моменты времени ты вынужден вставляеть оговорки "для ссылочных объектов X, а вот для плоских объектов Y", и вышеуказанная фраза для тебя содержит противоречие.
quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#)
Re[24]: История одной оптимизации
От: Pavel Dvorkin Россия  
Дата: 10.11.05 10:54
Оценка:
Здравствуйте, GlebZ, Вы писали:

GZ>Здравствуйте, Pavel Dvorkin, Вы писали:


PD>>Вполне возможно. Кстати, студент вовсе не пострадал

PD>>Еще раз — не в POINT дело. Его вполне можно и по значению передать. Дело в принципе — незачем большие структуры по значению передавать.
GZ>Да нет, проблема в другом. При современном развитии железа и компиляторов, очень трудно прогнозировать как та или иная операция выйдет по производительности. В принципе от алгоритмической сложности отойти невозможно. Но вот сложность того или иного метода дизайна спрогнозировать сложно. Java — пытается запихнуть объекты по возможности в стек. Пытаются выдавить лишние действия из циклов. Пытаются работать через регистровую память. Пытаются уместить данные в кэше процессора. Пытаются ублажить конвейры процессора. И многое многое многое о чем я не знаю. Я только знаю что эта шняга будет работать, но каждый раз лазить в ассемблер и узнавать как оно в реальности работает, и узнавать что куча кода скомпилировалось в одну ассембленую команду(как это часто бывает в STL), я не могу и не буду. Знания конечно сила, я могу примерно прогнозировать во что это выльется для знакомых мне платформ. Но явно этими знаниями я пользуюсь редко и только для наибольшего криминальных команд и подсистем.
GZ>Лучше я отдам эти вопросы на откуп умному компилятору и заумному процессору. А сам буду делать логику, которая нужна мне а не им. Они сами справятся.

Я готов со всем этим согласиться, но с одним "но". Если речь идет все же о С++, то никакой умный компилятор и заумный процессор тебя не спасет, если ты начнешь развесистое дерево передавать по значению. Там все же конструктор копирования, который в себе такое потянет, что мало не покажется (и по времени, и по памяти). Если же там даже чистая структура С, то при ее размерах порядка десятков байт (а таких структур в том же Win32 много) делать копии — просто время зря расходовать (конечно, если не нужна именно копия). И вот это надо не допускать.
В пограничных случаях — (POINT, double и т.д.) разница может быть несущественной, верно. Но приучать надо все же к грамотному кодированию.

А кстати, как в C# сделать копию объекта, если надо все же ? Как я понимаю, надо реализовать ICloneable в классе ? А что если в классе есть ссылки на другие классы, которые этот интерфейс не реализуют и помечены как sealed ?
With best regards
Pavel Dvorkin
Re[15]: История одной оптимизации
От: TK Лес кывт.рф
Дата: 10.11.05 10:55
Оценка: +1 -2 :))
Здравствуйте, AndrewVK, Вы писали:

AVK>Польза очень простая — товарищь агитирует за крайне вредную для новичком идею — что паттерны вредны.


т.е. корректно вести дискуссии ты не умеешь. Что и требовалось доказать.
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[15]: История одной оптимизации
От: Pavel Dvorkin Россия  
Дата: 10.11.05 11:07
Оценка: :))
Здравствуйте, AndrewVK, Вы писали:


AVK>Польза очень простая — товарищь агитирует за крайне вредную для новичком идею — что паттерны вредны.


Ну-ну, господа....

Я агитирую за крайне вредную вещь — оптимизацию.
Теперь vdimas начал антипаттерновскую агитацию.

Враг не дремлет, и наша задача — дать ему достойный отпор! Мы на страже и боремся со всеми видами недопустимой агитации. Но пасаран!

Успехов вам в борьбе с вредными влияниями!
With best regards
Pavel Dvorkin
Готовность системы к её последующим изменениям
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 10.11.05 11:10
Оценка:
Здравствуйте, IT, Вы писали:

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


а паттерны-шматтерны не способствуют разве большей прозрачности (понятности) реализации? что в конечном итоге и равно готовности к изменениям. Или как ты эту готовность обеспечиваешь?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[16]: История одной оптимизации
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 10.11.05 11:18
Оценка: 8 (1) +1
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Теперь vdimas начал антипаттерновскую агитацию.


Думаю, что Дмитрий (vdimas) совершенно не собирался делать антипаттерновскую агитацию. А хотел сказать, что паттерны -- это всего лишь одна из программиских финтифлюшек (такой же, как и оптимизация, кстати). К которой и относится нужно соответственно, без религиозно-фанатичного обожания.

PD>Но пасаран!

Но пасаран!
... << RSDN@Home 1.1.4 stable rev. 510>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[25]: История одной оптимизации
От: GlebZ Россия  
Дата: 10.11.05 11:21
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Я готов со всем этим согласиться, но с одним "но". Если речь идет все же о С++, то никакой умный компилятор и заумный процессор тебя не спасет, если ты начнешь развесистое дерево передавать по значению. Там все же конструктор копирования, который в себе такое потянет, что мало не покажется (и по времени, и по памяти). Если же там даже чистая структура С, то при ее размерах порядка десятков байт (а таких структур в том же Win32 много) делать копии — просто время зря расходовать (конечно, если не нужна именно копия). И вот это надо не допускать.

И здесь не всегда. Если процедура синлайнется, то вполне возможно что компилятор поймет что копировать не стоит. Вобщем ситуаций может быть много.

PD>В пограничных случаях — (POINT, double и т.д.) разница может быть несущественной, верно. Но приучать надо все же к грамотному кодированию.

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

PD>А кстати, как в C# сделать копию объекта, если надо все же ? Как я понимаю, надо реализовать ICloneable в классе ?

Да.
PD>А что если в классе есть ссылки на другие классы, которые этот интерфейс не реализуют и помечены как sealed ?
Ключевые слова deep copy и shadow copy. Первый копирует все объекты на который ссылаются, второй копирует ссылки. По умолчанию обычно действует shadow copy.

С уважением, Gleb.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[16]: История одной оптимизации
От: vdimas Россия  
Дата: 10.11.05 11:21
Оценка:
Здравствуйте, AndrewVK, Вы писали:

GZ>>А по мне существует только один паттерн который называется Low Coupling/High Cohesion.


AVK>Это не паттерн, это оценочный критерий. Паттерн это конкретное архитектурное решение.


Паттерны так же относятся к набору практик. И упомянутый оценочный критерий тоже скорее из разряда практик. (или ссылку на формальное доказательство, если есть)

А практики — они такие интересные по сути вещи, что их применение может зависеть от внешних условий. Другими словами, даже упомянутый оценочный критерий не всегда требуется для оценки решений. Как пример — разработка практически любой аппаратуры, содержащей выч. компоненты. За требованиями минитюаризации, минимизации ресурсов, или даже исполнения в виде одной гибридной схемы и пр., оценка связанности компонентов просто теряет свою значимость. Связанность заведомо 100%-я.
Re[15]: История одной оптимизации
От: vdimas Россия  
Дата: 10.11.05 11:27
Оценка:
Здравствуйте, IT, Вы писали:


V>>Без достаточной проработки самой модели и всех ее уровней с функциональной т.з. и с т.з. всевозможных ограничений, бросаться в конкретику паттернов, ИМХО, рановато.


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



Счастливый человек. ИМХО, судя по твоим приоритетам, общий дизайн ты уже давно не разрабатываешь, он у тебя "сам собой получается естественным образом". Собственно, так и должно быть при наличии опыта.

А у некоторых пока стоят проблемы, (хе-хе) с путями реализаций требований. Эти пути и обсуждаем.
Re[17]: История одной оптимизации
От: Pavel Dvorkin Россия  
Дата: 10.11.05 11:34
Оценка: :)
Здравствуйте, eao197, Вы писали:

E>Думаю, что Дмитрий (vdimas) совершенно не собирался делать антипаттерновскую агитацию. А хотел сказать, что паттерны -- это всего лишь одна из программиских финтифлюшек (такой же, как и оптимизация, кстати). К которой и относится нужно соответственно, без религиозно-фанатичного обожания.


Я бы это утверждение расширил. Без религиозно-фанатичного обожания надо относиться к оптимизации, паттернам, абстракциям, С++, C#, Java, .Net и т.д. и т.п. И вообще — не сотвори себе кумира

Боюсь только, что объяснять это некоторым — все равно, что агитировать римского папу вступить в общество атеистов
With best regards
Pavel Dvorkin
Re[17]: История одной оптимизации
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 10.11.05 11:42
Оценка: +1 :)
Здравствуйте, vdimas, Вы писали:

V>Паттерны так же относятся к набору практик. И упомянутый оценочный критерий тоже скорее из разряда практик.


Я что то совсем перестал понимать твой русский язык. Как может оценочный критерий быть практикой?

V>А практики — они такие интересные по сути вещи, что их применение может зависеть от внешних условий. Другими словами, даже упомянутый оценочный критерий не всегда требуется для оценки решений. Как пример — разработка практически любой аппаратуры, содержащей выч. компоненты. За требованиями минитюаризации, минимизации ресурсов, или даже исполнения в виде одной гибридной схемы и пр., оценка связанности компонентов просто теряет свою значимость. Связанность заведомо 100%-я.


Ничего не понял.
... << RSDN@Home 1.2.0 alpha rev. 617>>
AVK Blog
Re[26]: История одной оптимизации
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 10.11.05 11:45
Оценка:
Здравствуйте, GlebZ, Вы писали:

PD>>Я готов со всем этим согласиться, но с одним "но". Если речь идет все же о С++, то никакой умный компилятор и заумный процессор тебя не спасет, если ты начнешь развесистое дерево передавать по значению. Там все же конструктор копирования, который в себе такое потянет, что мало не покажется (и по времени, и по памяти). Если же там даже чистая структура С, то при ее размерах порядка десятков байт (а таких структур в том же Win32 много) делать копии — просто время зря расходовать (конечно, если не нужна именно копия). И вот это надо не допускать.

GZ>И здесь не всегда. Если процедура синлайнется, то вполне возможно что компилятор поймет что копировать не стоит. Вобщем ситуаций может быть много.

Тут еще вот в чем дело. Передавая что-то по значению, мы должны знать, что это не приведет к черезмерным накладным расходам. Для POINT и RECT я это знаю, т.к. структуры тривиальные. Для std::vector, std::list или std::string я так же знаю, что, скорее всего, приведет к расходам, т.к. их реализации используют динамическую память. А если мне встречается какой-то не стандартный тип, скажем, auth_info_t или priority_levels_t. Про который я должен знать только его public-интерфейс и не должен знать деталей его реализации. Как мне оценить, что передача priority_levels_t по значению будет эффективной? Заглянув в состав его полей? А если там только одно поле-указатель, то значит ли это что-нибудь? Вдруг priority_levels_t через идиому PImpl реализован. Или, что еще опаснее, в текущей версии priority_levels_t можно эффективно копировать, а в следующей версии его реализацию сменят на более догоростоющую в копировании. Передача же объекта по ссылке гарантированно дает мне низкие накладные расходы и не обязывает меня обращать внимание на детали реализации используемых мной типов.

И еще один момент. В C++ есть понятие копирования объекта. А есть понятие копирования указателя на объект. Если мы передаем объект по значению мы используем именно понятие копирование объекта. И если функция/метод требует в качестве параметра именно значение объекта, то это не спроста. Значит функция внутри себя будет это свою личную копию иметь так, как фантазия позволит. И иметь именно копию, а не исходный объект. В случае же, если функция требует в качестве параметра константный указатель/ссылку на объект, функция декралирует, что исходный объект будет использоваться в операция внутри функции. Не константный указатель/ссылка же явно декларирует, что функция функция будет изменять исходный объект. В любом из случаев намерения функции по отношению к объекту становятся понятными исходя просто из описания функции. Поэтому описание параметра функции как константной ссылки или указателя на объект говорит пользователю: не бойся, не съем я твой объект
... << RSDN@Home 1.1.4 stable rev. 510>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re: История одной оптимизации
От: jhfrek Россия  
Дата: 10.11.05 11:47
Оценка: 24 (1)
Здравствуйте, VladD2, Вы писали:

PD>>И поверь,оптимизировать чтение из файла путем замены двух сопутствующих операторов я тоже не призываю. а вот когда некие умники начинают из файла по одному байту читать — это уже другой разговор.


Супер рассказ. Я столкнулся с подобным в своем старом коде, когда пришла пора его оптимизировать. Самое обидное — это то, что "оптимизируя" его при написании я "наоптимизировал" совсем не то, а главное создал совершенно немодифицируемый код. Пришлось переписывать по-человечески, и, разумеется, те микрооптимизации оказались ненужными ибо макрооптимизация с лихвой перекрыла прошлый выигрышь от них.
Re[10]: История одной оптимизации
От: Дарней Россия  
Дата: 10.11.05 11:52
Оценка:
Здравствуйте, Andrei N.Sobchuck, Вы писали:

ANS>а что, есть абсолютная уверенность, что они летали?


сам не знаю, не видел но специалисты утверждают, что летали

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


вот ты сам это и сказал. Нет никакого общего понятия красоты, ибо понятие это субъективное и к тому же подверженное изменениям со временем. Вполне логично, что конструктор самолетов считает красивым хорошо спроектированный самолет (особенно — им самим спроектированный ). Вполне логично, что другой конструктор с ним не согласится. И также вполне логично, что тот самый конструктор посмотрит лет через двадцать на свой самолет и скажет "ну и уродец!"

ANS>См. выше. Я просто не смог сходу подобрать более лучшего слова чем "функциональность". Читай "интегральная оценка". А проблема в том, что довольно часто можно видеть высказывание типа "я написал красиво, а потом занялся оптимизацией и программа стала уродцем".


А ты представь себе, что тот самый конструктор сделал красивейший самолет, который замечательно летает, а ему потом сказали "ну ты извини, но твой самолет по размаху крыльев на три метра превышает имеющиеся у нас ангары. Так что ты придумай уж что-нибудь"
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Всех излечит, исцелит
добрый Ctrl+Alt+Delete
Re[26]: История одной оптимизации
От: Pavel Dvorkin Россия  
Дата: 10.11.05 11:55
Оценка:
Здравствуйте, GlebZ, Вы писали:

GZ>И здесь не всегда. Если процедура синлайнется, то вполне возможно что компилятор поймет что копировать не стоит. Вобщем ситуаций может быть много.


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

GZ>Вобщем, насколько я понял, у нас различия в термине "грамотное кодирование".




GZ>Ключевые слова deep copy и shadow copy. Первый копирует все объекты на который ссылаются, второй копирует ссылки. По умолчанию обычно действует shadow copy.


Это я все понимаю, а как все же этот deep copy реализовать ?

class MyClass
{
AnotherClass c;
//
}

и у AnotherClass ICloneable не реализован. Как его deep copy сделать ?

В С++ такое в принципе невозможно. Есть AnotherClass — должен быть у него конструктор копирования. Как он устроен — меня не интересует, а работать будет.
With best regards
Pavel Dvorkin
Re[15]: История одной оптимизации
От: vdimas Россия  
Дата: 10.11.05 11:57
Оценка: -1
Здравствуйте, AndrewVK, Вы писали:

AVK>Здравствуйте, TK, Вы писали:


TK>>Интересно, а какой смысл вести дискуссию цель которой доказать, что твой собеседник чего-то там не знает? Какая в этом польза для сообщества?


AVK>Польза очень простая — товарищь агитирует за крайне вредную для новичком идею — что паттерны вредны.


Где именно?
Новички уже давно поняли, за что именно я агитирую.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.