我的应用程序生成了很多日志文件,我想在每次启动应用程序时清理此文件夹。最简单的方法是:
//remove files from the previous executions
Thread tCleanAppFolder = new Thread() {
public void run() {
String savePath = getFilesDir().getPath() + File.separator;
File path = new File(savePath);
for (File file : path.listFiles()) {
file.delete();
}
}
};
tCleanAppFolder.start();
当然,出于性能原因,我们在单独的线程中执行此代码。现在的问题是,我应该删除单独线程中的每个文件,还是可以保留现在的代码?使用tCleanAppFolder
线程内的多个线程会增强清理过程吗?
可能值得一提,我说的是Android应用程序,因此没有硬盘,而是智能手机的内部和外部内存。
感谢。
答案 0 :(得分:3)
在确定此代码是瓶颈之前,请不要过早优化。可以花时间修复另一个错误或添加其他功能。
使其成为多线程将使您的应用程序状态更复杂,因此更难调试并且源代码更难以阅读。所以在你这样做之前,我会运行基准来实际确定这个操作是否是线程绑定的,并且实际上可以通过使用更多的线程进行优化。
答案 1 :(得分:1)
您确定之前没有构建任何新文件吗?
你的'文件删除'主题执行这个path.listFiles()
?
如果没有,您可能会删除当前需要的文件!
除了更多线程的旋转可能会提高性能,因为在循环的每次迭代中,您将拥有大量的IO时间。换句话说......你的线程不受CPU限制但受IO限制,所以线程多于你拥有CPU内核的线程可能会有所回报。
另一方面,如果可能发生数千个文件,则不应启动数千个线程。在这种情况下,通过线程分发要删除的文件会使您的逻辑变得复杂一些。答案 2 :(得分:0)
如果你只是删除文件(cpu-wise所需的时间可以忽略不计,并且从i / o的角度来看也是相同的)瓶颈将由磁盘I / O表示,我不指望要查看删除具有多个线程的文件的任何改进,您可以按顺序执行。
答案 3 :(得分:0)
如果您尝试重新启动日志文件,请附加当前日志,您可以使用
<appender name="RFA" class="org.apache.log4j.RollingFileAppender">
<param name="Append" value="false" />
我在开发过程中使用它 如果日志文件已滚动,则不会删除或清除。