Estou com uma dúvida com relação ao tipo de coleção que deve ser utilizado em uma aplicação.
O cenário é o seguinte:
Quando a aplicação inicia, é realizado uma busca na base de dados sendo que ao final são retornados em torno de 2000 linhas nessa consulta. Cada linha dessa consulta é transformada em um objeto sendo que nesse objeto (ObjetoA) é criado também um atributo que aponta para outro objeto (ObjetoB). Bom essa consulta é realizada uma vez e essas linhas são transformadas em objetos uma vez também, sendo que a alocação de objetos no atributo do ObjetoA vindo da primeira consulta é que acontece constantemente.
Então essa coleção como eu disse ela sofre alterações nos atributos dos seus elementos e não na coleção em si (não são colocados novos elementos por exemplo). A ordenação dos elementos se dá no SQL da consulta por meio de ORDER BY e nada mais (logo não preciso ordenar nada).
Depois disso são realizadas muitas consultas em periodos de tempo bem curtos (na casa dos millisegundos), sendo que enquanto eu tenho uma busca sendo realizada na coleção e posso estar acessando um elemento (ObjetoA) da mesma e alocando um objeto (ObjetoB) ao atributo desse elemento (ObjetoA).
Hoje eu tenho um TreeMap para armazenar os objetos gerados na primeira consulta e fazer uma busca utilizando uma chave do tipo String, mas acho que posso otimizar essa busca. Porém lendo a respeito de collections eu vi que HashSet tem um grande ganho de perfomance em buscas, mas gostaria de ter certeza disso perguntando ao pessoal, até mesmo para saber se a troca de um pelo outro pode acabar resultando em um efeito colateral maior indesejado.
Desde já agradeço a atenção e aguardo opinões a respeito dessa dúvida.
HashSet é muito rapido mesmo, porem ele não guarda objetos duplicados.
Tente fazer uma implementação por Interfaces e ir trocando o tipo das coleções e medindo o tempo delas.
laudenpower
ganondorfan:
HashSet é muito rapido mesmo, porem ele não guarda objetos duplicados.
Tente fazer uma implementação por Interfaces e ir trocando o tipo das coleções e medindo o tempo delas.
Bem lembrando, esqueci de mencionar que a cada linha lida da consulta é gerado um novo objeto e nesse caso não existem objetos iguais na consulta.
Nesse caso outra coisa que preciso fazer são buscas baseados em atributos dos elementos da coleção (tipo o elemento da coleção além de um atributo apontando para outro objeto, possui um atributo código (int) e descrição (String), sendo que hora eu acesso o elemento da coleção pelo código e hora eu acesso pela descrição.
ganondorfan
Então, eu estava com um problema com performance de coleções ha algum tempo atras, o que eu fiz pra resolver foi o seguinte.
Independente do que é documentado sobre elas, o que se percebe é que cada coleção tem uma vantagem e um “calcanhar de Aquiles”, e muitas das vezes o nosso problema em especifico não “casa” exatamente com o proposito de nenhuma das coleções.
Para resolver o impasse e utilizar a melhor solução possivel, desenvolvi metodos que permitissem que eu trocasse as coleções, e comecei a utilizar todas elas e medir o tempo de execução com cada uma, até que encontrei a que melhor sanava o problema.
Aconselho que faça o mesmo.
laudenpower
ganondorfan:
Então, eu estava com um problema com performance de coleções ha algum tempo atras, o que eu fiz pra resolver foi o seguinte.
Independente do que é documentado sobre elas, o que se percebe é que cada coleção tem uma vantagem e um “calcanhar de Aquiles”, e muitas das vezes o nosso problema em especifico não “casa” exatamente com o proposito de nenhuma das coleções.
Para resolver o impasse e utilizar a melhor solução possivel, desenvolvi metodos que permitissem que eu trocasse as coleções, e comecei a utilizar todas elas e medir o tempo de execução com cada uma, até que encontrei a que melhor sanava o problema.
Aconselho que faça o mesmo.
Realizei um teste onde envolvia a comparação entre um HashMap e um TreeMap onde eu fiz uma busca nas duas coleções contendo 2001 elementos onde cada coleção tinha como chave uma String. Nesse caso coloquei essa busca dentro de um for de 10000 interações e no final em 85% dos casos o HashMap foi mais rápido que o TreeMap.
Acho que vou optar pelo HashMap pelo desempenho na busca sem abrir mão de recuperar elementos pela chave.
ganondorfan
Eu tambem acabei por utilizar o HashSet depois que efeituei os testes, no meu caso era so para saber se um valor estava contido na minha coleção, utilizei o metodo contains, e foi cerca de 100 vezes mais rapido doque uma iteração por loop for.
Mas no meu caso eu nao precisava manipular os objetos.
laudenpower
No meu caso já é mais complicado, pois preciso em uma thread acessar um elemento e preencher um atributo dele com outro objeto e em outra thread preciso acessar outro elemento e verificar se o atributo do mesmo não é nulo para dar início a um processamento utilizando o atributo contido no elemento.
No fim das contas eu estava usando TreeMap sem utilizar uma das principais vantagens do mesmo que é a ordenação dos elementos.