Pergunta

Eu tenho um cálculo gama bastante caro (SpectralResponse) que eu gosto de manter ao mínimo. Imaginei que a melhor maneira é armazená-los e trazê-lo de volta ao mesma matriz é necessária novamente no futuro. A decisão é feita usando BasicParameters.

Então, agora, eu uso um LinkedList de objeto para as matrizes de SpectralResponse, e outro LinkedList para o BasicParameter. E os BasicParameters tem um método isParamsEqualTo (BasicParameters) para comparar o conjunto de parâmetros.

LinkedList<SpectralResponse> responses
LinkedList<BasicParameters> fitParams
LinkedList<Integer> responseNumbers

Assim, para olhar para cima, eu só percorrer a lista de BasicParameters, verifique se há jogo, se combinados, devolver o SpectralResponse. Se nenhuma correspondência, em seguida, calcular o SpectralResponse.

Aqui está é o laço for que eu usei para procurar.

size: LinkedList size, limited to a reasonable value
responseNumber: just another variable to distinguish the SpectralResponse.

    for ( i = size-1; i > 0 ; i--) {
        if (responseNumbers.get(i) == responseNum)
        {
            tempFit = fitParams.get(i);
            if (tempFit.isParamsEqualTo(fit))
            {
                return responses.get(i);
            }
        }
    }

Mas de alguma forma, fazê-lo desta forma, não só levar a muita memória, é realmente mais lento do que apenas calcular SpectralResponse reta. Muito mais lento.

Por isso, é minha implementação que está errado, ou eu estava equivocada de que pré-cálculo e pesquisa é mais rápido?

Foi útil?

Solução

Você está acessando uma LinkedList pelo índice, esta é a pior maneira possível acessá-lo;)

Você deve usar ArrayList em vez, ou iterators de uso para todas as suas listas.

Possivelmente você deve mesclar as três objetos em um, e mantê-los em um mapa com responseNum como chave.

Espero que isso ajude!

Outras dicas

Você provavelmente deve usar um tipo de matriz (uma matriz real, como Vector, ArrayList), listas não vinculadas. listas ligadas é melhor para pilha ou operação fila, não indexação (uma vez que você tem que atravessá-lo de uma ponta). Vector é uma matriz de redimensionamento automático, wich tem menos sobrecarga no acesso inexes.

Os métodos get (i) de LinkedList exigem que buscar cada item que tem de ir mais longe e mais ao longo da lista. Considere o uso de um método ArrayList, a iteração (), ou apenas uma matriz.

A segunda linha, 'if (responseNumbers.get(i) == responseNum)' também será ineficiente como o responseNumbers.get(i) é um inteiro, e tem que ser unboxed para um int (Java 5 em diante faz isso automaticamente, seu código não compilar em Java 1.4 ou mais cedo se responseNum é declarada como um int). Consulte este para obter mais informações sobre boxe.

Para remover essa sobrecarga unboxing, use um IntList da biblioteca primitivas apache. Esta biblioteca contém colecções que armazenam os objectos subjacentes (ints no seu caso) como uma matriz primitivo (por exemplo int []) em vez de uma matriz de objectos. Isto significa que não boxe é necessária como os métodos do IntList retornar tipos primitivos, não inteiros.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top