Estava lendo um blog aonde o autor fez um método de extensao para o IDataReader.

Ao tentar dar um get em um data reader fazemos:

int inteiro = data_reader.GetInt32(dr.GetOrdinal("coluna"));

O autor fez uma modificação para que apenas seja necessário fazer:

int inteiro = data_reader.GetInt32("coluna");

Para maiores detalhes, leia aqui, Então uns dos usuários do blog comentou que dependendo da quantidade de linhas, realizar dentro de um loop o GetOrdinal pode ser muito custoso, e até mesmo na documentação da MSDN indica-se realizar outra abordagem que seria atribuir a uma variavél o valor do GetOrdinal fora do loop para ser mais eficiente.

Então resolvir eu mesmo fazer o teste, peguei uma tabela com cerca de 27 mil linhas e executei os seguintes comandos.

Versão Tradicional:

DateTime d1 = DateTime.Now;
while (datareader.Read())
{
string s = datareader.GetString(datareader.GetOrdinal("COLUNA1"));
int i = datareader.GetInt16(datareader.GetOrdinal("COLUNA2"));
decimal d = datareader.GetDecimal(datareader.GetOrdinal("COLUNA3"));
int x = datareader.GetInt32(datareader.GetOrdinal("COLUNA4"));
}
DateTime d2 = DateTime.Now;
return d2.Subtract(d1);

O tempo obtido foi de 00.7661760

Versão Eficiente:

DateTime d1 = DateTime.Now;
int a = datareader.GetOrdinal("COLUNA1");
int b = datareader.GetOrdinal("COLUNA2");
int c = datareader.GetOrdinal("COLUNA3");
int e = datareader.GetOrdinal("COLUNA4");

while (datareader.Read())
{
string s = datareader.GetString(a);
int i = datareader.GetInt16(b);
decimal d = datareader.GetDecimal(c);
int x = datareader.GetInt32(e);
}
DateTime d2 = DateTime.Now;
return d2.Subtract(d1);

O tempo obtido foi de 00.7396249

Gráfico:

Pode parecer besteira, mas em termos de máquina nesse intervalo de tempo o computador consegue calcular muitas coisas, então agora já sabem como fazer da próxima vez né? =)

Anúncios