Здравствуйте, 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>>