Итак, я старался максимально оптимизировать свой код. Следующий код, используемый для запуска на 5 секунд, однако мне удалось уменьшить его до примерно 1,4 секунды, однако его все еще недостаточно. Что я могу сделать, чтобы оптимизировать этот код еще больше? (Возможно, я должен упомянуть, что время, о котором я говорил, происходит, когда aux Map заканчивается 170080 ключами).оптимизация java 8 потоков операций
public List<String> getProdutosMaisCompradosQuantidade(int filial, int X){
Map<String, ProdutoFilial> aux;
if(filial==0) {
aux = new HashMap<>(ValoresFixos.CATALOGO_PRODUTOS_TAMANHO_INICIAL);
filiais.stream()
.forEach((f) -> {
Map<String, ProdutoFilial> aux2 = f.getMapProdutosDadosFilialSemEncapsulamento();
aux2.forEach((k,t) -> {
if(t.getQuantidade()>0){
if(aux.containsKey(k)) aux.get(k).atualizarValores(t);
else aux.put(k,t);
}
});
});
}
else aux = filiais.get(filial-1).getMapProdutosDadosFilialSemEncapsulamento();
List<String> list =
aux
.entrySet()
.stream()
.sorted(new ComparadorProdutoQuantidade())
.map(e -> e.getKey()+"\n | o Quantidade: "+e.getValue().getQuantidade()+"; Comprado por "+e.getValue().getNumeroCompradores()+" Clientes Distintos")
.collect(Collectors.toList());
if(X>list.size()) X = list.size();
list.subList(X, list.size()).clear();
return list;
}
Все методы, которые я использую здесь почти O (1) сложность и компаратор не слишком налогообложения либо так, что не должно быть проблемой, есть то, что я не знаю, что может помочь мне оптимизировать этот поток операций? Возможно, можно использовать элемент entrySet, который я использую ...? Потому что это, вероятно, самая дорогая операция здесь ...
EDIT1: Может быть, я должен объяснить идею этого метода. Это главная цель состоит в том, чтобы заказать карту всп и возвращает список с ключами упорядоченными (ключи также изменены, но это не главная цель)
Вы говорите о «заказе» ключей, но 'aux' - это HashMap, и у них нет определенного порядка. Вы думали о том, чтобы распараллелить все, используя, например, 'parallelStream()' вместо 'stream()'? Если вы не забудете синхронизацию 'aux'. – Robert
O (1) только означает, что он не масштабируется с размером ввода. Например, для всех может потребоваться целый год. И для оптимизации нескольких секунд эти постоянные разницы во времени имеют черту различия (а иногда O (что-то большее, чем 1) на практике еще быстрее - обычно массивы и связанные структуры объектов). PS: было бы очень полезно, если бы вы перевели свой код, понимая, насколько валоры и produtos связаны друг с другом, намного легче понять ваш алгоритм или что это значит. – zapl