Pergunta

Uso o SubSonic 2 há cerca de 5 anos e adorei. No entanto, nos últimos seis meses, venho pensando em mudar para o SubSonic 3 ou para uma ferramenta ORM semelhante. Como minha empresa usa várias ferramentas da Telerik, pensei em tentar o OpenAccess. Depois de configurá-lo, decidi tentar uma tarefa extremamente básica de carregar um RadGrid com informações de nossa tabela de usuários (~ 30 registros).

Portanto, dentro do evento OnNeedDataSource do Grid, tenho o seguinte:

var start = System.Environment.TickCount;
context = new EntitiesModel();
rgUsers.DataSource = (from u in context.Users select u);
var stop = System.Environment.TickCount;
var elapsed = stop - start;
litTelerik.Text = string.Format("This process took <b>{0}</b> milliseconds", elapsed);

Depois de construir e executar a página, ele informa que demorou 1.607 ms. No entanto, após atualizar a página, ela retorna como 0 segundos. (Por quê?)

Em seguida, coloco o código SubSonic:

var start = System.Environment.TickCount;
rgUsers.DataSource = new UserCollection().Load();
var stop = System.Environment.TickCount;
var elapsed = stop - start;
litTelerik.Text = string.Format("This process took <b>{0}</b> milliseconds", elapsed);

Eu executei o código pela primeira vez e ele diz que demorou 171 ms. Depois de atualizar a página, ele informa que demorou de 60 a 70 ms.

Então, minha pergunta é: por que o OA leva muito mais tempo para carregar na primeira visita, mas zero segundos para carregar a cada atualização da página? Enquanto o SubSonic é consideravelmente mais rápido na primeira visita, mas leva cerca de 65 ms em cada atualização da página?

Peço desculpas se esta é uma pergunta "básica" ou se não estou testando o desempenho adequadamente. Se houver alguma maneira de melhorar esse método, eu apreciaria muito qualquer conselho.

Obrigado, André

Foi útil?

Solução

OpenAccess possui um objeto Database interno que é criado na primeira vez que você cria um OpenAcccessContext.Ele basicamente calcula todos os padrões, cria caches, inicializa outros objetos de infraestrutura, etc. Assim que é criado, é armazenado em um dicionário estático interno (com o connectionID sendo a chave).

Todos os outros contextos criados usariam esse objeto interno e não teriam sobrecarga alguma.Dito isso, 1600 ms é um pouco alto, você pode considerar alterar o tipo de mapeamento (xml é ideal, em termos de desempenho).

Uma otimização seria certificar-se de que o modelo foi inicializado no manipulador de início do aplicativo.O código a seguir deve resolver o problema.

void Application_Start(object sender, EventArgs e)
{
    var modelInfo = new EntitiesModel().Metadata;
}

EDITAR: Como acompanhamento, diz 0 ms, e esse não é realmente o tempo de execução da consulta.O que a consulta retorna é um IQueryable que é executado posteriormente.Você tem que chamar ToList () para obter dados reais.

Outras dicas

A razão pode ser que a abertura de um banco de dados no OpenAccess leva mais tempo do que no SubSonic.Tente realizar uma operação trivial como obter uma contagem apenas para abrir o banco de dados antes de medir o tempo de carregamento.Faça o mesmo no SubSonic também.

context = new EntitiesModel();
context.Users.Count();
var start = System.Environment.TickCount;
rgUsers.DataSource = (from u in context.Users select u);
var stop = System.Environment.TickCount;
var elapsed = stop - start;
litTelerik.Text = string.Format("This process took <b>{0}</b> milliseconds", elapsed);

Thomas

Não sei se isso está fora do assunto, mas tenho usado e contribuído com SS2 e SS3 nos últimos anos. Acabei de concluir uma revisão e adicionei um MsAccessProvider ao SS2 e geradores Enum ao SS2 e SS3 (eles estão comprometidos e ativos na página do projeto).

Também montei minha própria estrutura de cache para SS3, que permite o cache seletivo automatizado de dados (como dicionários genéricos) de tabelas no banco de dados referenciadas por qualquer índice exclusivo.Consegui armazenar em cache os dados de pesquisa para geração de páginas da web baseada em modelo e melhorar a resposta de cerca de 2 minutos com pesquisas SS3 LINQ para uma fração de segundo.(Eu não lancei isso publicamente)

Só não sei onde postar essas coisas para chamar a atenção dos usuários do SS.Meus compromissos com a origem e o fechamento de questões abertas geraram resposta precisamente zero.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top