O benefício de desempenho é não ter que reabrir o arquivo depois que o #pragma tiver sido lido. Com os guardas, o compilador precisa abrir o arquivo (que pode ser caro no tempo) para obter as informações que não devem incluir seu conteúdo novamente.
Isso é teoria apenas porque alguns compiladores não abrirão automaticamente arquivos que não continham nenhum código de leitura para cada unidade de compilação.
De qualquer forma, não é o caso de todos os compiladores, então, idealmente, o #pragma deve ser evitado para o código de plataforma cruzada, se não for padrão de todo / não tiver definição e efeito padronizados. No entanto, na prática, é realmente melhor que guardas.
No final, a melhor sugestão que você pode ter para obter a melhor velocidade do seu compilador, sem precisar verificar o comportamento de cada compilador nesse caso, é usar o pragma uma vez e os guardas.
#ifndef NR_TEST_H
#define NR_TEST_H
#pragma once
#include "Thing.h"
namespace MyApp
{
// ...
}
#endif
Dessa forma, você obtém o melhor de ambos (multiplataforma e ajuda na velocidade de compilação).
Como é mais longo para digitar, eu pessoalmente uso uma ferramenta para ajudar a gerar tudo isso de uma maneira muito complicada (Visual Assist X).
#pragma once
parece evitar alguns problemas de exibição de classe no VS 2008. Estou no processo de livrar-me dos protetores de inclusão e substituí-los#pragma once
por esse motivo.