Re[21]: Жизнь внутри метода
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 30.10.08 12:55
Оценка: +1
Здравствуйте, Pavel Dvorkin, Вы писали:

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


Проблема в аудитории, то есть? Понятно.

>>О чем вообще речь? Сравни свое "описание" с описанием IT. Ну хотя бы по объему. А с таким описанием я тебе могу дать точно такой же ответ:

AVK>>
AVK>>return things.AsParallel().Select(thing => thing.RedComponent).Sum();
AVK>>


PD>Нет, не пойдет этот аргумент. Пусть даже ты прав, и можно было уточнить. Но текст программы приведен, и в нем (по крайней мере в непаралельной части) разберется любой мой студент за 1 минуту, даже если я вообще никакого описания не дам.


Логично, на то он и пример.

PD> несерьезно это.


Несерьезно, это не понимать, что читаемость кода и его близость к формулировке задачи — это самый важный параметр оценки качества этого самого кода. Конечно, на таком игрушечном кусочке вроде как можно и пережить то, что ты продемонстрировал, но когда кусочки станут побольше, соотношение объема изапутанности сохранится, если не увеличится, и вот тут то это будет совсем уже не фигня.

PD> Ну а потом — я же дал тебе после этого более развернутое описание задачи, зачем опять муссировать это ?


Ну а я — более подробное решение. В чем проблема то?

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


PD>Если ты не очень понимаешь Win32, это еще не причина, чтобы жаловаться.


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

PD> Я не лучше тебя знаю LinQ


Ты вообще понимаешь разницу между конструкциями языка и API операционной системы? Мы здесь, еще раз напоминаю, обсуждаем именно конструкции языка, и ничто иное. Обойтись без LINQ для демонстрации возможностей ФП на шарпе нельзя в принципе, обойтись без Win32 для демонстрации того, что LINQ ничего не дает можно, и даже нужно.

PD>, но я не заявлял, что не пойму этот SELECT, что IT привел.


Конечно, в том и суть, что ты, ничего не зная ни про ФП, ни про LINQ, тем не менее понимаешь код, который IT привел.

AVK>>А теперь сравни со своей простыней. Что там у нас осталось? Параллелить вкривь и вкось различными способами?


PD>Если не сложно, объясни , почему вкривь и вкось, это раз


Не знаю, тебе захотелось по диагонали или еще как то там пиксели обсчитывать.

PD>, и откуда там различные способы, если там всего один.


В конце у тебя там вопросы под пунктами.

PD> А второй вопрос — ты хоть понимаешь, что внутри твоего AsParallel зашита работа с потоками примерно так, как я и сделал.


Понимаю. И что? Я тебе в который раз напоминаю — речь не о библиотеках и их возможностях, речь о языке программирования. AsParallel просто демонстрирует эти возможности, не более того.

PD> Не обязательно так, конечно, скорее там пул потоков, посмотрю как-нибудь. Ну нет в Win32 иного способа параллелить и нет в Windows ничего, что не проходио бы через Win32 (про OS/2 и POSIX умолчим).


Оторвись от замочной скважины и открой наконец дверь.

PD>Итераторы в С++ существуют, а вообще это понятие языково-независимо.


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

PD> Вот ответь прямо — да или нет ?


Отвечаю прямо — неважно. Не уводи от темы. Распараллеливание здесь в качестве примера, а не самоцель. Если не можешь съехать с Win32, я могу в примере заменить распараллеливание на, скажем, кеширование.

PD>Честно говоря, не слишком понял — что ты суммируешь и куда. Если это реализация моей задачи


Она.

PD> — где массив сумм по столбцам ?


Вот тебе с массивом, это еще проще:
return
    (
        from x in Enumerable.Range(0, Width)
        select Enumerable.Range(0, Height).Sum(y => pixels[x, y])
    )
    .AsParallel()
    .ToArray();

Обрати внимание, насколько просто оказывается поменять код.

PD>Ты все же попробуй те 5 вопросов осилить.


Смысл? Игрища с приоритетами потоков в контексте вопроса малоинтересны и непринципиальны (ну будет там какой нибудь доп.параметр у AsParallel()). А хитрые итераторы, как я уже сказал, не проблема вовсе.

PD> А это суммирование, конечно, распараллелить можно, задачка-то пустяковая.


Только даже на такой пустяковой задачке прекрасно видно, насколько твой императивнй код запутаннее.

AVK>>А теперь я поработаю чуток предсказателем — ты все равно не напишешь пример IT в императивной форме.


PD>Вообще-то я не очень понимаю — в чем разница. Он какие-то проценты считает на баз неких коллекций, а я суммы считаю на базе тоже, если хочешь, "коллекций — столбцов пикселей.


У него алгоритм намного сложнее, а, главное, там уровень косвенности выше.

PD> Делить я не делю и не суммирую, верно, но так ли это важно ? Есть распараллеливание алгоритма, что тут особого-то.


Ты сделай сперва без распараллеливания, и мы обсудим результат.
... << RSDN@Home 1.2.0 alpha 4 rev. 1111 on Windows Vista 6.0.6001.65536>>
AVK Blog
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.