我目前正在使用此代码以二维数组的形式打印所有字符,总共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函数吗?我想编辑一个变量可能比打印快得多。
答案 0 :(得分:0)
由于每个人都在告诉您进行自我测试,因此,我将尝试通过提供一些可用于测试的代码来帮助您。
首先,我们将打印字符矩阵(或您所说的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次)来获得一个大概的想法,使用这种幼稚的方法就可以正常工作。 >
答案 1 :(得分:0)
如果我将所有字符添加到字符串变量中,它将运行得更快吗? 只会有一个println函数吗?
答案为是,它将运行得更快。
但是请不要使用String
,而应使用StringBuilder
,因为如果使用String,它将在String constant pool中创建10,000个文字,这将导致较高的内存利用率,并随着时间的流逝而降低程序速度。并且StringBuilder
append()
方法将消除此问题。
代码:-
char[][] charMap = new char[100][100];
StringBuiler str=new StringBuilder();
for(int i = 0; i < charMap.length; i++)
{
for(int j = 0; j < charMap[0].length; j++)
{
str.append(charMap[i][j]); // System.out.print(String.valueOf(charMap[i][j]));
str.append(" "); // System.out.print(" ");
}
str.append("\n"); //System.out.println("");
}
System.out.println(str); // print created String
它的运行速度比System.out.println
快,因为Java IO的操作比StringBuilder Append昂贵得多。
答案 2 :(得分:-1)
我按照建议进行了速度测试。
import java.util.Scanner;
public class StringSpeedTest
{
public static void main(String[] args)
{
long time1 = 0;
char[][] charMap = new char[100][100];
for(int i = 0; i < charMap.length; i++)
{
for(int j = 0; j < charMap.length; j++)
{
charMap[i][j] = '-';
}
}
long startTime = System.currentTimeMillis();
for(int k = 0; k < 100; k++)
{
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("");
}
}
long endTime = System.currentTimeMillis();
time1 = endTime - startTime;
startTime = System.currentTimeMillis();
for(int k = 0; k < 100; k++)
{
String strToPrint = "";
for(int i = 0; i < charMap.length; i++)
{
for(int j = 0; j < charMap[0].length; j++)
{
strToPrint+=charMap[i][j];
strToPrint+=" ";
}
strToPrint+="\n";
}
System.out.println(strToPrint);
}
endTime = System.currentTimeMillis();
System.out.println("First time: " + time1 + " ms");
System.out.println("Second time: " + (endTime - startTime) + " ms");
Scanner sc = new Scanner(System.in);
sc.nextInt();
}
}
我将代码段循环了100次,这样我可以得到一个很好的平均值。这是结果。
First time: 82110 ms
Second time: 17999 ms
因此,将字符添加到字符串中,然后打印结果大约需要单独打印字符的时间的22%。