我正在尝试创建一个 Android 应用程序,它可以绘制用户输入的简单数学函数(本质上是一个图形计算器)。每个 onDraw 调用每秒需要数百次算术评估(在屏幕上绘制以生成图形)。当我的代码评估表达式时,程序会大大减慢,当内置方法评估表达式时,应用程序运行没有问题。
根据“LogCat”,垃圾收集大约每秒发生 12 次,每次暂停应用程序大约 15 毫秒,导致每秒冻结数百毫秒。我认为这是问题所在。
这是我的评估器功能的提炼版本。要评估的表达式名为“postfixEquation”,String ArrayList“list”在过程结束时保存最终答案。还有两个名为“digits”和“operators”的字符串数组,它们存储可以使用的数字和符号:
String evaluate(String[] postfixEquation) {
list.clear();
for (int i = 0; i < postfixEquation.length; i++) {
symbol = postfixEquation[i];
// If the first character of our symbol is a digit, our symbol is a numeral
if (Arrays.asList(digits).contains(Character.toString(symbol.charAt(0)))) {
list.add(symbol);
} else if (Arrays.asList(operators).contains(symbol)) {
// There must be at least 2 numerals to operate on
if (list.size() < 2) {
return "Error, Incorrect operator usage.";
}
// Operates on the top two numerals of the list, then removes them
// Adds the answer of the operation to the list
firstItem = Double.parseDouble(list.get(list.size() - 1));
secondItem = Double.parseDouble(list.get(list.size() - 2));
list.remove(list.size() - 1);
list.remove(list.size() - 1);
if (symbol.equals(operators[0])){
list.add( Double.toString(secondItem - firstItem) );
} else if (symbol.equals(operators[1])) {
list.add( Double.toString(secondItem + firstItem) );
} else if (symbol.equals(operators[2])) {
list.add( Double.toString(secondItem * firstItem) );
} else if (symbol.equals(operators[3])) {
if (firstItem != 0) {
list.add( Double.toString(secondItem / firstItem) );
} else {
return "Error, Dividing by 0 is undefined.";
}
} else {
return "Error, Unknown symbol '" + symbol + "'.";
}
}
}
// The list should contain a single item, the final answer
if (list.size() != 1) {
return "Error, " + list has " + list.size() + " items left instead of 1.";
}
// All is fine, return the final answer
return list.get(0);
}
操作中使用的数字都是字符串,因为我不确定是否可以在一个数组中保存多种类型(即字符串和双精度数),因此猖獗的“Double.parseDouble”和“Double.toString”调用。
我将如何减少此处发生的垃圾收集量?
如果有任何帮助,我一直在使用这些步骤来评估我的后缀表达式:http ://scriptasylum.com/tutorials/infix_postfix/algorithms/postfix-evaluation/index.htm 。几个星期以来,我一直无法解决这个问题。任何帮助,将不胜感激。谢谢。