4

Boa! Adorei essa ideia da 42SP de colocar os alunos para implementarem funções da libc. Dá para aprender muito fazendo isso.

Reparei no seu código que a cada caractere que não for um %, você imprime ele direto em stdout usando ft_putchar_count(). E a cada % você imprime o campo que diz respeito a formatação. Também reparei que números em base hexadecimal são impressos com ft_putnbr_base_unsigned() caractere por caractere.

Isso cria um problema de performance porque cada chamada para write() é consideravelmente lenta.

Uma dica de otimização seria você reduzir o máximo possível o número de chamadas para write(). De preferência, a ft_printf() deveria chamar write() uma vez só na maioria dos casos. Você pode fazer isso criando um buffer interno e gravando a string resultante no buffer ao invés de escrever ela direto em stdout.

Um jeito simples de fazer isso, seria nas funções usadas por ft_printf() não chamarem write() diretamente, mas sim uma função customizada implementando o buffering; vamos chamar de buffered_write() só para ilustrar.

Nessa função, você faria algo como ir gravando as strings no buffer até ele ficar cheio. Se ficar cheio, a função imprime o conteúdo do buffer em stdout, zera o buffer e começa a gravar dados no buffer de novo.

E no fim da sua ft_printf() você invocaria uma função para fazer flush do buffer e garantir que toda a string foi escrita em stdout. Fazer "flush" é pegar o conteúdo restante do buffer e imprimir ele (se houver conteúdo restante).

Se o buffer for grande o suficiente, na grande maioria das chamadas à sua ft_printf() haverá um write() apenas. Isso vai resultar em um enorme ganho de performance.

Se quiser aprender mais sobre otimização, eu já escrevi um artigo ensinando a otimizar software: https://blog.freedev.com.br/mitos-da-otimiza%C3%A7%C3%A3o-de-c%C3%B3digo-31f1b310b0f4

Carregando publicação patrocinada...
1