Страница: 1 |
Вопрос: lock (задумался) | Добавлено: 07.03.11 20:25 |
Автор вопроса: ![]() |
Если я работаю с жестким диском во всяких параллельных раста-операциях, например, считываю параллельно стопицот битмапов с жесткого диска, целесообразна ли такая вася:
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 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Вопросов: 130 Ответов: 6602 |
Профиль | Цитата | #1 | Добавлено: 07.03.11 22:04 |
Кто такой Bitmap.FromImage?
Кроме собственно чтения данных с диска new Bitmap(filename) (о котором, как я полагаю, должна идти речь), также должен будет выполнить обработку формата JPEG. Для этого не нужен жесткий диск, однако, он будет простаивать некоторое время, поскольку lock стоит на всю операцию. Можно сначала выполнить чтение данных в буфер через File.ReadAllBytes, и эту операцию синхронизировать. После этого уже без синхроинзации поверх буфера кидать MemoryStream и из него создавать new Bitmap(stream) |
Номер ответа: 2 Автор ответа: ![]() ![]() ![]() ![]() ![]() Вопросов: 58 Ответов: 4255 ![]() |
Профиль | Цитата | #2 | Добавлено: 08.03.11 02:10 |
но с ним вроде бы должно быть более быстро
сомнительно.. ибо дисковые операции в гораздо бОльшей степени зависят от конкретного винта(количество головок,об/мин,raid,кэш и т.д.) нежели от кода. имхо, зачастую разбиение дисковых операций на разные ядра/потоки приведет к худшим резельтут чем чтение в одном единственном потоке. |
Номер ответа: 3 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Вопросов: 130 Ответов: 6602 |
Профиль | Цитата | #3 | Добавлено: 08.03.11 03:07 |
В каком-то конкретном случае может быть и улучшение. Если он втечение последнего часа дрочил эти 10 несчастных файлов, то они будут покорно ждать очередного эксперимента в кеше, и, соответственно, от многопоточности может быть профит. А многопоточности там немного будет, так как, насколько я помню, без указания degree of parallelism Parallel.For запустит столько потоков, сколько логических ядер в компьютере.
При честной работе с HDD, конечно, в теории многопоточность должна дать падение скорости. |
Номер ответа: 4 Автор ответа: ![]() ![]() ![]() ![]() Вопросов: 246 Ответов: 3333 |
Web-сайт: Профиль | Цитата | #4 | Добавлено: 08.03.11 12:46 |
Именно поэтому я решил, что обработку можно вести в разных потоках, а считывание сделать последовательным, но с помощью Lock. Файлы эти врят ли валяются в кэше, ибо все это происходит один раз при загрузке.
То есть, пилю васю как есть (с поправкой поста 1), и добавляю распознавание SSD (ибо там параллельность - это нормально). |
Страница: 1 |
|