Я пытаюсь найти способ улучшить созданную мною программу C32 для Win32, которая в основном рекурсивно перебирает данную папку и для каждого данного файла вычисляет хэш (скажем, MD5, но это может быть любой вид дорогостоящих вычислений ЦП) ,
Поскольку это приложение, связанное с вводом / выводом, большую часть времени процесс ожидает завершения ввода / вывода, следовательно, не использует столько процессора, сколько мог бы.
Даже выполнение этого с использованием пула потоков, вероятно, (я ошибаюсь?) Не решит проблему, каждый поток будет блокировать ожидание завершения ввода-вывода, плюс будут издержки переключения контекста.
Таким образом, я начинаю рассматривать это с использованием перекрывающихся операций чтения, каждый раз, когда я собираю новый файл для обработки, я ставлю в очередь неблокирующую операцию чтения в очередь, имея один поток, обрабатывающий обратные вызовы завершения и хеширование блоков для каждого получаемого чанка. из самой очереди … теоретически это должно позволить избежать зависания процесса при ожидании ввода-вывода и должен заметить увеличение загрузки процессора, таким образом, общее ускорение.
У меня есть следующие вопросы:
Пожалуйста, не отвечайте на что-нибудь альтернативными решениями, я просто хочу реализовать очередь операций OVERLAPPED наилучшим образом, мне больше ничего не интересно (если, конечно, не доказано, что она более эффективна для моего сценария).
РЕДАКТИРОВАТЬ:
Какова текущая реализация программного обеспечения (конечно, приложение не совсем так, просто чтобы дать представление):
DWORD crc32( PBYTE data, DWORD size )
{
// compute the crc32 of the data and return it
}
void on_file_callback( const char *pszFileName )
{
PBYTE file_map = ...; // Open the file and memory map it.
if( crc32( file_map, file_size ) == 0xDEADBEEF )
{
printf( "OMG!!!\n" );
}
// Cleanup
}
int main( int argc, char **argv )
{
const char *pszFolder = "c:\\";
// recurse pszFolder and call 'on_file_callback' on every file found
recurse_directory( pszFolder, on_file_callback );
}
Благодарю.
Задача ещё не решена.
Других решений пока нет …