• Nenhum resultado encontrado

2.5 Otimiza¸c˜ao do algoritmo de enumera¸c˜ao de traces

2.5.3 Compara¸c˜ao de performance

A estrutura original (CS) utilizada por Braga e apresentada na Se¸c˜ao 2.5.1 e a estru- tura de pilha (ST) proposta na Se¸c˜ao 2.5.2 foram avaliadas atrav´es da realiza¸c˜ao de testes para medi¸c˜ao de tempo e consumo de mem´oria.

Utilizando como base o c´odigo fonte original implementado em Java por Braga, implementamos nossa estrutura de modo que ela utilizasse o mesmo conjunto de objetos. Os testes foram realizados em um Intel Pentium 4 HT 3.0 GHz com 2.0 GB de RAM e sistema operacional Ubuntu. Para evitar a influˆencia de opera¸c˜oes de swap na performance dos programas, limitamos a mem´oria m´axima da m´aquina virtual Java em 1.0GB (parˆametro -Xmx1024m). A estrutura CS foi testada com os seus parˆametros padr˜oes.

Permuta¸c˜oes orientadas aleat´orias de n elementos foram criadas (5 ≤ n ≤ 14). Para cada valor de n, criamos permuta¸c˜oes com distˆancias de revers˜ao d1 = ⌈(n + 1)/2⌉, d2 =⌈3n/4⌉ e, d3 = n. Um total de 100 permuta¸c˜oes aleat´orias foram criadas para cada par (n, d). As permuta¸c˜oes criadas possuem n + 1 breakpoints e, portanto, n˜ao possuem adjacˆencias. Isso garante que elas n˜ao podem ser transformadas em permuta¸c˜oes com menor n´umero de elementos.

Como o pacote desenvolvido por Braga n˜ao trabalha com permuta¸c˜oes que pos- suem obst´aculos, as permuta¸c˜oes foram constru´ıdas respeitando este crit´erio. A de- cis˜ao de ignorar obst´aculos baseia-se no fato de que a probabilidade de encontr´a-los em permuta¸c˜oes aleat´orias ´e muito pequena [152].

Cada conjunto de permuta¸c˜oes representado um par (n, d) foi processado com as duas diferentes estruturas. Registramos o tempo total de execu¸c˜ao e valor m´aximo de mem´oria utilizada durante o processamento de cada permuta¸c˜ao. A mem´oria foi mensurada com a utiliza¸c˜ao de uma thread separada que, em tempos regulares, coletava a mem´oria utilizada pela m´aquina virtual Java (Objeto Runtime: m´etodos totalMemory() and freeMemory()).

