Pet*_*ker 6 c++ directory recursion performance ntfs
我写了一个小的爬虫来扫描和求助目录结构.
它基于dirent(这是FindNextFileA的一个小包装)在我的第一个基准测试中,它是惊人的缓慢:
4500个文件大约123473ms(thinkpad t60p本地三星320 GB 2.5"HD).在123473毫秒找到121481个文件这个速度是否正常?
这是我的代码:
int testPrintDir(std::string strDir, std::string strPattern="*", bool recurse=true){
struct dirent *ent;
DIR *dir;
dir = opendir (strDir.c_str());
int retVal = 0;
if (dir != NULL) {
while ((ent = readdir (dir)) != NULL) {
if (strcmp(ent->d_name, ".") !=0 && strcmp(ent->d_name, "..") !=0){
std::string strFullName = strDir +"\\"+std::string(ent->d_name);
std::string strType = "N/A";
bool isDir = (ent->data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) !=0;
strType = (isDir)?"DIR":"FILE";
if ((!isDir)){
//printf ("%s <%s>\n", strFullName.c_str(),strType.c_str());//ent->d_name);
retVal++;
}
if (isDir && recurse){
retVal += testPrintDir(strFullName, strPattern, recurse);
}
}
}
closedir (dir);
return retVal;
} else {
/* could not open directory */
perror ("DIR NOT FOUND!");
return -1;
}
}
Run Code Online (Sandbox Code Playgroud)
在某些情况下,这种速度是正常的,是的。首先,使用 FindFirstFileA 而不是 FindFirstFileW 会产生从 UTF-16 到 ANSI 的转换开销。其次,如果您正在浏览操作系统尚未访问过的目录,您将遭受至少一次搜索惩罚(对于大多数消费者硬盘驱动器大约为 16 毫秒),将您的枚举限制为远低于每秒 100 次目录检查。如果给定驱动器上的主文件表严重碎片化,情况会变得更糟。
关于文件数量,它将更多地取决于每个目录的文件数量,而不是文件本身的数量。
| 归档时间: |
|
| 查看次数: |
3036 次 |
| 最近记录: |