【问题标题】:What is faster use StringBuilder to create string and then print result into a file or use PrintWriter to print it at once?使用 StringBuilder 创建字符串然后将结果打印到文件中或使用 PrintWriter 一次打印它更快?
【发布时间】:2020-08-28 05:55:41
【问题描述】:

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

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

立即使用 PrintWriter?

或者也许有最快的选择

【问题讨论】:

  • 两个都试试。测量。
  • 调用PrintWriter 相当慢,因此使用StringBuilder 构建单个字符串会执行得更好,但是您可能不会注意到只有1000 个值有任何差异。
  • 由于磁盘 IO 操作是最慢的部分,因此 PrinWriter 和 StringBuilder 之间的差异可以忽略不计。但是,不要猜测 - 测量!

标签: java string performance optimization time


【解决方案1】:

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

什么是更快的工作:

抱歉,您在这里问错了问题。

  1. 将数字 1 到 1000 写入文件可能是一项只需执行一次的任务。执行任务需要 1 秒或 10 秒都没有关系。您 99.5% 的时间将用于编写、编译、修复编译错误和调试。

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

  2. 将 1000 个数字写入文件的 Java 应用程序的运行时可能类似于1这样:

    • 0.5 秒启动 JVM 并加载所需的类和其他预热活动
    • 0.05 秒创建/打开文件并关闭它
    • 0.05 秒格式化和写入数据

    现在假设这两种方法之间有 20% 的差异。如果您计算总和,优化工作的总体执行节省将是 0.60 秒中的 0.01 秒。

简而言之,优化代码根本不值得。

1 - 这些数字都是猜测。但我认为他们是正确的。


但是,如果您真的想在这方面花费时间,请保持科学。给自己写一个基准并衡量哪种方法更快。在此处正确了解如何在 Java 中进行基准测试:

【讨论】:

    【解决方案2】:

    写入 1000 个值并不多,因此两种解决方案都能完成工作。如果您使用PrintWriter 的默认值(没有自动行刷新),与首先写入StringBuilder 相比,它的性能应该相似。磁盘 IO 应该是这两种情况的瓶颈。

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

    但根据您的描述,我不推荐nio,因为它的API 很复杂。方便的话就用简单的StringBuilder开始,或者直接用PrintWriter。两者都应该足以满足您的用例。

    【讨论】:

    • 如果没有线程联合,同步开销可以忽略,尤其是涉及到磁盘IO的时候。
    • @kofemann 是的,我在声明中删除了。在我尝试的一个小例子中,它也没有任何区别。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-01
    • 2014-08-15
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    相关资源
    最近更新 更多