Intro:
У меня есть узкое место в моем приложении C #, где мне нужно загрузить страницу в виде растрового изображения из файла PDF или Tiff и обработать это растровое изображение, находясь в памяти.Файлы TIFF загружаются довольно быстро, как и PDF-файлы первых лиц (мы можем прочитать наши собственные).Узкое место возникает, когда файл PDF является сторонним, и нам нужно проанализировать страницу PDF и превратить ее в растровое изображение.Это дорого, в 500 раз медленнее, чем у оригинальных PDF-файлов.Некоторые из этих файлов PDF становятся очень большими, поэтому мы сначала не загружаем весь документ в память.
Гипотеза:
Работа над страницей выполняется в отдельном процессе (магическим образом), пока мое приложение ждет, пока оно не будет выполнено.Именно поэтому я полагаю, что если я загружу небольшой буфер (скажем, 5 страниц за раз), асинхронно это ускорит выполнение этих сторонних файлов PDF.
Psuedo (C # -ish):
IntPtr[] dibbuffer = new IntPtr[5];
dibbuffer[0] = LoadPage(0); //pre-emptive first page
BeginAsyncFillBuffer(dibbuffer);
for (i=0; i<NUM_PAGES; ++i)
{
IntenseProcessing(dibbuffer[current_page_index_in_buffer]);
}
EndAsyncFillBuffer();
Проблемы:
- Действительно ли это ускорит работу приложения?(некоторые машины, на которых он будет работать, являются одноядерными)
- Стоит ли пытаться синхронизировать и сортировать буфер на
потоке обработки? - Любые советы поСинхронизация процесса приветствуется.Я использую C #, поэтому можно использовать любые соглашения .Net или структуры данных.
- Дополнение : я бы хотел, чтобы оно было как можно более ленивым (загружать следующую страницу только при наличии местабесплатно в буфер