加速java中的一个简单方法

时间:2015-11-20 13:41:55

标签: java performance

我试图找出为什么我的应用程序的一部分运行速度非常慢。我用过' 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的类型为&#39;对象&#39;并有大约400万条目。 m_missingFlagArrayList<Integer>。 我真的不知道如何加快代码的这一部分。有任何想法吗?正如我所说,该方法中的所有调用都不需要花费很多时间。

2 个答案:

答案 0 :(得分:1)

m_missingFlags是一个ArrayList&lt;&gt;

如果列表很大,这可能是你的瓶颈。尝试使用HashSet

答案 1 :(得分:0)

我的猜测(我刚刚决定写一个答案,因为评论越来越大)是性能问题是因为大对象数组和调用包含List<Boolean>缺少标志(我们也不知道是什么列表实现也是如此)。

我解决此问题的方法是

  1. 缓存DataCell(我希望它是不可变的)(即特别是对于布尔值)
  2. 为m_missingFlags使用不同的数据结构(即布隆过滤器或某些树或散列)。
  3. 为每种数据类型创建一个数组(这可以避免一些转换问题,但会花费更多内存)。
  4. 这大致是我会尝试的顺序,但你的里程可能会有所不同,因为我不知道DataCell是由什么组成的。{/ p>