- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
与将所有数组项附加到 StringBuffer 然后打印相比,为什么在循环中打印数组项需要更多时间?
在此,我在循环中打印了数组项。
public static void main (String[] args) {
Scanner scan=new Scanner(System.in);
int count=scan.nextInt();
for (int i=0;i<count;i++) {
int arrlen=scan.nextInt();
int rotate=scan.nextInt();
int revarr[]=new int[arrlen];
for (int j=0;j<arrlen;j++) {
revarr[(arrlen-rotate+j)%arrlen]=scan.nextInt();
}
for (int j:revarr) {
System.out.print(j+" ");
}
System.out.println();
}
}
在此,我将数组项附加到 StringBuffer 中,然后打印。
public static void main (String[] args) {
Scanner scan=new Scanner(System.in);
int count=scan.nextInt();
for (int i=0;i<count;i++) {
int arrlen=scan.nextInt();
int rotate=scan.nextInt();
int revarr[]=new int[arrlen];
for(int j=0;j<arrlen;j++){
revarr[(arrlen-rotate+j)%arrlen]=scan.nextInt();
}
StringBuffer s = new StringBuffer();
for (int j:revarr){
s.append(j+" ");
}
System.out.println(s);
}
}
最佳答案
可能的原因与 System.out
设置为(默认情况下)的 PrintStream
的实现有关。
在Java 11中,创建PrintStream
的方法如下:
private static PrintStream newPrintStream(FileOutputStream fos, String enc) {
if (enc != null) {
try {
return new PrintStream(new BufferedOutputStream(fos, 128), true, enc);
} catch (UnsupportedEncodingException uee) {}
}
return new PrintStream(new BufferedOutputStream(fos, 128), true);
}
关键行是这样的:
return new PrintStream(new BufferedOutputStream(fos, 128), true, enc);
首先,它创建一个缓冲区大小为 128 字节的 BufferedOutputStream
。那很小。如果您对 System.out
进行少量写入,则每写入 128 个字节至少就会发生一次缓冲区刷新。
其次,true
参数启用自动刷新。 javadoc对此进行了如下描述:
"If true, the output buffer will be flushed whenever a byte array is written, one of the
println
methods is invoked, or a newline character or byte ('\n'
) is written"
同样,这意味着有更多的潮红。
为什么这会产生影响?
井刷新涉及执行fwrite
系统调用来写出字符。系统调用相对昂贵。根据我看到的一些数字,fwrite
系统调用的系统调用开销约为 60 到 350 ns。这并不是很大,但如果您在每个循环迭代中执行几次与每个循环迭代一次相比,并且您重复该操作足够长的时间,则差异可能会很大。
还可能存在一些开销,具体取决于 System.out
连接的内容。例如,如果您正在写入控制台,则大量小写入可能会减慢控制台应用程序的速度。
还有另一种解释是可能的。您所显示的基准测试代码没有考虑任何可能的 JVM 预热影响。例如,可能一个示例正在触发 JIT 编译,而另一个示例则没有。 JIT 编译的开销可能会导致前者比后者花费更长的时间。
关于java - StringBuffer 与普通打印,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61318082/
为什么下一行没有给出编译时错误? StringBuffer sb = new StringBuffer(new StringBuffer()); 我在网上查了很多也找不到原因。不仅如此,它还允许 St
我在 http get 请求中使用了下面的代码,但是我从返回中得到的是 null。我不知道为什么。 public static String getResponseFromGetUrl(Strin
错误是: Unreachable statement in line StringBuffer buffer = new StringBuffer() 这是我的代码: public void
当 StringBuffer 超出容量时,是否会创建一个新的 StringBuffer 对象,还是仍然是旧的? class Test{ public static void main(String[]
1.我对这两者感到困惑,如果有的话,它们有不同的功能吗? StringBuffer(CharSequence chars) 和 StringBuffer(String str) 2。 String 和
阅读本文后 - What does 'synchronized' mean?我仍然无法理解为什么 StringBuffer 在线程安全环境中会比 StringBuilder 慢。 StringBuff
考虑以下代码 final class immudemo { private static final StringBuffer bf = new StringBuffer("Yaxita"
Groovy支持用于创建StringBuilder / StringBuffer的文字语法,而不是通常的语法 def sb = new StringBuilder() 但是,我似乎无法记住(或在Goo
这是我尝试使用数组构建 stringBuffer。我该如何解决这个问题? import java.util.ArrayList; public class StringBufferProj { pub
我对官方 Javadoc 的说法感到困惑 public StringBuffer replace(int start, int end, String str) Replaces the charac
与将所有数组项附加到 StringBuffer 然后打印相比,为什么在循环中打印数组项需要更多时间? 在此,我在循环中打印了数组项。 public static void main (String[]
我目前正在使用很多这样的内容来重构应用程序: StringBuffer buff1 = new StringBuffer(""); buff1.append("some value A"); buff
我有一个简单的函数,用于连接到服务器并将响应作为字符串返回。当返回的数据量较小但响应较大时,它可以正常工作。它不会完整存储服务器返回的响应字符串,并以...结尾。令人惊讶的是,system.out.p
我对编程还很陌生,需要一些帮助。我正在学习如何使用 StringBuffer 类,并且编写了一个简单的代码。但是,当我尝试运行该程序时,我不断收到错误消息“找不到符号”。任何建议都会很棒!谢谢! pu
在ArrayList中,添加操作是摊销操作。因此,在阅读 StringBuffer 时,我想到了为什么 StringBuffer 不进行摊销。假设我对字符串缓冲区对象使用追加操作,那么它应该能够在其底
我正在尝试在字符串中切换 $ 及其右侧的字符。我不允许使用 char[],所以我决定使用 StringBuffer。但是,当我尝试使用 H$E 之类的内容运行代码时,它会输出 HE$H$E 我不知道额
这个问题已经有答案了: Difference between StringBuilder and StringBuffer (33 个回答) 已关闭 9 年前。 很多人都提到过Java中StringB
我正在尝试从InputStream 中读取一些数据,然后将它们放入StringBuffer 中进行打印。 我把这段代码放在main方法中。 我的问题是,只有在调试代码时才打印 StringBuffer
我正在运行此代码: public class testttt { public static void main(String[] args){ ArrayList listOne = new
我有以下代码: public class MyLogger { private StringBuilder logger = new StringBuilder(); public voi
我是一名优秀的程序员,十分优秀!