Descobri que o relógio usual (), todo mundo recomenda aqui, por algum motivo se desvia muito de uma corrida para outra, mesmo para código estático sem efeitos colaterais, como desenhar na tela ou ler arquivos. Pode ser porque a CPU altera os modos de consumo de energia, OS dando prioridades diferentes, etc ...
Portanto, a única maneira de obter o mesmo resultado sempre de forma confiável com clock () é executar o código medido em um loop várias vezes (por vários minutos), tomando precauções para impedir que o compilador o otimize: os compiladores modernos podem pré-calcular o código sem efeitos colaterais sendo executados em um loop e mova-o para fora do loop., como, por exemplo, usar entrada aleatória para cada iteração.
Depois que amostras suficientes são coletadas em uma matriz, uma classifica essa matriz e pega o elemento do meio, chamado mediana. A mediana é melhor que a média, porque elimina desvios extremos, como, por exemplo, antivírus que ocupam toda a CPU ou OS fazendo alguma atualização.
Aqui está um utilitário simples para medir o desempenho de execução do código C / C ++, com a média dos valores próximos da mediana: https://github.com/saniv/gauge
Ainda estou procurando uma maneira mais rápida e robusta de medir o código. Provavelmente, pode-se tentar executar o código em condições controladas no bare metal sem nenhum sistema operacional, mas isso dará um resultado irreal, porque, na realidade, o sistema operacional se envolve.
O x86 possui esses contadores de desempenho de hardware, que incluem o número real de instruções executadas, mas são difíceis de acessar sem a ajuda do SO, difíceis de interpretar e têm seus próprios problemas ( http://archive.gamedev.net/archive/reference/articles /article213.html ). Ainda assim, eles podem ser úteis para investigar a natureza do gargalo da garrafa (acesso a dados ou cálculos reais nesses dados).