Eficiência não é bem o termo. Claro que é, mas em comparação com o que? Pode ser, sempre, toda linguagem que dá controle total sobre a memória pode ter o máximo de eficiência possível. Pode não ter. Depende do programador. Rust, como C ou C++, entre outras dão as ferramentas, o resto é com o programador.
Dá para escrever código em Rust de forma muito ineficiente. E não é difícil, especialmente nas mãos de alguém mais ingênuo, que nem vai perceber que está fazendo isso. E outros modelos podem ser mais adequados do que se costuma fazer com Rust, dependendo do padrão de uso da memória. Ao contrário da crença popular, um GC pode ser mais eficiente em alguns cenários. E dá para ter o mesmo em Rust, só não é comum que façam isso. Até porque não é tão fácil conseguir isso em uma linguagem não pensada para isso.
Um dos segredos de Rust e outras linguagens do mesmo tipo é que ela incentiva você a colocar os objetos na pilha. Isso cria problemas, mas de fato costuma ser a forma mais eficiente e vale para qualquer linguagem. Algumas não incentivam muito. Quando vai para o heap faz uma diferença muito maior de como cada linguagem trata, e é aí que Rust pode ficar pior se o programador não souber o que está fazendo ou tiver a preguiça de fazer tudo oque é necessário.
O heap facilita muito o gerenciamento de memória, baixando a eficiência.
Ficar alocando e liberando objetos costuma ser um jeito muito ineficiente de usar a memória e pode ser até trágico fazer isso. Se a pessoa não entender muito bem oque está acontecendo ela vai abusar e tornará seu código ineficiente sem perceber. Você pode até economizar mais memória do que uma linguagem que usa GC não determinístico (ou outros podem ser tão ou mais eficientes, dependendo do cenário), mas será mais lento em boa parte dos cenários.
O que Rust tem de inovador em relação à C ou C++, que é a comparação que faz mais sentido (comparando com linguagem com GC eu já falei, a vantagem dela é priorizar a stack), é que ela tem anotações de tempo de vida dando mais garantias de que o objeto está em estado válido na memória e não permite acessar o que já deveria ter sido descartado, coisas que C e C++ permitem, e por isso o programador precisa de muito mais atenção, ou precisa usar uma ferramenta que ajude identificar os problemas de alocação e liberação. C/C++ manda o programador cuidar disso, Rust te avisa que você está, possivelmente, fazendo algo errado. Isso é robustez, mas não é eficiência.
Esse controle sobre o tempo de vida é mais importante para a pilha. No heap tem formas melhores para controlar, por isso existe o Box
e Rc
, mas perde eficiência, especialmente o Arc
costuma ser menos eficiente que um bom garbage collector, principalmente um geracional, em boa parte dos cenários.
O Stack Overflow usa uma linguagem com GC e não tem o problema do Discord. Em geral é uma questão de saber fazer a engenharia correta. Além disso, até onde eu sei, ao contrário do que os criadores dizem, se não mudou nada, os especialistas em GC consideram o que GO usa não muito bom, mas não péssimo também. Não sei se a linguagem possui facilidades para contornar bem a questão das paradas do GC. E não sei bem se ela pode abusar da pilha, como Rust pode, embora pelo que eu entendo, a cultura é abusar do heap.
C# por exemplo permite você abusar da pilha ou do heap, mas se usar a biblioteca padrão abusará do heap, não tem como escapar disso. Em Rust a cultura não é essa.
Faz sentido para você?
Espero ter ajudado.
Farei algo que muitos pedem para aprender a programar corretamente, gratuitamente. Para saber quando, me segue nas suas plataformas preferidas. Quase não as uso, não terá infindas notificações (links aqui).