Ответ
DiffUtil работает эффективнее в UI-потоке, если список небольшой (~до 100 элементов). Передача данных между потоками может занять больше времени, чем само вычисление diff.
// Неоптимально для маленьких списков:
viewModelScope.launch(Dispatchers.Default) {
val diffResult = DiffUtil.calculateDiff(MyDiffCallback(oldList, newList))
withContext(Dispatchers.Main) {
adapter.submitList(newList, diffResult)
}
}
// Лучше для малых списков:
val diffResult = DiffUtil.calculateDiff(MyDiffCallback(oldList, newList))
adapter.submitList(newList, diffResult)
Для больших списков (>1000 элементов) DiffUtil стоит выносить в фоновый поток.