Re[19]: Жизнь внутри метода
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 29.10.08 14:00
Оценка: +3
Здравствуйте, 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>>
AVK Blog
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.