如何加速自定义对象比较器

时间:2018-04-05 17:21:35

标签: java android performance comparator

我正在尝试为我的播客应用程序排序一个大型对象的arraylist。这是Wear OS应用程序,因此大多数设备比普通的现代Android设备具有更少的内存和处理速度。在播客数量较少的情况下,以正确的顺序加载剧集并不是很明显,但有数百集的剧集最多需要10秒才能进行排序。我怎样才能加快速度呢?

我想在我的sqlite数据库中对剧集进行排序并以正确的顺序保存它们,但所有剧集都存储在自己的表中。我猜我应该将日期保存为毫秒而不是字符串。我想最初会有一种更聪明的方式存储它们,但现在它们只是按照它们在所有用户数据库中找到的顺序。

我该怎么做才能加快这个过程?我应该在后台做这个吗?

public static Comparator<Episode> DateComparator = new Comparator<Episode>() {

    public int compare(Episode episode1, Episode episode2) {
        if (episode1 == null || episode1.getDate() == null) {
            if (episode2 == null || episode2.getDate() == null) {
                return 0;
            }
            return -1;
        } else if (episode2 == null || episode2.getDate() == null) {
            return 1;
        }

        Date date1 = episode1.getDate();
        Date date2 = episode2.getDate();

        return date2.compareTo(date1);
    }

};

public Date getDate() {
    if(this.date != null) {
        try {
            return fdf.parse(this.date);
        } catch (ParseException ex) {
            ex.printStackTrace();
        }
    }
    return null;
}

private FastDateFormat fdf = FastDateFormat.getInstance("EEE MMM dd kk:mm:ss zzz yyyy");

1 个答案:

答案 0 :(得分:2)

避免重复解析日期/时间字符串是这一系列简单改进的一般主题:

  • 创建一个包装类以保存已解析的日期时间值,因为在排序过程中可能会多次访问(比较)每个剧集。
  • 使FastDateFormat.getInstance保持静态,因此只调用一次。
  • 使用日期时间值(长)更新数据库,以便后续访问。
  • 为每个比较消除每个剧集的多次getDate()调用。