【发布时间】:2016-03-10 16:43:23
【问题描述】:
我正在解决spoj 的问题,系统显示我的程序占用了1341M 的内存。当我查看其他语言的提交时,他们需要~3M,这大约少了 400 倍!
我的代码如下:
class Main {
static List<BigInteger> numbers = new ArrayList<>();
static {
BigInteger max = BigInteger.TEN.pow(100);
numbers.add(BigInteger.ONE);
numbers.add(BigInteger.valueOf(2l));
BigInteger last = numbers.get(1);
while (last.compareTo(max) <= 0) {
numbers.add(numbers.get(numbers.size() - 1).add(numbers.get(numbers.size() - 2)));
last = numbers.get(numbers.size() - 1);
}
}
public static void main(String[] args) throws java.lang.Exception {
BufferedReader bi = new BufferedReader(new InputStreamReader(System.in));
String line;
String delims = " ";
while ((line = bi.readLine()) != null) {
StringTokenizer tokenizer = new StringTokenizer(line, delims);
BigInteger from = new BigInteger(tokenizer.nextToken());
BigInteger to = new BigInteger(tokenizer.nextToken());
if (from.equals(BigInteger.ZERO) && to.equals(BigInteger.ZERO)) {
return;
} else {
System.out.println(countInRange(from, to));
}
}
}
public static int countInRange(BigInteger from, BigInteger to) {
int fromIndex = Collections.binarySearch(numbers, from);
fromIndex = fromIndex < 0 ? Math.abs(fromIndex) - 1 : fromIndex;
int toIndex = Collections.binarySearch(numbers, to);
toIndex = toIndex < 0 ? Math.abs(toIndex) - 1 : toIndex + 1;
return toIndex - fromIndex;
}
}
我想BufferedReader 是高内存消耗的原因。在这种情况下是否可以显着改善内存占用?我不是说要达到3M,但至少在100M左右。
【问题讨论】:
-
要重现问题,了解程序的输入是必要的。
标签: java performance memory optimization memory-management