在 print() 调用中连接字符串更快,还是多次调用 print() 更快?

Is it faster to concatenate strings within a call to print(), or call print() multiple times?

考虑以下两个代码片段:

System.out.print(i + " ");

System.out.print(i);
System.out.print(" ");

虽然两者最终会打印相同的输出,但就执行速度而言,哪种变体更快?

在某些情况下,我问的原因是将第一个转换为第二个导致我的在线编译器出现“超出时间限制 (TLE)”错误。 表明 第一个更快,但我不知道这是否普遍适用。我也想明白为什么.

你不可能真的知道 - 这取决于你的代码中不明显的因素。

什么时候 i + " " 变慢?

为了让速度变慢,i 需要是一个非常大的字符串(或者某些对象的 toString() 方法 returns 是一个非常大的字符串,从而导致 i + " " 操作相对昂贵。它仍然是一个完全在内存中的事情,所以与 most I/O 相比,它可以忽略不计,但是使它成为一百万个字符的字符串或所以这可能会导致速度变慢。

什么时候i,然后" "慢?

System.in 是否缓冲。你没有 gua运行T 恤。它通常是连接在一起的相当大的系统链,最终,您最终写入文件(例如,如果您 运行 java -cp . yourpkg.YourClass >output.txt)或控制台,如果该控制台是 运行通过 ssh 连接,TCP/IP 通过网络发送数据包,等等。

许多这样的系统增加了大量开销,因为这些是所谓的 'packeting' 系统:它们根本无法发送或处理单个字节。他们只能处理相当大的块。以网络为例:要将某些数据从互联网上的一台计算机发送到另一台计算机,您可以将要发送的数据包装在所谓的数据包中,其中包括许多字节的数据,这些数据用于处理该数据的系统以了解要发送的内容做它。这些数据将通过你的网卡、你的路由器、街道尽头的小衣橱、你镇上较大的网络中心,到达一个主要的分布 t运行k,穿过光纤到达另一个大洋彼岸,然后所有这些,返回到您 ssh 进入的服务器。很明显,您需要相当多字节的信息才能实现这一点。

因此,如果您只想发送 Hello,仅此而已,那么就会生成一个完整的数据包。它可能携带 1800 字节的数据,但它只会携带 5 个字节。尽管如此,它仍然有大约 100 字节的路由信息​​开销。因此,Hello 数据包在 g运行d 中总共大约有 105 个字节大。你的网卡将它分流到你的路由器,然后它就传到了广阔的世界,然后你的代码几乎立即说:好的,太好了,现在发送一个 space! - 这会导致您的系统尽职尽责地制作另一个数据包,应用所有路由开销,然后关闭一个 101 字节的数据包,总共 g运行d 2 个单独的数据包,总计 206 字节。

对比一次发送 Hello ,对于一个 106 字节的数据包。

这就是为什么通常 'buffering' 或失败时,将您的发送集中到更少的实际写入中会更快的一个例子。但问题是,您不知道 System.out 去了哪里。安慰?网络?文件?比特桶?谁知道。如果你 运行 java -jar yourapp.jar >/dev/nullSystem.out 会非常快(因为数据绝对无处可去)。你的问题没有提到这是怎么回事。

注意:文件最终也是基于数据包的,现代 SSD 无法将单个字节写入磁盘,只能一次性写入整个块。如果您首先写入 'hello',SSD 最终会将整个块读取到内存中,然后更新一些字节以便它们读取 'hello',然后使用重置整个段的电涌来刷新磁盘上的位置,然后将数千字节的整个大块写回。如果您随后写入 space,整个例程将执行第二次,而如果您只调用一次写入,则磁盘可能只会执行此 'load an entire chunk, update data, surge the chunk, save the chunk' 歌舞例程一次。

好的,你能简化一下吗?

嗯,不。这才是重点。但是,通常,没关系,它们同样快。但是,如果重要的话,i + " " 很可能会更快。