Recentemente comecei a estudar um pouco sobre problemas de performance com os AMD Ryzen em diversos cenários, principalmente em jogos, e encontrei diversos artigos e documentos apontando que os processadores Ryzen ganham bastante com memórias RAM melhores, diferente dos processadores Intel, que não demonstram se importar muito se você tem memórias mais rápidas ou mais lentas.
Com isso, levantei uma questão, seria melhor uma memória com frequências maiores, ou uma latência menor? Com isso encontrei o seguinte post do Reddit, que mostra como calcular a latência efetiva da memória, com isso em mente, pensei em fazer alguns testes práticos de compilação.
Para isso, compilei um projeto próprio, utilizando:
- Ryzen 5 3600
- 2x8GB Ballistix 2666MHz CL16
- 2x8GB Ballistix 3000MHz CL15
Por engano meu, o primeiro kit que deveria ser 3000MHz, era na verdade de apenas 2666MHz, e desde que havia comprado, estava rodando esse kit a 3000MHz, ficando com 4x8GB 3000MHz CL22, o CL na nomenclatura se refera a CAS Latency, não irei entrar muito a fundo nesses detalhes, mas resumidamente se refere a latência entre a memória receber o comando de READ e os dados estarem disponiveis, quanto menor essa latência, melhor.
No entanto, outro fator importantissimo na performance da memória é a frequencia, quanto maior a frequencia, mais dados ela consegue trafegar entre a memória e a CPU, mas, da mesma forma que uma internet rápida acessando um site no outro lado do mundo vai performar pior que uma internet lenta acessando um site no mesmo estado, uma memória com maior latência demora mais para entregar os dados do que uma com menor latência.
Apesar disso, a latência na memória roda nas casa dos nanosegundos, enquanto a latência da internet roda nas casas dos millisegundos, então a latência do segundo é muito mais perceptivel do que a do primeiro. Mesmo assim, ela importa muito, quando falamos da transferencia bruta dos dados de um ponto ao outro, a diferença não será tão perceptivel, mas quando falamos de rodar centenas ou até milhares de comandos de READ na memória, a latência começa a ficar relevante.
A pergunta final é, ela realmente faz diferença na prática? Vale o sacrifício de largura de banda em troca de menor latência? É isso que veremos.
Resultado dos benchmarks
Nos benchmarks utilizei 3 perfis diferentes de memória, primeiro em overclock para 3000MHz, com as seguintes latências: 22–20–20.
Nas minhas tentativas não consegui valores menores, apesar de também não ter tentado, não tentaria agora, e vocês irão descobrir o motivo.
O segundo perfil foi em default, ou seja, deixei a placa-mãe decidir as latências, a frequência ficou em 2666MHz e as latências em 20–19–19.
O terceiro perfil foi o D.O.C.P. (O XMP da Asus para AMD), onde minha placa-mãe utilizou a frequência e latência especificadas pela Ballistix para o perfil XMP, mas fez isso utilizando as especificações das memórias mais lentas, com frequência em 2666MHz e latências 16–18–18.
Uma nota importante a se fazer, é que, minhas memórias de 3000MHz, com perfil D.O.C.P. rodam com frequência de 3000MHz e latências de 15–16–16, tendo uma diferença de 2 nanossegundos de latência comparado ao perfil D.O.C.P. das minhas memórias de 2666MHz, mas as minhas de 2666MHz não conseguem rodar a 3000MHz com esse mesmo perfil, já que à 2666MHz elas já tem uma latência CAS maior, isso me obriga, por enquanto, a ter que escolher entre ter uma latência menor ou uma banda maior, os dois juntos não pode, por isso fiz este benchmark, para saber o que seria melhor para o meu caso. Pela latência das memórias mais lentas já começar em 16–18–18 e seguindo as latências especificadas pela fabricante, o mínimo que eu conseguiria a 3000MHz provavelmente seria 19–20–20, e eu precisaria de conseguir no mínimo 18–19–19 para conseguir vencer a latência real das memórias à 2666MHz no perfil D.O.C.P, não valeria investir tanto tempo com a configuração e os testes para diminuir menos que 0.1 nanossegundos de latência.
Voltando ao benchmark, temos o seguinte (utilizando a fórmula do reddit para calcular a latência real):
- 2666MHz 20–19–19 (default). Latência de 15ns
- 2666MHz 16–18–18 (D.O.C.P.). Latência de 12ns
- 3000MHz 22–20–20 (O.C). Latência de 14ns
Foram no total 20 execuções, feitas logo após o boot do sistema, com warmup de 3 iterações para fazer cache em memória, e a cada execução o comando cargo clean
foi executado antes da compilação. A escolha da compilação de um projeto Rust foi justamente pelo fato do Rust ser capaz de compilar em multiplos processos, o que garante que ele terá que carregar vários arquivos e trabalhar com dados na memória em diferentes momentos, abaixo estão as médias obtidas:
E os tempos de cada uma das 20 execuções:
Note que mesmo com um warmup antes de executar os benchmarks, feito pela própria ferramenta hyperfine, ainda temos tempos consideráveis na primeira execução, com exceção da compilação com a memória no perfil default, provavelmente nesse caso em especifico o SO foi mais esperto do que nos outros. Interessante também que no primeiro cenário que criei para testes antes de iniciar a bateria real de testes, a mesma tendência pode ser encontrada, veja:
No entando, nesse cenário testei os 3000MHz com o sistema com a memória sob pressão, então aparentemente esse cache não foi feito igual aconteceu nos outros, o que me leva a crer que algum cache a nível de processador tem acontecido na bateria de testes com todas as frequencias e latencias. Outra coisa notada foi que nas últimas execuções, o perfil de overclock performou bem pior do que a sua média, mas segui a mesma linha da performance nas primeiras execuções, o que me leva a crer que o cache foi invalidado.
Ainda assim, os dados mostram que a memória a 3000MHz CL22 ganham da memória 2666MHz no perfil default, sem D.O.C.P., o que faz sentido já que a latência real no overclock é de 14ns, enquanto no perfil padrão é de 15ns.
Abaixo temos as minimas, medias, maximas e o desvio de padrão dos benchmarks:
Não fiquei feliz com apenas estes testes, por isso resolvi fazer mais alguns, agora compilando o projeto Alacritty, então a cada teste reiniciei o meu computador e troquei o perfil de memória na bios, esses foram os resultados:
Conclusão
Em todos benchmarks feitos, houve uma consistência onde os perfis que a memória tem a menor latência real tiveram resultados melhores do que os perfis com latência maior, provando, pelo menos nos cenários apresentados, as vezes pode valer a pena sacrificar largura de banda em detrimento de uma latência menor, até mesmo pois uma frequência maior em overclock pode causar perda de desempenho por erros de memória¹, e pode não valer tanto assim.
¹ Cenário que não foi detectado em nossos benchmarks pois o perfil de overclock foi extensivamente testado e resultou em zero erros de memória, porém pode ocorrer em casos de benchmark feito sem o devido cuidado.
Outro ponto importante é que, o perfil de overclock (3000MHz) tem uma diferença de 2 nanossegundos de latência em comparação ao perfil padrão, mas notamos um ganho de até 1 segundo em overclock na compilação do Alacritty, porém um ganho menor quando a diferença foi de 2 nanossegundos do perfil de overclock para o perfil D.O.C.P., ficando por volta dos 10 segundos, o que ainda é um ganho.
O objetivo principal aqui é mostrar que, não é apenas para a frequência da memória que seus olhos devem brilhar, mas também deve-se notar a latência de memória, quando menor a latência e maior a frequência, melhor. Estamos entrando em um momento onde memórias com 4000MHz irão começar a serem comercializadas muito mais, principalmente devido ao Infinity Fabric da AMD, e pode ser um momento onde você, que pretende comprar essas memória, deve olhar se a latêncial real delas não será maior que a latência das suas memórias atuais.
Nota importante: cada caso deve ser bem avaliado para decidir entre latência e largura de banda, no meu caso em especifico, minhas memórias rodavam em overclock e notei uma perda após instalar os novos pentes de 2666MHz com OC, e um ganho após coloca-las em modo D.O.C.P., cada caso vai depender se o usuário depende mais da latência ou mais da largura de banda, no meu caso a avaliação foi feita justamente para concluir se deixar as memórias em overclock valiam a pena em comparação em deixa-las com D.O.C.P., e a mudança para o perfil da Asus realmente valeu mais a pena do que deixar em overclock, e quis compartilhar os resultados aqui no cenário da programação, para testes de benchmark em jogos recomendo olhar outras fontes, já que em jogos a latência pode não importar tanto.