Ordenação de arrays em Swift: testes de desempenho chocantes

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Swift Beta Performance: Ordenação de arrays — o que deu errado?

\n\n

Se você já visitou o Stack Overflow na época das primeiras versões beta do Swift, certamente se lembra da pergunta lendária que reuniu milhares de visualizações e centenas de comentários. Ela soava mais ou menos assim: "Por que a ordenação de arrays no Swift Beta é 100 vezes mais lenta do que no Objective-C?"

\n\n

Naquela época, em 2014, foi um verdadeiro choque para a comunidade iOS. Desenvolvedores, acostumados com a ordenação relâmpago no Objective-C, de repente viram seus aplicativos travarem do nada. Hoje, anos depois, podemos analisar esse problema com calma: entender exatamente o que causava a lentidão, como o Swift evoluiu e, principalmente, como ordenar arrays corretamente no Swift moderno para não repetir os erros do passado.

\n\n

Neste artigo, não vamos apenas recontar um bug antigo. Vamos realizar nossos próprios testes, escrever código e descobrir quais algoritmos de ordenação em Swift são realmente rápidos e quais são uma armadilha para iniciantes. Vamos nessa!

\n\n

Breve histórico: o que aconteceu no Swift Beta?

\n\n

Na primeira versão beta do Swift, a ordenação de um array de 100.000 números inteiros podia levar até 20 segundos. No Objective-C, a mesma operação era executada em 0,2 segundos. Uma diferença de 100 vezes! A razão estava no fato de que o Swift inicial usava uma implementação ineficiente do algoritmo de ordenação (Introsort com má escolha do elemento pivô), além de ter problemas de otimização ao compilar sem flags de otimização (-O).

\n\n

Além disso, na versão beta, o mecanismo de verificação dinâmica de limites (bounds checking) era acionado com frequência para cada acesso ao array, adicionando uma enorme sobrecarga. A conclusão era simples: o Swift era imaturo, mas o potencial era enorme.

\n\n

Como ordenar arrays em Swift hoje? Melhores práticas

\n\n

O Swift moderno (versões 5.x e superiores) é uma linguagem madura. A ordenação de arrays tornou-se não apenas rápida, mas uma das mais rápidas entre as linguagens mainstream. Vamos analisar os principais métodos.

\n\n

1. Método nativo sort() — o padrão ouro

\n\n

A maneira mais simples e recomendada é usar o método sort() (ordenação in-place) ou sorted() (retorna um novo array ordenado).

\n\n
import Foundation\n\nvar numbers = [5, 3, 8, 1, 9, 2]\nnumbers.sort() // ordenação in-place\nprint(numbers) // [1, 2, 3, 5, 8, 9]\n\nlet sortedNumbers = numbers.sorted() // retorna um novo array\nprint(sortedNumbers) // [1, 2, 3, 5, 8, 9]
\n\n

Internamente, o sort() usa TimSort — um algoritmo híbrido que opera em O(n log n) na média e O(n) em dados quase ordenados. É o mesmo algoritmo usado em Python e Java. Ele é excelentemente otimizado para processadores modernos.

\n\n

2. Ordenação com closure: customização

\n\n

Se você precisar ordenar um array em ordem decrescente ou por um critério complexo, use um closure:

\n\n
let words = ["maçã", "laranja", "banana", "kiwi"]\nlet sortedByLength = words.sorted { $0.count < $1.count }\nprint(sortedByLength) // ["kiwi", "maçã", "banana", "laranja"]\n\nlet descendingNumbers = numbers.sorted(by: >)\nprint(descendingNumbers) // [9, 8, 5, 3, 2, 1]
\n\n

Importante: o closure deve ser uma função pura (pure function) — sem efeitos colaterais. Caso contrário, você corre o risco de obter comportamento imprevisível e queda de desempenho.

\n\n

3. Ordenação de estruturas personalizadas

\n\n

Ao trabalhar com seus próprios tipos de dados, o melhor é implementar o protocolo Comparable. Isso permitirá usar sort() sem closure.

\n\n
struct Person: Comparable {\n    let name: String\n    let age: Int\n\n    static func < (lhs: Person, rhs: Person) -> Bool {\n        return lhs.age < rhs.age // ordenar por idade\n    }\n}\n\nle                

Blogs

Book Recommendations