Executando verificação de segurança...
16

Fiz um pequeno benchmark entre BrasilAPI e ViaCEP diretamente

Hoje estava revisando o código de um formulário no trabalho e me perguntei:

“Tá, estou usando o ViaCEP… mas será que a BrasilAPI não é mais rápida?”

Descobri que a BrasilAPI tem fallback: se um provedor falhar, ela tenta outros automaticamente. Fui conferir o código e, de fato, eles fazem isso mesmo ;)

📷 código do brasil api

Então resolvi fazer um teste pra ver a diferença entre os dois...
Bora criar um benchmark 👇


🔬 Código do benchmark:

const cep = "69023003"

async function testar(cep, api) {
  const url =
    api === "viacep"
      ? `https://viacep.com.br/ws/${cep}/json/`
      : `https://brasilapi.com.br/api/cep/v2/${cep}`

  const abort = new AbortController()
  const timeout = setTimeout(() => abort.abort(), 3000)

  const inicio = performance.now()
  try {
    const response = await fetch(url, { signal: abort.signal })
    const fim = performance.now()
    const data = await response.json()
    const tempo = Math.round(fim - inicio)

    return {
      api,
      tempo,
      logradouro: data.logradouro || data.street || "N/A",
    }
  } catch (err) {
    const fim = performance.now()
    return {
      api,
      tempo: Math.round(fim - inicio),
      logradouro: `Erro: ${err.name === "AbortError" ? "Timeout" : err.message}`,
    }
  } finally {
    clearTimeout(timeout)
  }
}

async function rodarTestes() {
  const resultados = []
  const tentativas = 10
  const temposViaCEP = []
  const temposBrasilAPI = []

  for (let i = 0; i < tentativas; i++) {
    const via = await testar(cep, "viacep")
    const brasil = await testar(cep, "brasilapi")
    resultados.push({ tentativa: i + 1, via, brasil })

    if (typeof via.tempo === "number") temposViaCEP.push(via.tempo)
    if (typeof brasil.tempo === "number") temposBrasilAPI.push(brasil.tempo)
  }

  console.table(
    resultados.map((r) => ({
      Tentativa: r.tentativa,
      "ViaCEP (ms)": r.via.tempo,
      "ViaCEP - Logradouro": r.via.logradouro,
      "BrasilAPI (ms)": r.brasil.tempo,
      "BrasilAPI - Logradouro": r.brasil.logradouro,
    }))
  )

  const media = (arr) =>
    arr.length > 0
      ? Math.round(arr.reduce((acc, cur) => acc + cur, 0) / arr.length)
      : "Sem dados"

  console.log("📊 Média de tempos:")
  console.log(`- ViaCEP: ${media(temposViaCEP)} ms`)
  console.log(`- BrasilAPI: ${media(temposBrasilAPI)} ms`)
}

rodarTestes()

✅ Resultado:

📷 teste


🧠 Conclusão:

Aparentemente a BrasilAPI saiu bem melhor no desempenho.
Além disso, se o serviço estiver fora ou se eu exceder o uso no ViaCEP, a BrasilAPI já tenta outros provedores automaticamente, o que torna a solução bem mais robusta.

O que achou?

Bora de Brasil api?

Carregando publicação patrocinada...
3

Bom dia!

Muito interessante a aplicação de um teste de performance realizado por você Fábio! Já mostra sua preocupação em desenvolver software's que sejam resilientes, disponíveis, performáticos e com uma boa experiência, e para isso, é necessário também avaliar o comportamento de API's externas que seu software seja dependente.

Para agregar mais valor para você, por que não tenta amadurecer um pouco o seu conhecimento a respeito e tenta conhecer e compreender ferramentas para teste de performance, carga, estresse, pico, como Grafana K6?

Com essas ferramentas, você consegue gerar relatórios com mais informações, como medianas, médias, máximo, 90percentil, entre outros.

Particularmente, desde minha primeira experiência, a realização do teste de carga, sempre foi relevante para o entendimento do comportamento de uma API e compreensão de seu tempos de resposta. Apesar do BrasilAPI ter um tempo de resposta menor que o de ViaCEP, você já procurou se questionar como ela se comporta em alto volume? Se existe algum rate limiting, se após um número X de requisições a API começa escalar, se após a um número X de requisições a API começa a soluçar (indisponibilidades excepcionais)? Todas essas informações são relevantes na escolha de uma dependência.

Em baixo volume BrasilAPI até pode ser atrativo, pelo tempo de resposta, mas se o seu cenário for 100req/s, será que ela possui o mesmo comportamento? Ou o seu comportamento pode ser menor que o do viacep?

2

Que genial @01daengenharia, já ouvir falar sobre grafana, mas nunca estudei a fundo... vou fazer esse testes. Você citou bons pontos que até então deixei passar por despercebido, obrigado por seu comentário;)

1

Fala Fábio!

O que você já fez é parte do estudo de teste de carga. Você praticamente criou uma ferramenta para realizar testes de performance. É claro que foi uma ferramenta limitada, mas que atendia a sua proposta, e que faz parte do processo também.

Fico feliz que minha contribuição tenha te auxiliado a não deixar passar despercebido alguns pontos, isso vai te fazer ganhar mais visão e maturidade!

Tamo junto, se precisar de ajuda estou disponível.

3
1
2
2

Que bacana! Eu nunca tive essa visão de desempenho, alias, sempre achei a busca lenta e por isso preferi não usar. Mas a API do BrasilAPI realmente parece ser mais completa.

Nos sistemas que usei normalmente colocava um select de UF e outro texto aberto para cidade rs (nada crítico), eu sei que tem lugares que realmente precisam ser algo relacional.

1

Sim kkk, pensei: pera, vou perguntar pro pessoal do TabNews, já que foi criado pelo Felipe Deschamps. Mas aí pensei de novo: pera, pra tirar a prova mesmo, eu preciso testar na prática — e achei o resultado muito massa kkk. Eu entendo, às vezes deixo o campo aberto mesmo