Não, sua ideia de calcular a média está correta.
A execução de scripts depende de vários fatores e, no entanto, deve ser dividida entre o tempo de configuração (carregamento do interpretador na memória, configuração e, possivelmente, compilação do código para bytecode ou código de máquina) e verdadeiro tempo de execução.
Para melhor focar no tempo de execução interno, você faz o loop no próprio script (ou seja, em vez de calcular um fatorial, calcula-o 100 vezes em uma execução do script. O script será configurado uma vez e a rotina interna executará 100 vezes).
Para focar no tempo total, você executa o script cem vezes e calcula a média dos resultados. Idealmente, você deve separar essas execuções o suficiente para que o sistema retorne em um "estado de referência" (ou um estado não relacionado a script) todas as vezes. Por exemplo, o próprio intérprete será armazenado em cache na memória, para que a execução primeira do script seja apreciavelmente mais lenta do que as subsequentes.
Para obter uma visão melhor do algoritmo, acho que a melhor maneira é algo assim (em uma máquina inativa):
- envolva o algoritmo em uma única função.
- no aplicativo de controle:
- chama a função uma vez
- obtenha o tempo do sistema ("relógio de parede") e adicione 10 (ou um N razoável) segundos
- insira o loop e comece a contar as iterações
- após cada chamada para a função, incremente o contador
- se a hora do sistema estiver abaixo do tempo economizado, faça outro loop
- obtenha N exato, possivelmente ponto flutuante, do tempo atual do relógio de parede
- exibe o contador dividido por N: esse é o número de iterações / segundo.
O aplicativo só é executado uma vez, toda a configuração e preparação é feita pela primeira iteração de duração indeterminada, portanto, isso deve minimizar as despesas gerais (exceto talvez para a chamada de horário).
Se a função receber uma entrada, você faria bem em fornecer uma sequência aleatória de entradas usando um PRNG semeado com um valor fixo, para assegurar que ambas as versões da função sendo testada recebam os mesmos valores. Isso evita que uma função seja executada aparentemente melhor devido a "números da sorte" (por exemplo, eu me lembro de uma variação do algoritmo Hillsort que teve melhor desempenho se o número de itens a serem classificados estava na forma 2 k -1 com pequenos k s).