Mais um exemplo de que otimizar sem medir geralmente dá merda…

Eis um exemplo da velha-escola. Funções como seno e cosseno são reconhecidas como lentas. Em códigos antigos era comum criar uma tabela contendo seno (ou cosseno) e obter o valor diretamente da tabela via um valor de um ângulo com precisão conhecida. Por exemplo: Suponha que queiramos senos de grau em grau (não em radianos, mas dividindo o circulo trigonométrico em 360 partes). Basta fazer algo assim:

#include <stdlib.h>
#include <math.h>

float sintable[] = {
#include "sin.table"
};

float sin2(int angle)
{
  if (abs(angle) > 360)
    angle %= 360;

  if (angle < 0)
    angle += 360;

  return sintable[angle];
}

Onde o arquivo sin.table é um conjunto de 360 valores em ponto-flutuante, separados por vírgulas, contendo o seno de cada ângulo – de 0° até 359°. O programinha não é difícil de fazer…

O código acima é uma simples consulta a uma tabela com alguma preparação caso o ângulo não esteja dentro da faixa. Nada mais rápido, huh? Pois saiba que a função sinf(), em math.h, gasta cerca de 5 ciclos de clock para calcular o seno… Enquanto essa nossa função gasta de 8 a 10 vezes mais! (No meu teste obtive cerca de 48 ciclos de máquina para sin2()!).

As funções que lidam com ponto-flutuante built-in como seno, cosseno, tangente, floor, ceil, sqrt, são bem mais rápidas do que costumavam ser e, graças ao SSE, elas são instruções para o processador, ao invés de chamadas de funções. A nossa função sofre com o tempo gasto na chamada e no retorno (call/ret tomam tempo) e ainda faz duas comparações antes de obter o dado da tabela.

Então, de novo, o conselho vale: SEMPRE meça a performance de seus códigos!

Anúncios

Deixe um comentário

Faça o login usando um destes métodos para comentar:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s