Страница: 1 |
Страница: 1 |
Вопрос: lock (задумался)
Добавлено: 07.03.11 20:25
Автор вопроса: VβÐUηìt | Web-сайт:
Если я работаю с жестким диском во всяких параллельных раста-операциях, например, считываю параллельно стопицот битмапов с жесткого диска, целесообразна ли такая вася:
object hdd = new object();
Parallel.For(0, 10, i=>
{
Bitmap p;
lock (hdd)
p = Bitmap.FromImage("image_" + i.ToString());
Blur(p);
Contrast(p);
...
});
То есть какбэ раста-код работает и без lock(hdd), но с ним вроде бы должно быть более быстро, ибо файлы все равно считываются последоватльно. Бо?
Заранее благодарен
Ответы
Всего ответов: 4
Номер ответа: 1
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #1
Добавлено: 07.03.11 22:04
Кто такой Bitmap.FromImage?
Кроме собственно чтения данных с диска new Bitmap(filename) (о котором, как я полагаю, должна идти речь), также должен будет выполнить обработку формата JPEG. Для этого не нужен жесткий диск, однако, он будет простаивать некоторое время, поскольку lock стоит на всю операцию.
Можно сначала выполнить чтение данных в буфер через File.ReadAllBytes, и эту операцию синхронизировать. После этого уже без синхроинзации поверх буфера кидать MemoryStream и из него создавать new Bitmap(stream)
Номер ответа: 2
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #2
Добавлено: 08.03.11 02:10
сомнительно.. ибо дисковые операции в гораздо бОльшей степени зависят от конкретного винта(количество головок,об/мин,raid,кэш и т.д.) нежели от кода.
имхо, зачастую разбиение дисковых операций на разные ядра/потоки приведет к худшим резельтут чем чтение в одном единственном потоке.
Номер ответа: 3
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #3
Добавлено: 08.03.11 03:07
В каком-то конкретном случае может быть и улучшение. Если он втечение последнего часа дрочил эти 10 несчастных файлов, то они будут покорно ждать очередного эксперимента в кеше, и, соответственно, от многопоточности может быть профит. А многопоточности там немного будет, так как, насколько я помню, без указания degree of parallelism Parallel.For запустит столько потоков, сколько логических ядер в компьютере.
При честной работе с HDD, конечно, в теории многопоточность должна дать падение скорости.
Номер ответа: 4
Автор ответа:
VβÐUηìt
Вопросов: 246
Ответов: 3333
Web-сайт:
Профиль | | #4
Добавлено: 08.03.11 12:46
Именно поэтому я решил, что обработку можно вести в разных потоках, а считывание сделать последовательным, но с помощью Lock. Файлы эти врят ли валяются в кэше, ибо все это происходит один раз при загрузке.
То есть, пилю васю как есть (с поправкой поста 1), и добавляю распознавание SSD (ибо там параллельность - это нормально).