gpt4 book ai didi

android - 算术评估器中的垃圾收集过多

转载 作者:行者123 更新时间:2023-11-29 21:58:23 25 4
gpt4 key购买 nike

我正在尝试创建一个 Android 应用程序来绘制用户输入的简单数学函数(本质上是一个图形计算器)。每个 onDraw 调用每秒需要数百次算术计算(绘制在屏幕上以生成图形)。当我的代码对表达式求值时,程序会显着变慢,而当内置方法对表达式求值时,应用程序可以正常运行。

根据“LogCat”,每秒大约发生 12 次垃圾收集,每次都会使应用暂停大约 15 毫秒,从而导致每秒卡住数百毫秒。我认为这是问题所在。

这是我的求值函数的精简版。要评估的表达式名为“postfixEquation”,字符串 ArrayList“列表”保存过程结束时的最终答案。还有两个名为“数字”和“运算符”的字符串数组,用于存储可以使用的数字和符号:

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 ),因此猖獗的“Double.parseDouble”和“Double.toString”调用.

我将如何减少此处发生的垃圾收集量?

如果有任何帮助,我一直在使用这些步骤来评估我的后缀表达式:http://scriptasylum.com/tutorials/infix_postfix/algorithms/postfix-evaluation/index.htm .几个星期以来,我一直无法解决这个问题。任何帮助,将不胜感激。谢谢。

最佳答案

Java 中紧密循环的规则是不要分配任何东西。您看到如此频繁的 GC 回收这一事实证明了这一点。

您似乎在用 Double 进行计算, 然后转换为 String .不要那样做,这对性能来说很糟糕,因为你创建了大量的字符串然后将它们扔掉(另外你在字符串和 double 之间来回转换很多)。只需维护一个 ArrayDeque<Double>并将其用作堆栈——这也使您免于执行可能也会降低性能的数组大小调整。

预编译输入方程。将所有输入操作转换为enum实例——它们比较起来更快(只需要一个 switch 语句),甚至可以使用更少的内存。如果您需要处理 double ,请使用通用 Object容器和instanceof ,或包含操作 enum 的容器类和一个 double .预编译使您不必在紧密的循环中进行昂贵的测试。

如果您执行这些操作,您的循环应该会正常运行。

关于android - 算术评估器中的垃圾收集过多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12618581/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com