Artigo

Go Tech

Testes de performance do Core Data sobre SQLite – Parte 2

22julho

Dando seqüência ao último post, Testes de performance do Core Data sobre SQLite – Parte 1, no qual introduzimos o Core Data e definimos o ambiente de testes, agora iniciaremos a apresentação dos resultados desta análise.

Assim como definido anteriormente, este teste mostrará o desempenho em 4 situações (veja detalhes no post anterior):

  1. Inserções sem relacionamentos;
  2. Inserções com relacionamentos;
  3. Buscas sem relacionamentos;
  4. Buscas com relacionamentos.

Este post cobrirá as 2 primeiras situações (inserções).

1. Inserções sem relacionamentos

Este teste tenta executar 10000 comandos inserts de 5 formas diferentes:

  • Tamanho do lote: 1; Repetições: 10000;
  • Tamanho do lote: 10; Repetições: 1000;
  • Tamanho do lote: 100; Repetições: 100;
  • Tamanho do lote: 1000; Repetições: 10;
  • Tamanho do lote: 10000; Repetições: 1;

Os resultados foram os seguintes:

a) Tamanho do lote: 1; Repetições: 10000

mín 0,037017 s
máx 0,571604 s
média 0,047213 s
total 417,3 s

Como podemos ver no gráfico, temos uma pequena variação entre o tempo das inserções. Embora o valor máximo do gráfico seja 0,57 segundos, a média (0,047 s) foi bem mais próxima do valor mínimo (0,037 s). Também, podemos ver que o tempo necessário para uma inserções não muda significantemente enquanto a tabela aumenta.

b) Tamanho do lote: 10; Repetições: 1000

mín 0,051545 s
máx 1,592167 s
média 0,077328 s
total 77,3 s

Este caso nos mostrou que, aumentando o tamanho do lote para 10 precisamos, em média, de cerca de 1,64 vezes mais tempo para executar este lote. Assim, podemos imaginar que é muito melhor executar um lote grande do que vários lotes pequenos. O teste também nos mostrou que para inserir 10000 registros com tamanho de lote de 10 precisamos de 77,3 segundos, enquanto com tamanho de lote de 1, para inserir 10000 registros precisamos de 417,3 segundos.

c) Tamanho de lote: 100; Repetições: 100

mín 0,221817 s
máx 0,733436 s
média 0,276504 s
total 27,7 s

Novamente, aumentando o tamanho de lote, agora para 100, precisamos de cerca de 3,6 mais tempo por lote do que precisamos com tamanho de lote de 10. Assim, podemos deduzir que o tempo por lote não aumenta linearmente com o tamanho de lote. Mas novamente, o tempo total para executar os 10000 inserts diminuiu (27 s contra 77 s).

d) Tamanho de lote: 1000; Repetições: 10

mín 2,341496 s
máx 2,895445 s
média 2,522845 s
total 25,2 s

Novamente, o mesmo aconteceu. Com o aumento do tamanho de lote para 1000 precisamos de 9,1 vezes mais tempo do que com tamanho de lote de 100. O tempo total foi melhor que o anterior, mas quase o mesmo (25 s contra 27).

e) Tamanho de lote: 10000; Repetições: 1 (10 repetições com banco vazio)

mín 19,171194 s
máx 24,020913 s
média 22,2 s

Desta vez, aumentando o tamanho de lote para 10000 precisamos de 8 vezes mais tempo do que com tamanho de lote de 1000, enquanto poderíamos imaginar que precisaríamos de mais de 9,1 vezes. Assim, levamos somente 22 s para executar os 10000 inserts.

Conclusão

Estes testes resultaram na seguinte tabela:

Teste Tempo médio por lote Tempo Total
a t1 ou 0,047213 s t2 ou 417,3 s
b 1,83 x t1 ou 0,077328 s t2/5,40 ou 77,3 s
c 5,86 x t1 ou 0,276504 s t2/0,066 ou 27,7 s
d 53,68 x t1 ou 2,523 s t2/0.060 ou 25,2 s
e 470,34 x t1 ou 22,2 s t2/0,053 ou 22,2 s

Como podemos ver, para inserções simples (sem relacionamentos) quando aumentamos o tamanho do lote o tempo para executá-lo é maior, mas, o tempo total é menor. Assim, quando usando o Core Data, sempre que possível devemos salvar dados em lotes grandes.

2. Inserções com relacionamentos

Este teste mostra como o tempo para executar uma inserção aumenta com o aumento do número de relacionamentos (em cada inserção) e de linhas da tabela. O número de relacionamentos varia de 0 até 3.

a) Quantidade de relacionamentos: 0

mín 0,053622 s
máx 0,626013 s
média 0,068631 s
total 137,3 s

Como este teste não contém relacionamentos, o resultado é o mesmo do teste anterior.

b) Quantidade de relacionamentos: 1

mín 0,617910 s
máx 0,353416 s
média 0,080156 s
total 160,3 s

Como seria esperado, com um relacionamento o tempo médio de inserção foi 1,17 vezes maior do que sem inserções.

c) Quantidade de relacionamentos: 2

mín 0,078214 s
máx 0,559592 s
média 0,109143 s
total 218,3 s

Com 2 relacionamentos precisamos de ainda mais tempo para processar cada inserção: 1,37 vezes mais do que com 1 relacionamento. Também, podemos ver que parece que, enquanto a o banco de dados aumenta, leva mais tempo para executar cada insert.

d) Quantidade de relacionamentos: 3

mín 0,093524 s
máx 0,650233 s
média 0,135843 s
total 271,7 s

Com 3 relacionamentos o tempo médio foi ainda pior: 1,244 vezes mais que com 2 relacionamentos.

Conclusão

A seguinte tabela resulta dos testes realizados:

Teste Tempo médio Tempo total
a t1 ou 0,068631 s t2 ou 137,3 s
b 1,17 x t1 ou 0,080156 s 1,17 x t2 ou 160,3 s
c 1,59 x t1 ou 0,109143 s 1,59 x t2 ou 218,3 s
d 1,99 x t1 ou 0,135843 s 1,99 x t2 ou 271,7 s

Como podemos ver, com o aumento do número de relacionamentos o tempo médio de inserção também aumenta. Este aumento não é linear.

O próximo post apresentará nossos resultados e conclusões para seleções no Core Data, acompanhe!

Este post também está disponível em inglês: Core Data over SQLite Performance Tests – Part 2

, ,

Deixe um comentário

Você precisa estar logado para comentar.