Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Back End Performático - CPGoiás 2019

4ce43cd2535d0afe50065a743af646e9?s=47 Diana Arnos
September 06, 2019

Back End Performático - CPGoiás 2019

Apresentada durante o PHPWeekend 2019 (https://brasil.campus-party.org/campus-party-goias/)

Trabalhar a performance no backend vai muito além de simplesmente "subir mais máquinas".
Vamos apontar alguns gargalos comuns que podem ser tratados ou evitados desde o começo do desenvolvimento, já que não dependem da tecnologia utilizada.

4ce43cd2535d0afe50065a743af646e9?s=128

Diana Arnos

September 06, 2019
Tweet

Transcript

  1. Backend Performático Além do “aumenta a máquina lá”

  2. @dianaarnos Dev, Sec, Music, Kung Fu. Dev / Arquiteta @

    Senhasegura Evangelista @ PHPSP Evangelista @ PHPWomenBR
  3. ERA UMA VEZ UMA APLICAÇÃO WEB...

  4. None
  5. None
  6. None
  7. None
  8. None
  9. None
  10. None
  11. ENTÃO, UM DIA...

  12. - CARA, A RESPOSTA TÁ MEIO LENTA...

  13. - AUMENTA A MÁQUINA LÁ

  14. - AUMENTA A MÁQUINA LÁ a.k.a.: escalonamento vertical

  15. None
  16. None
  17. - AINDA TÁ MEIO LENTO...

  18. - BOTA MAIS MÁQUINA LÁ

  19. - BOTA MAIS MÁQUINA LÁ a.k.a.: escalonamento horizontal

  20. None
  21. LOAD BALANCER

  22. E NUNCA MAIS TIVERAM PROBLEMAS.

  23. None
  24. SERÁ?

  25. E VOCÊ, DEV?

  26. E VOCÊ, DEV? JÁ ANALISOU O SEU CÓDIGO?

  27. BANCO DE DADOS

  28. None
  29. None
  30. DE QUAIS TABELAS VOCÊ PRECISA?

  31. COMO AS TABELAS ESTÃO ESTRUTURADAS?

  32. COMO VOCÊ FAZ AS QUERIES?

  33. MUITOS JOINS?

  34. MUITOS JOINS? ÚNICO GRANDE INSERT OU VÁRIOS PEQUENOS INSERTS?

  35. MUITOS JOINS? ÚNICO GRANDE INSERT OU VÁRIOS PEQUENOS INSERTS? QUANTAS

    REQUISIÇÕES AO BANCO POR MINUTO?
  36. PREPARED STATEMENT

  37. $query = "SELECT * FROM usuarios WHERE " . "username

    = :usuario OR username = administrador"; $stmt->bindValue(":usuario", $username); $stmt->bindValue(":administrador", "admin");
  38. $query = "SELECT * FROM usuarios WHERE " . "username

    = :usuario OR username = administrador"; $stmt->bindValue(":usuario", $username); $stmt->bindValue(":administrador", "admin");
  39. $query = "SELECT * FROM usuarios WHERE " . "username

    = :usuario OR username = administrador"; $stmt->bindValue(":usuario", $username); $stmt->bindValue(":administrador", "admin");
  40. $query = "SELECT * FROM usuarios WHERE " . "username

    = :usuario OR username = administrador"; $stmt->bindValue(":usuario", $username); $stmt->bindValue(":administrador", "admin");
  41. CACHE

  42. O QUÊ?

  43. - BUSCAS FREQUENTES NO BANCO

  44. - BUSCAS FREQUENTES NO BANCO - OBJETOS

  45. - BUSCAS FREQUENTES NO BANCO - OBJETOS - RESPONSES INTEIRAS

  46. COMO/ONDE?

  47. - MEMÓRIA

  48. - MEMÓRIA - SERVIÇO (EX. REDIS)

  49. - MEMÓRIA - SERVIÇO (EX. REDIS) - DISCO

  50. CUIDADO

  51. O “O QUÊ” É TÃO IMPORTANTE QUANTO O “COMO”

  52. None
  53. COMO VAI O SEU CÓDIGO?

  54. COMO VAI O SEU CÓDIGO? SUA LÓGICA?

  55. COMO VAI O SEU CÓDIGO? SUA LÓGICA? SEUS ALGORITMOS?

  56. BIG O

  57. FIBONACCI

  58. FIBONACCI public function getFibonacci (int $number): int { if ($number

    <= 1) { return $number; } else { return getFibonacci($number - 1) + getFibonacci($number - 2); } }
  59. FIBONACCI Quantas linhas de código vão rodar para dado input

    n? T(n)? T(0) = 2 T(1) = 2 T(2) = 3 + T(1) + T(0) T(3) = 3 + T(2) + T(1) T(4) = 3 + T(3) + T(2) ... Observando a progressão, temos: Dado n = 0 ou n =1, T(n) = 2
  60. FIBONACCI

  61. FIBONACCI Com o processamento de 1GHz, levaríamos aproximadamente 56 mil

    anos para calcular T(100)
  62. FIBONACCI

  63. FIBONACCI 0, 1, 1, 2, 3, 5, 8, 13, 21...

    0 + 1 = 1 0, 1, 1 1 + 1 = 2 0, 1, 1, 2 1 + 2 = 3 0, 1, 1, 2, 3 2 + 3 = 5 0, 1, 1, 2, 3, 5 3 + 5 = 8 0, 1, 1, 2, 3, 5, 8 ...
  64. FIBONACCI public function getFibonacci (int $number): int { $fibonacci[0] =

    0; $fibonacci[1] = 1; for ($i = 2; $i <= $number; $i++) { $fibonacci[$i] = $fibonacci[$i-1] + $fibonacci[$i-2]; } return $fibonacci[$number]; }
  65. FIBONACCI Calculando quantas linhas de código rodam para cada iteração,

    considerando que as 3 primeiras linhas e a última (return) vão rodar sempre: T(2) = 4 + 2 = 6 T(3) = 4 + 2 + 2 = 8 T(4) = 4 + 2 + 2 + 2 = 10 ... T(n) = 2n + 2
  66. MUITO MAIS RÁPIDO

  67. E LEMBREM-SE:

  68. None
  69. None
  70. OBRIGADA! Fale comigo: @dianaarnos (twitter, instagram, github)