A Figura 2.6(a) mostra o n´umero m´edio de traces observados em cada um dos conjuntos de 100 permuta¸c˜oes utilizados nos testes. Para um dado valor de n o n´umero de traces que ordenam a permuta¸c˜ao cresce exponencialmente `a medida que a distˆancia de revers˜ao d se aproxima do valor de n.

Para cada par (n, d), as Figuras 2.6(b) e 2.6(c) exibem, respectivamente, a m´edia da mem´oria m´axima utilizada pelas estruturas e a m´edia do tempo total de execu¸c˜ao para processar cada permuta¸c˜ao.

1 10 100 1000 10000 100000 1e+06 1e+07 1e+08 5 6 7 8 9 10 11 12 13 14 Número de traces

(a) Número médio de traces d1 d2 d3 1 10 100 1000 5 6 7 8 9 10 11 12 13 14 Memória em megabytes

(b) Memória máxima utilizada média CS − d1 CS − d2 CS − d3 ST − d1 ST − d2 ST − d3 0.1 1 10 100 1000 10000 100000 1e+06 5 6 7 8 9 10 11 12 13 14 Tempo em segundos

(c) Tempo de execução médio CS − d1 CS − d2 CS − d3 ST − d1 ST − d2 ST − d3

Figura 2.6: As estruturas CS e ST foram testadas com 100 permuta¸c˜oes aleat´orias para cada par (n, d): d1 =⌈(n + 1)/2⌉, d2 =⌈3n/4⌉ e, d3 = n. Os gr´aficos exibem as m´edias dos n´umeros de traces, tempos de execu¸c˜ao e mem´oria utilizada observados em cada conjunto.

Permuta¸c˜oes com distˆancia de revers˜ao d1 s˜ao menos complexas e, por isso, s˜ao mais f´aceis de se ordenar do que permuta¸c˜oes que possuem o mesmo n´umero de elementos n e valores de distˆancia maiores.

Em nossos testes, apesar do aumento do valor de n, o tempo m´edio necess´ario para enumera¸c˜ao dos traces das permuta¸c˜oes com distˆancia de revers˜ao d1 ´e menor do que 1 segundo. Este tempo m´edio aumenta para alguns segundos no caso das permuta¸c˜oes com distˆancia d2 e para algumas horas no caso das permuta¸c˜oes com distˆancia d3. A mesma observa¸c˜ao pode ser feita sobre o consumo de mem´oria que cresce com a complexidade das permuta¸c˜oes.

performance melhor do que a estrutura CS tanto em consumo de mem´oria como em tempo de execu¸c˜ao. Na maioria dos casos, ela apresentou os menores valores para esses dois parˆametros e estes resultados confirmam a vantagem de se manter apenas o ramo que est´a sendo explorado na mem´oria principal.

Atrav´es da redu¸c˜ao do n´umero de objetos que a estrutura tem que gerenciar, eliminamos a penaliza¸c˜ao causada pela escrita e leitura de dados no disco r´ıgido. Por exemplo, quando processamos o conjunto de permuta¸c˜oes (14, 14), a estrutura CS trabalha perto do limite de mem´oria mesmo utilizando o recurso de compacta¸c˜ao e congelamento dos dados n˜ao utilizados. Para o mesmo conjunto de permuta¸c˜oes, a estrutura ST usa 5,53 vezes menos mem´oria e ´e 11,54 vezes mais r´apida do que a estrutura CS.

No estudo de cen´arios evolucion´arios, frequentemente estudamos esp´ecies que s˜ao pr´oximas. Normalmente, esperamos que as permuta¸c˜oes entre elas sejam mais simples do que aquelas que possuem distˆancia de revers˜ao d2 e d3. Assim, decidimos avaliar o consumo de mem´oria e o tempo de execu¸c˜ao apresentado pelas estruturas quando elas s˜ao usadas para processar permuta¸c˜oes menos complexas. Para isso, criamos conjuntos de 100 permuta¸c˜oes aleat´orias com n elementos (5 ≤ n ≤ 35) e d = d1. 1 10 100 1000 5 10 15 20 25 30 35 Memória em megabytes

(a) Memória máxima utilizada média

CS ST 0.1 1 10 100 1000 10000 100000 1e+06 5 10 15 20 25 30 35 Tempo em segundos

(b) Tempo de execução médio

CS ST

Figura 2.7: Mem´oria utilizada e tempo de execu¸c˜ao m´edios das estruturas CS e ST durante o processamento de permuta¸c˜oes de n elementos (5 ≤ n ≤ 35) com distˆancia de revers˜ao d = ⌈(n + 1)/2⌉.

As Figuras 2.7(a) e 2.7(b) mostram a evolu¸c˜ao do consumo de mem´oria e do tempo de execu¸c˜ao de cada estrutura durante o processamento de permuta¸c˜oes de n

elementos e distˆancia de revers˜ao d1. As curvas indicam que a estrutura ST apresenta aumento dos valores destes dois parˆametros em uma taxa menor do que a da estrutura CS.

Para avaliar a evolu¸c˜ao do consumo de mem´oria ao longo do tempo, decidimos avaliar as estruturas utilizando uma permuta¸c˜ao mais complexa constru´ıda com da- dos reais. Para isso, escolhemos duas bact´erias do gˆenero Wolbachia: Wolbachia

endosymbiont of Culex quinquefasciatus e Wolbachia endosymbiont of Drosophila melanogaster . A escolha deste gˆenero justifica-se pelo alto grau de rearranjo dos

genes que as suas bact´erias apresentam [96].

Para construir a permuta¸c˜ao entres as duas bact´erias, realizamos um BLAST rec´ıproco entre as sequˆencias prot´eicas dos genes. Apenas os hits rec´ıprocos que possuiam e-value menor o que 10−6 e cobertura de pelo menos 50% foram consi- derados. Baseado na ordem dos genes selecionados no genoma das duas bact´erias, constru´ımos uma permuta¸c˜ao de 252 elementos e distˆancia de revers˜ao 245.

Uma permuta¸c˜ao com n = 252 e d = 245 exige um tempo muito grande para ser processada. Assim, decidimos avaliar o consumo de mem´oria das estruturas ao longo de 48 horas, anotando os valores de mem´oria utilizada de 15 em 15 segundos. A Figura 2.8 exibe as curvas dos valores obtidos para cada estrutura.

Observando as curvas das estruturas CS e ST na Figura 2.8, podemos ver um padr˜ao interessante. O consumo de mem´oria aumenta e diminui em ondas. Para a estrutura CS, este padr˜ao ´e explicado pelas rotinas de compacta¸c˜ao e descompacta¸c˜ao (ondas menores) e congelamento de dados (onda maior ao final das 48 horas). Para a estrutura ST, este movimento est´a relacionado `a inclus˜ao e remo¸c˜ao de listas de revers˜oes na pilha enquanto o algoritmo explora os ramos da ´arvore de traces. O gr´afico refor¸ca a observa¸c˜ao que a estrutura ST consome menos mem´oria do que a estrutura ST.

Como a permuta¸c˜ao ´e extremamente complexa, ap´os 48 horas de execu¸c˜ao, ne- nhum dos programas produziu algum trace. Contudo, mesmo assim podemos ver vantagem da estrutura ST em rela¸c˜ao `a estrutura CS. Como a estrutura de pilha est´a processando a ´arvore de traces em profundidade, assim que ela chegar ao n´ıvel i = d(π) ela escrever´a uma solu¸c˜ao. A estrutura CS, por sua vez, depende da ex- plora¸c˜ao de todos os n´ıveis antes de escrever o primeiro resultado do processamento. No nosso teste, ap´os 48 horas o programa que usa CS iniciava o processamento do terceiro n´ıvel da ´arvore de traces (a grande redu¸c˜ao de mem´oria ao final das 48 horas refere-se ao congelamento de todos os 2-traces calculados).

1 10 100 1000 10 100 1000 10000 100000 1e+06 Memória em megabytes Tempo em segundos

Evolução do uso de memória

CS ST

Figura 2.8: Evolu¸c˜ao do uso de mem´oria pelas estruturas CS e ST ao longo de 48 horas durante o processamento da permuta¸c˜ao entre as bact´erias Wolbachia endosymbiont

of Culex quinquefasciatus e Wolbachia endosymbiont of Drosophila melanogaster . A

permuta¸c˜ao possui n = 252 e d = 245. Os valores de mem´oria foram coletados de 15 em 15 segundos.