0

我正在尝试找出一种方法来改进我制作的 C++ Win32 程序,该程序基本上递归遍历给定文件夹,并为每个给定文件计算一个哈希(比如说 MD5,但它可能是任何类型的 CPU 昂贵计算) . 由于这是一个 I/O 绑定的应用程序,大部分时间进程都在等待 I/O 完成,因此不会使用尽可能多的 CPU。即使使用线程池执行此操作也可能(我错了吗?)不能解决问题,每个线程都会阻塞等待 I/O 完成,另外还会有上下文切换开销。

所以我开始考虑使用重叠读取来执行此操作,每次我收集一个新文件进行处理时,我都会将一个非阻塞读取操作排入队列,让一个线程处理完成回调并对我收到的每个块进行块哈希处理从队列本身...理论上这应该避免进程挂在 I/O 等待上,我应该注意到 CPU 使用率增加,从而整体加速。

我有以下问题:

  • 我假设这会提高应用程序的整体性能,对吗?如果不是,为什么?
  • I/O 完成事件的排序方式是否与读取操作相同?我的意思是,如果我从文件的偏移量 A、B 和 C 中读取 N 个字节,我会按该顺序获得 A、B 和 C 的完成事件,还是它们会以不可预测的顺序到达?
  • 我正在寻找一个库或一些代码示例来实现整个机制,我应该使用 IOCP,还是简单地使用带有自定义回调的 RegisterWaitForSingleObject ?我似乎没有找到多个文件 I/O 的示例,我发现的所有内容都只是单个文件上重叠读取的示例,或者带有套接字的 IOCP,你能指出我正确的方向吗?
  • 在这种情况下,线程池不是没用吗?单线程方法应该足够好(例如遵循 nginx/libevent 方法),对吗?

请不要用替代解决方案回答某些问题,我只想以最好的方式实现一个 OVERLAPPED 操作队列,我对其他任何事情都不感兴趣(当然,除非证明对我的场景更有效)。

编辑:

目前软件的实现是什么(当然app不完全是这样,只是给个思路):

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 );
}

谢谢。

4

0 回答 0