Java 在调用print()或多次调用print()时连接字符串是否更快?

Java 在调用print()或多次调用print()时连接字符串是否更快?,java,string-concatenation,Java,String Concatenation,考虑以下两个代码段: System.out.print(i+); 或 系统输出打印(i); 系统输出打印(“”); 虽然两者最终都会打印相同的输出,但就执行速度而言,哪种变体会更快 在某些情况下,我问的原因是,将第一个转换为第二个会导致在线编译器中出现“超过时间限制(TLE)”错误。这表明第一种方法速度更快,但我不知道这是否普遍成立。我还想了解为什么您不能真正知道-这取决于代码中不明显的因素 什么时候i+”更慢? 要使其更慢,i需要是一个非常大的字符串(或者某个对象的toString()方法

考虑以下两个代码段:

System.out.print(i+);

系统输出打印(i);
系统输出打印(“”);
虽然两者最终都会打印相同的输出,但就执行速度而言,哪种变体会更快


在某些情况下,我问的原因是,将第一个转换为第二个会导致在线编译器中出现“超过时间限制(TLE)”错误。这表明第一种方法速度更快,但我不知道这是否普遍成立。我还想了解为什么您不能真正知道-这取决于代码中不明显的因素

什么时候
i+”
更慢? 要使其更慢,
i
需要是一个非常大的字符串(或者某个对象的
toString()
方法返回一个非常大的字符串,从而导致
i+“”
操作相对昂贵。它仍然是一个完全在内存中的事务,因此与大多数
I/O相比,它可以忽略不计,但将其设置为大约一百万个字符的字符串,这可能会导致速度变慢

什么时候是
i
,那么
会变慢?
System.in
是缓冲区还是非缓冲区。您无法得到任何保证。它通常是一个连接在一起的相当大的系统链,最终,您会写入一个文件(例如,如果您运行
java-cp.yourpkg.YourClass>output.txt
),或控制台,如果该控制台通过ssh、TCP/IP数据包通过网络运行,等等

许多这样的系统增加了大量的开销,因为它们是所谓的“打包”系统:它们根本无法发送或处理单个字节。它们只能处理相当大的数据块。以网络为例:要将一些数据从internet上的一台计算机发送到另一台计算机,您需要将要发送的数据打包成一个所谓的数据包,其中包含许多字节这些数据将通过你的网卡、你的路由器、街道尽头的小壁橱、你所在城市的更大的网络中心、到一个主要的配电干线、穿过光纤到大洋的另一边,然后所有这些,再回到你所在的城市一个你已经
ssh
-ed到的服务器。很明显,你需要很多字节的信息才能做到这一点

因此,如果您只想发送
Hello
而不想发送更多内容,那么将生成一个完整的数据包。它可能承载1800字节的数据,但只承载5字节。不过,它仍然有大约100字节的路由信息开销。因此,Hello数据包总共大约有105字节大。您的网卡将其分流到您的ro然后你的代码几乎立刻说:好的,太好了,现在发送一个空格!-这导致你的系统尽职尽责地制作另一个包,应用所有的路由开销,然后关闭一个101字节的包,总共2个单独的包,总共206字节

与一次发送106字节的单个数据包相比,一次发送
Hello

这就是为什么通常的“缓冲”或失败,将发送集中到更少的实际写入中,速度会更快的一个例子。但问题是,你不知道
System.out
去哪里。控制台?网络?文件?比特桶?谁知道呢。如果你运行
java-jar-yourapp.jar>/dev/null
System.out
速度惊人(因为数据毫无用处)。你的问题没有提到这些数据会流向何处

注意:文件最终也是基于数据包的,现代SSD无法一次性将单个字节写入磁盘,只能将整个数据块写入。如果您首先写入“hello”,SSD最终会将整个数据块读取到内存中,然后更新一些字节以使其读取“hello”,然后用电源脉冲刷新磁盘上的位置,重置整个数据段,然后刷新它会将数千字节的整个数据块写回。如果你再写一个空格,整个例程将在第二次执行,而如果你只调用一次write,磁盘可能会执行“加载整个数据块、更新数据、缓冲数据块、保存数据块”的歌舞例程,只执行一次

好的,你能简化一下吗?
嗯,不。这就是重点。然而,通常情况下,这并不重要,而且它们都一样快。但是,如果重要的话,
i+“
很可能会更快。

“只是将我得到的第一个转换为第二个”这不回答你的问题“需要更少的时间”?但是如果有人能给我一个大概的理由,我的代码是竞赛中一个问题的解决方案,我认为它与这个问题无关,这应该更多地与算法有关,而不是在他们的后端服务器上打印刚刚超出时间限制的语句。调用
System.out.print
通常是involves同步,以避免来自不同线程的调用交错。看起来两个方法调用的时间开销大于串联(不同步)和一个方法调用的时间开销。