Здравствуйте, Pavel Dvorkin, Вы писали:
AVK>>Нет.
PD>Ну что же, все ясно.
Смешно. Потрясающий ты человек, Павел Дворкин.
PD> Ответ свой я дал в ответе IT.
Нет, там ты тоже его не дал. Итого — доказать, что ты в императивном стиле напишешь не хуже функционального ты не смог. Вот и весь итог.
PD>Еще раз (на этот раз тебе) объясняю — требовать от меня чего-либо ни ты, ни он не можешь.
Да я и не требую. Только выглядят после этого твои слова, как бы это помягче, неубедительно.
AVK>>Я хочу не кашу из звездочек и стрелочек, а вменяемое описание алгоритма.
PD>Ну насчет каши — не нравится язык — дело твое. Я другой язык использовать не буду.
Кто бы сомневался.
PD> А описание — мне казалось , что я его дал.
Вот именно что казалось.
>>поэтому я просто распараллелил вычисление сумм красных компонент по столбцам окна.
Компонент чего, rакого окна? О чем вообще речь? Сравни свое "описание" с описанием IT. Ну хотя бы по объему. А с таким описанием я тебе могу дать точно такой же ответ:
return things.AsParallel().Select(thing => thing.RedComponent).Sum();
Из комментариев еще можно понять, что у тебя там вроде бы есть еще и непараллельный алгоритм, но AsParallel реально параллелит только если есть несколько ядер. Впрочем, явно указать тоже не проблема:
return (isParallel ? things.AsParallel() : things).Select(thing => thing.RedComponent).Sum();
А теперь сравни со своей простыней. Что там у нас осталось? Параллелить вкривь и вкось различными способами? Все это задается начальными итераторами, теми, которые на вход AsParallel поступают. И тут тоже у шарпа с его итераторами возможностей по понятной и эффективной реализации всяких причудей будет больше, чем ты сможешь на С++ изобразить. Впрочем, это уже не ФП.
PD>Дано окно Windows с неким рисунком в нем. Пройти по всем пиксельным столбцам клиентской области этого окна и найти для каждого столбца сумму R (красных) компонент пикселей , записать результаты в массив columnSum. Две реализации — в лоб без распараллеливания, и с распараллеливанием
PD>Реализация с распараллеливанием — создаются N потоков, где N — число процессоров (возвращает GetSystemInfo). Если процессоров 2, то один поток займется левой половиной окна, а другой правой. Если 3 — левой, средней и правой соответственно. И т.д.
Если это все, тогда в первый вариант вместо things подставляем:
window.Rows.SelectMany(row => row.Values)
Или, если тебе хочется исключительно индексы, то:
Enumerable.Range(0, Width).SelectMany(x => Enumerable.Range(0, Height).Select(y => pixels[x, y]))
Или, используя query comprehension
from x in Enumerable.Range(0, Width)
from y in Enumerable.Range(0, Height)
select pixels[x, y]
Ну и все вместе:
return
(
from x in Enumerable.Range(0, Width)
from y in Enumerable.Range(0, Height)
select pixels[x, y].Red
)
.AsParallel()
.Sum();
А теперь я поработаю чуток предсказателем — ты все равно не напишешь пример IT в императивной форме.
... << RSDN@Home 1.2.0 alpha 4 rev. 1111 on Windows Vista 6.0.6001.65536>>