Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Diskstorage.swift:224 (fileManager.fileExists(atPath: filePath) 文件IO耗时导致卡顿 #2217

Open
meiyongsheng opened this issue Mar 7, 2024 · 2 comments

Comments

@meiyongsheng
Copy link

image

onevcat你好,由于我们项目在使用Kingfisher的过程中多次遇到文件IO导致卡顿的问题,经过排查发现,因为在获取文件缓存对应的cache对象时,内部判断文件是否存在涉及IO消耗, 代码位置为 Diskstorage.swift:224 影响面比较大(我们的应用为国内TOP级别应用),请问一下这块有解决方案吗?

@onevcat
Copy link
Owner

onevcat commented Mar 12, 2024

@meiyongsheng 感谢汇报这个问题。

暂时这个方法被安排在了主线程上调用,做 dispatch 应该可以缓解,但是可能会涉及到一些后向兼容的问题 (比如 .loadDiskFileSynchronously) 和部分 API breaking。我考虑一下看看有没有更好的方法。

另外,想要请教一下,大概是在多长时间内 (比如一个 main runloop?) 检查多少图片缓存会导致这个问题?如果数量太夸张且没有必要的话,是不是也可以考虑在 set image 或者 cache check 的地方稍微batch一下。

可能是我自己的使用场景比较局限,我们自己的项目从来没有在这里遇到性能问题。

@meiyongsheng
Copy link
Author

目前主要是我们整个应用的文件IO相对操作较多, 并且涉及到的图片处理也比较非常多,当整个应用的文件IO消耗较高时,如果增涉及到有较多通过KF去处理图片的行为,此时就容易触发到性能问题,这里是否在同一个 main runloop 暂时无法界定,目前观察到的case就是IO操作较多是容易发生性能问题,目前我们项目中针对通过KF单例直接调用图片处理的地方是在异步子线程中执行,但是有部分涉及到 通过view.kf.setImage执行的函数无法切换到异步。

按照苹果方案文档fileManager.fileExists确实是一次IO行为。 我尝试修改过KF的源码,但是由于KF中是每个接口都返回DownloadTask,并且内部通过判断cacheType来进行同步执行导致目前难以修改
image

喵神看看这里有什么好的处理方案, 一劳永逸的避免这个case导致的性能问题

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants