From cf66647a4e7aa2e0186ff1edc70a55a86090b569 Mon Sep 17 00:00:00 2001 From: Soroosh Mariooryad Date: Thu, 29 Jun 2017 16:10:33 -0700 Subject: [PATCH] Sorting search results with TreeSet instead of Collection.sort Benchmarking shows lower sorting latencies with with TreeSet, specially with larger lists: Average Latencies(ms): list size in [0, 115] list size in [40, 115] Collection.sort 39.22 77.57 TreeSet 30.23 52.06 Test: RunSettingsRoboTests Bug: 38197948 Bug: 37312700 Change-Id: I1dd7c77900e8e98e26a8417f2b77582532e1a5f3 --- .../settings/search/SearchResultsAdapter.java | 34 ++++++++++--------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/src/com/android/settings/search/SearchResultsAdapter.java b/src/com/android/settings/search/SearchResultsAdapter.java index a26257f7a0c..ea395b0c0b9 100644 --- a/src/com/android/settings/search/SearchResultsAdapter.java +++ b/src/com/android/settings/search/SearchResultsAdapter.java @@ -45,6 +45,7 @@ import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.TreeSet; public class SearchResultsAdapter extends RecyclerView.Adapter implements SearchResultsRankerCallback { @@ -312,22 +313,23 @@ public class SearchResultsAdapter extends RecyclerView.Adapter int appSize = installedAppResults.size(); final List asyncRankingResults = new ArrayList<>(dbSize + appSize); - List databaseResultsSortedByScores = new ArrayList<>(databaseResults); - Collections.sort(databaseResultsSortedByScores, new Comparator() { - @Override - public int compare(SearchResult o1, SearchResult o2) { - float score1 = getRankingScoreByStableId(o1.stableId); - float score2 = getRankingScoreByStableId(o2.stableId); - if (score1 > score2) { - return -1; - } else if (score1 == score2) { - return 0; - } else { - return 1; - } - } - }); - asyncRankingResults.addAll(databaseResultsSortedByScores); + TreeSet dbResultsSortedByScores = new TreeSet<>( + new Comparator() { + @Override + public int compare(SearchResult o1, SearchResult o2) { + float score1 = getRankingScoreByStableId(o1.stableId); + float score2 = getRankingScoreByStableId(o2.stableId); + if (score1 > score2) { + return -1; + } else if (score1 == score2) { + return 0; + } else { + return 1; + } + } + }); + dbResultsSortedByScores.addAll(databaseResults); + asyncRankingResults.addAll(dbResultsSortedByScores); // App results are not ranked by async ranking and appended at the end of the list. asyncRankingResults.addAll(installedAppResults); return asyncRankingResults;