java - 打印多个字符与打印一个字符串
问题描述
我目前正在使用此代码打印 2D 数组中的所有字符,总共 10,000 个。
char[][] charMap = new char[100][100]
for(int i = 0; i < charMap.length; i++)
{
for(int j = 0; j < charMap[0].length; j++)
{
System.out.print(String.valueOf(charMap[i][j]));
System.out.print(" ");
}
System.out.println("");
}
如果我将所有字符添加到一个字符串变量中,它会运行得更快吗,这样就只有一个 println 函数了?我想编辑变量可能比打印快得多。
解决方案
由于每个人都在告诉您自己测试,因此我将尝试通过提供一些可用于测试的代码来提供帮助。
首先,我们将时间打印字符矩阵(或者您所说的 charMap)。
char[][] charMap = new char[100][100];
long startTime = System.currentTimeMillis();
for(int i = 0; i < charMap.length; i++)
{
for(int j = 0; j < charMap[0].length; j++)
{
System.out.print(charMap[i][j]);
System.out.print(" ");
}
System.out.println("");
}
System.out.println((System.currentTimeMillis() - startTime) + " ms");
然后,我们将使用循环构造一个字符串,然后在最后打印整个字符串。现在,我们将做同样的事情,除了为外循环的每次迭代打印一个字符串。
char[][] charMap = new char[100][100];
long startTime = System.currentTimeMillis();
for(int i = 0; i < charMap.length; i++)
{
StringBuilder sb = new StringBuilder();
for (char c : charMap[i]) {
sb.append(c).append(" "); //since you want the space
}
System.out.println(sb.toString());
}
System.out.println((System.currentTimeMillis() - startTime) + " ms");
自己尝试一下,看看效果如何。
注意:我知道你没有要求这个,但我也很好奇 StringBuilder 的开销。如果您不需要一行中每个元素之间的空间,您可以使用它来代替:
for(int i = 0; i < charMap.length; i++)
{
System.out.println(charMap[i]);
}
编辑:我将自己运行其中一些测试,并且很快就会返回结果。:)
我正在像这样填充我的矩阵:
Random r = new Random();
String a = "abcdefghijklmnopqrstuvwxyz";
for (int i = 0; i < charMap.length; i++)
for (int i1 = 0; i1 < charMap[i].length; i1++)
charMap[i][i1] = a.charAt(r.nextInt(a.length()));
我没有对矩阵的人口进行计时。
好的,所以在第一个实现中,打印出每个索引字符后跟一个空格,我得到平均 110-140 毫秒的眼球。
使用使用 StringBuilder 的第二种方法,我得到平均 14-30 毫秒。
最后,使用省略空格的最后一种方法,我得到平均 3-9 毫秒。
注意:这不是对程序进行基准测试的最佳方法,因为 Java 会执行诸如“延迟加载”类之类的事情。您需要研究适当的基准测试技术才能真正获得性能评估。但是,我怀疑这是否重要,因此使用这种幼稚的方法可以正常工作,只要您运行几次(我每个测试运行 10 次)以获得大致的想法。
推荐阅读
- c# - 无法从抽象 System.Drawing.Image 类派生类
- r - 如何在 R 中使用“显示更多”属性从网站上抓取文本?
- c# - 在 C# try-finally 中如何捕获原始异常
- java - 从 String 的 getchars() 方法创建的 char 数组的最后一个字符更改为不同的字符
- php - Laravel 注册失败且没有错误
- c - 不带参数调用 exit()
- c# - 从多个局部视图收集用户输入数据
- xcode - 如何在将应用程序上传到 App Store 时修复错误“找不到主包”
- python - 尝试在自定义 LearnerCallback 中应用_tfms 时如何修复“后端 CUDA 的预期对象”
- pyqt - 圆边无框窗口的边框问题(pyqt5)