性能Java写入文件性能
我正试图通过命令行重定向写入文件。 当我读取25MB的文件时,我的程序非常慢,90%的执行时间都花在“System.out.println”上。我尝试了一些系统以外的方法。出来打印但无法修复
我必须使用哪种方法打印一个大的ArrayList?(带重定向)
我会感谢你的帮助和一个例子 谢谢
这是我的密码:
public class Ask0 {
public static void main(String args[]) throws IOException {
int i = 0, token0, token1;
String[] tokens;
List<String> inputList = new ArrayList<>();
Map<Integer, List<Integer>> map = new HashMap<>();
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String input;
while ((input = br.readLine()) != null) {
tokens = input.split("\\|");
inputList.add(tokens[0] + "|" + tokens[1]);
token0 = Integer.parseInt(tokens[0]);
token1 = Integer.parseInt(tokens[1]);
List<Integer> l = map.get(token0);
if (l == null) {
l = new ArrayList<>();
map.put(token0, l);
}
if (l.contains(token1) == false) {
l.add(token1);
}
i++;
}
i = 0;
for (int j = inputList.size(); j > 0; j--) {
tokens = inputList.get(i).split("\\|");
token0 = Integer.parseInt(tokens[0]);
token1 = Integer.parseInt(tokens[1]);
List l = map.get(token0);
System.out.println(tokens[0] + "|" + tokens[1] + "["
+ (l.indexOf(token1) + 1) + "," + l.size() + "]");
i++;
}
}
}
输入
3|78 4|7765 3|82 2|8 4|14 3|78 2|8 4|12
期望的结果
3|78[1,2] 4|7765[1,3] 3|82[2,2] 2|8[1,1] 4|14[2,3] 3|78[1,2] 2|8[1,1] 4|12[3,3]
# 1 楼答案
对于速度,请输入以下代码:
StringBuilder
快速连接成结果String
和快速输出,因为最后只打印一个大的String
,从而节省了不必要的缓冲区刷新李>String
,只在ArrayList
中创建一个小的byte[]
和Integer
李>HashMap<Integer, HashMap<Integer, Integer>>
而不是HashMap<Integer, ArrayList<Integer>>
来节省列表中元素查找的时间(将算法从O(n2)时间转换为O(n)时间)李>某些加速可能无法按您的要求工作:
"1,2,3,4,5,6"
,它仍然可以像"1|2\n3|4\n5|6\n"
一样工作)李>您可以see that it gives the correct results for your test input here(除了像在代码中那样用换行符分隔输出)
如果您想节省内存,也可以手动使用64 kiB
byte[]
输出缓冲区和System.out.write(outputBuffer, 0, bytesToWrite); System.out.flush();
,尽管这需要做很多工作此外,如果您知道将看到的最小值和最大值,那么可以使用
int[]
或int[][]
数组而不是Map<Integer, Integer>
或Map<Integer, Map<Integer, Integer>>
,尽管这也有点复杂。不过,这会非常快