我试图找出为什么我的应用程序的一部分运行速度非常慢。我用过' jmc'超过5分钟并运行我的应用程序的那部分需要这么长时间。 分析方法 - 部分,我发现66%的时间是由于一个函数(内部没有方法调用)。
该方法看起来像这样,大约有400万次:
public DataCell getKNIMECell(int rowIdx) {
if(m_missingFlags.contains(rowIdx))
return DataType.getMissingCell();
switch(m_type) {
case R_LOGICAL:
return BooleanCellFactory.create((boolean)m_data[rowIdx]);
case R_INT:
return IntCellFactory.create((int) m_data[rowIdx]);
case R_DOUBLE:
return DoubleCellFactory.create((double) m_data[rowIdx]);
case R_FACTOR:
case R_STRING:
return StringCellFactory.create((String) m_data[rowIdx]);
default:
}
return null;
}
m_type
是一个类成员,在另一个类中定义了一个枚举,如下所示:
public enum RType { R_DOUBLE, R_LOGICAL, R_INT, R_STRING, R_FACTOR };
数组m_data
的类型为'对象'并有大约400万条目。
m_missingFlag
是ArrayList<Integer>
。
我真的不知道如何加快代码的这一部分。有任何想法吗?正如我所说,该方法中的所有调用都不需要花费很多时间。
答案 0 :(得分:1)
m_missingFlags是一个ArrayList&lt;&gt;
如果列表很大,这可能是你的瓶颈。尝试使用HashSet
。
答案 1 :(得分:0)
我的猜测(我刚刚决定写一个答案,因为评论越来越大)是性能问题是因为大对象数组和调用包含List<Boolean>
缺少标志(我们也不知道是什么列表实现也是如此)。
我解决此问题的方法是
这大致是我会尝试的顺序,但你的里程可能会有所不同,因为我不知道DataCell
是由什么组成的。{/ p>