Java 使用StringBuilder创建字符串,然后将结果打印到文件中,或者使用PrintWriter一次打印,有什么更快的方法?

Java 使用StringBuilder创建字符串,然后将结果打印到文件中,或者使用PrintWriter一次打印,有什么更快的方法?,java,string,performance,optimization,time,Java,String,Performance,Optimization,Time,我需要将我的列表(从1到1000的数字)打印到一个文件中 什么是工作更快: 创建StringBuilder并附加每个数字,然后使用PrintWriter打印此字符串(使用for循环:for(int项:list){}) 或 立即使用PrintWriter 或者可能有最快的替代方法写入1000个值并不多,因此两种解决方案都可以完成任务。如果使用默认值(无自动换行),则与写入第一个值相比,它的性能应该类似。在这两种情况下,磁盘IO都应该是瓶颈 一旦你不得不处理巨大的输出,性能可能会变得重要,但在这种情

我需要将我的列表(从1到1000的数字)打印到一个文件中

什么是工作更快: 创建StringBuilder并附加每个数字,然后使用PrintWriter打印此字符串(使用for循环:
for(int项:list){}

立即使用PrintWriter


或者可能有最快的替代方法

写入1000个值并不多,因此两种解决方案都可以完成任务。如果使用默认值(无自动换行),则与写入第一个值相比,它的性能应该类似。在这两种情况下,磁盘IO都应该是瓶颈

一旦你不得不处理巨大的输出,性能可能会变得重要,但在这种情况下,这两种方法都不是最优的。在这种情况下,如果IO性能至关重要,那么包可能值得一看


但是根据您的描述,我不建议使用
nio
,因为它的API很复杂。如果方便的话,可以从一个简单的
StringBuilder
开始,或者直接使用
PrintWriter
。这两种方法对于您的用例都应该足够了。

编写1000个值不是很多,所以两种解决方案都可以完成任务。如果您使用d由于(无自动行刷新),它的性能应该与写入第一行的性能相似。在这两种情况下,磁盘IO都应该是瓶颈

一旦你不得不处理巨大的输出,性能可能会变得重要,但在这种情况下,这两种方法都不是最优的。在这种情况下,如果IO性能至关重要,那么包可能值得一看

但根据您的描述,我不建议使用
nio
,因为它的API很复杂。如果方便的话,可以从简单的
StringBuilder
开始,或者直接使用
PrintWriter
。这两种方法对于您的用例都应该足够了

我需要将我的列表(从1到1000的数字)打印到一个文件中

什么是工作更快:

对不起,你问错问题了

  • 将数字1到1000写入文件可能是一项只需执行一次的任务。执行此任务需要1秒或10秒并不重要。99.5%的时间将用于编写、编译、修复编译错误和调试

    事实上,如果你把你写这个问题和阅读答案所花的时间考虑进去,这可能接近你99.9%的时间

  • 向文件写入1000个数字的Java应用程序的运行时可能是这样的:

    • 0.5秒启动JVM并加载所需的类和其他预热活动
    • 0.05秒创建/打开文件并将其关闭
    • 0.05秒格式化和写入数据
    现在假设这两种方法之间有20%的差异。如果进行求和,优化工作的总体执行节省时间将是0.60秒中的0.01秒

  • 简言之,优化代码根本不值得这么做

    1-这些数字都是猜测。但我认为它们基本正确


    但是,如果你真的想在这方面花费时间,那么就要科学。为自己编写一个基准测试,并衡量哪种方法更快。请在此处阅读如何正确使用Java进行基准测试:

    我需要将我的列表(从1到1000的数字)打印到一个文件中

    什么是工作更快:

    对不起,你问错问题了

  • 将数字1到1000写入文件可能是一项只需执行一次的任务。执行此任务需要1秒或10秒并不重要。99.5%的时间将用于编写、编译、修复编译错误和调试

    事实上,如果你把你写这个问题和阅读答案所花的时间考虑进去,这可能接近你99.9%的时间

  • 向文件写入1000个数字的Java应用程序的运行时可能是这样的:

    • 0.5秒启动JVM并加载所需的类和其他预热活动
    • 0.05秒创建/打开文件并将其关闭
    • 0.05秒格式化和写入数据
    现在假设这两种方法之间有20%的差异。如果进行求和,优化工作的总体执行节省时间将是0.60秒中的0.01秒

  • 简言之,优化代码根本不值得这么做

    1-这些数字都是猜测。但我认为它们基本正确


    但是,如果你真的想在这方面花费时间,那么就要科学。为自己编写一个基准测试,并衡量哪种方法更快。请在此处阅读如何正确使用Java进行基准测试:


    尝试两种方法。Measure.调用
    PrintWriter
    相当慢,因此使用
    StringBuilder
    构建单个字符串的性能会更好,但是您可能不会注意到只有1000个值的任何差异。由于磁盘IO操作是最慢的部分,PrinWriter和StringBuilder之间的差异可以忽略不计。但是,不要猜测-measure!尝试两者。measure。调用
    PrintWriter
    相当慢,因此使用
    StringBuilder
    构建单个字符串的性能会更好,但是您可能不会注意到只有1000个值的任何差异。由于磁盘IO操作是最慢的部分,因此PrinWriter和StringBuilder之间的差异将非常小可以忽略不计。但是,不要猜测-测量!如果没有线程连接,则可以忽略同步开销,特别是当涉及磁盘IO时。@kofemann True,我删除了at语句。在我尝试的一个小示例中,这也没有什么不同。如果没有线程连接,则syn