嗯,标题很明确,但对那些对背景感兴趣的人有一点解释。 我正在开发一个小图像浏览器。在应用程序的一部分是一个目录浏览器,它允许我浏览我的硬盘驱动器和已安装的卷的所有文件夹。 在进行性能分析时,我注意到我的应用程序最耗时的方法是以下代码:
// get the content of the directory
NSFileManager * fileManager = [NSFileManager defaultManager];
NSURL * url = [NSURL fileURLWithPath:mPath];
mCachedContent = [[fileManager contentsOfDirectoryAtURL:url
includingPropertiesForKeys:nil
options:NSDirectoryEnumerationSkipsHiddenFiles
error:nil] retain];
// parse the content, count the number of images and directories.
for (NSURL * item in mCachedContent)
{
if (CFURLHasDirectoryPath((CFURLRef)item))
{
++mNumChildren;
}
else if ([FileUtils isImage:[item path]] == YES)
{
++mNumImages;
}
}
这是必要的,以便NSOutlineView可以知道目录是否可扩展(并且图像的数量也是我需要的功能) 更确切地说,如果[NSFileManager contentsOfDirectoryAtURL ...]
,最耗时的方法那么,有没有其他方法可以让目录的内容比我使用的内容更有效?
提前感谢您的帮助!
答案 0 :(得分:1)
无论你如何编写这个函数(例如使用Cocoa的NSFileManager
API或Unix opendir(3)
/readdir(3)
API),它都会受到I / O限制 - 你会花更多的时间等待I / O而不是中间层执行的任何CPU操作。
如果这确实是你的瓶颈,那么这意味着你做了太多的I / O.确保你没有做任何愚蠢的事情,比如不断地每秒反复读取同一目录的内容数百次。如果您需要不断观察特定目录并在该目录中的某些内容发生更改(例如,文件被写入,创建或删除文件等)时采取措施,则使用File Systems Events API。这使您可以在事件发生时有效地响应这些事件,而无需不断轮询目录。