NESTE CASO,DIVIDIR RESOLVE?
Boa tarde,Pessoal!
Estou com um problema simples,mais inédito.ao menos
para mim é a primeira vez.
Obs: Visual Studio 2010 (Windows XP)
O problema:
Por motivos diversos,tais como falta de tempo,pressão do chefe,etc...
eu cometi um erro classico. Digo erro, pois eu já havia lido isto em
algum lugar e não dei a devida importância.
[Ô]NUNCA PRESUMA QUE SE SEU SISTEMA FUNCIONA PERFEITO.O MESMO OCORRERÃ
QUANDO FOR SUBMETIDO A UMA CARGA [Ô]REAL[Ô] DOS DADOS[Ô]
Pois bem.Meu sistema ao ser testado com uma BD de [Ô]Teste[Ô], estava excelente. executando um
Algoritmo complexo, com acessos a BD,etc... em 20 minutos. Quando coloquei uma carga de dados real,
passou a precisar de 5 Horas!!!!!
A Idéia que tive:
Agora que já fiz besteira.Pensei numa alternativa:
O software na verdade tem de rodar 4 algoritmos em sequência.Um de cada vez. Cada um
dos algoritmos é demorado,dai o tempo longo para terminar. Pensei então:
E se eu criar 4 executaveis para que cada um rode os algoritmos em separado????
Pergunta:
Se eu rodar portanto ,ao mesmo tempo 4 executáveis (Na mesma máquina), cada um resolvendo um dos algoritmos, isto me permitirá terminar mais rápido???????
Ou levarei o mesmo tempo????
Estou com um problema simples,mais inédito.ao menos
para mim é a primeira vez.
Obs: Visual Studio 2010 (Windows XP)
O problema:
Por motivos diversos,tais como falta de tempo,pressão do chefe,etc...
eu cometi um erro classico. Digo erro, pois eu já havia lido isto em
algum lugar e não dei a devida importância.
[Ô]NUNCA PRESUMA QUE SE SEU SISTEMA FUNCIONA PERFEITO.O MESMO OCORRERÃ
QUANDO FOR SUBMETIDO A UMA CARGA [Ô]REAL[Ô] DOS DADOS[Ô]
Pois bem.Meu sistema ao ser testado com uma BD de [Ô]Teste[Ô], estava excelente. executando um
Algoritmo complexo, com acessos a BD,etc... em 20 minutos. Quando coloquei uma carga de dados real,
passou a precisar de 5 Horas!!!!!
A Idéia que tive:
Agora que já fiz besteira.Pensei numa alternativa:
O software na verdade tem de rodar 4 algoritmos em sequência.Um de cada vez. Cada um
dos algoritmos é demorado,dai o tempo longo para terminar. Pensei então:
E se eu criar 4 executaveis para que cada um rode os algoritmos em separado????
Pergunta:
Se eu rodar portanto ,ao mesmo tempo 4 executáveis (Na mesma máquina), cada um resolvendo um dos algoritmos, isto me permitirá terminar mais rápido???????
Ou levarei o mesmo tempo????
Não é preciso criar um executável para cada algoritimo. Você poderia simplesmente criar uma thread para cada algoritimo.
Se for possivel, poste o codigo de um dos algoritimos pra analisarmos. Talvez consigamos melhorar o desempenho dele pra você.
Se for possivel, poste o codigo de um dos algoritimos pra analisarmos. Talvez consigamos melhorar o desempenho dele pra você.
dê uma olhada no uso de threads.
http://www.macoratti.net/vbn_thrd.htm
http://www.macoratti.net/vbn_thrd.htm
Pessoal,
A idéia das threads é muito boa . Na verdade eu já havia
considerando esta possiblidade. Mas....
De qualquer modo:
Usando threads ou executáveis separados, o fato 'que a 'terei 4 processos rodando
em separado [Ô]na mesma máquina [Ô] ao mesmo tempo.
O que preciso saber é:
Isto é mais rápido do que usar um executável para executar os 4 em sequência????
A idéia das threads é muito boa . Na verdade eu já havia
considerando esta possiblidade. Mas....
De qualquer modo:
Usando threads ou executáveis separados, o fato 'que a 'terei 4 processos rodando
em separado [Ô]na mesma máquina [Ô] ao mesmo tempo.
O que preciso saber é:
Isto é mais rápido do que usar um executável para executar os 4 em sequência????
Bom, aà acho que já depende mais do computador que vai está executando essa tarefa. é multi-processado? Multi-core ... e por aà vai. Tem como rolar um teste?
Esses algoritmos tem que rodar em sequencia ou a ordem de execução deles não importa?
Citação:O software na verdade tem de rodar 4 algoritmos em sequência.Um de cada vez.
Conforme essa afirmação, de nada adianta você ter 4 processos rodando em separado. Pois há a necessidade de a primeira tarefa terminar para que a segunda começe e assim por diante.
No máximo o que você pode fazer é um upgrade em hardware e/ou otimizar esses algoritmos.
Rodar em Threads ou executáveis separados só vai ser mais rápido se você tiver um processador multi-core e apenas se o gargalo ali for o processador, se o gargalo for IO (input/output), o que pode ser acesso a rede, banco de dados, arquivos, entre outras coisas provavelmente não vai fazer diferença ou faça muito pouca diferença.
O que você pode fazer para tentar melhorar o desempenho também é pegar um profiler para saber onde exatamente no seu código demora mais para executar e então tentar otimizar estas partes, mas não é algo simples, você tem que saber o que está fazendo lá para realmente ter algum ganho de desempenho.
Se o gargalo for IO tem pouca coisa que se pode fazer, se for acesso a arquivos ou a banco de dados e este for local você pode tentar colocando todos os arquivos ou o banco de dados em um HD secundário que não seja usado para mais nada, dependendo do caso você deveria usar alguns HDs em RAID 0 para melhorar o desempenho ou HDs SCSI de 10000 rpm, mas se forem muitos arquivos pequenos então o recomendado seria o uso de um HD SSD.
Se for possÃvel você pode também carregar todos os dados na memória antes de começar a executar as rotinas, assim sobraria apenas gravação dos dados.
O que você pode fazer para tentar melhorar o desempenho também é pegar um profiler para saber onde exatamente no seu código demora mais para executar e então tentar otimizar estas partes, mas não é algo simples, você tem que saber o que está fazendo lá para realmente ter algum ganho de desempenho.
Se o gargalo for IO tem pouca coisa que se pode fazer, se for acesso a arquivos ou a banco de dados e este for local você pode tentar colocando todos os arquivos ou o banco de dados em um HD secundário que não seja usado para mais nada, dependendo do caso você deveria usar alguns HDs em RAID 0 para melhorar o desempenho ou HDs SCSI de 10000 rpm, mas se forem muitos arquivos pequenos então o recomendado seria o uso de um HD SSD.
Se for possÃvel você pode também carregar todos os dados na memória antes de começar a executar as rotinas, assim sobraria apenas gravação dos dados.
Caros colegas....
FFCouto e Jaba,
Na verdade a ordem em que eles são executados não faz diferença.
Colega OCELOT,De fato o algoritmo faz durante o processamento,uso frequente de acesso a BD,na rede. Tanto para leitura quanto gravação de dados. Gostei da idéia de carregar todos os dados possÃveis das BD para variáveis,depois processar e só
então exibir. Vou ter que reescrever boa parte do algoritmo,mas creio que é a única coisa que vai realmente melhorar a performance.
FFCouto e Jaba,
Na verdade a ordem em que eles são executados não faz diferença.
Colega OCELOT,De fato o algoritmo faz durante o processamento,uso frequente de acesso a BD,na rede. Tanto para leitura quanto gravação de dados. Gostei da idéia de carregar todos os dados possÃveis das BD para variáveis,depois processar e só
então exibir. Vou ter que reescrever boa parte do algoritmo,mas creio que é a única coisa que vai realmente melhorar a performance.
Se fosse possÃvel rodar o programa no mesmo PC em que o banco de dados está provavelmente seria mais rápido, se não só tenha certeza de rodar o programa em um PC ligado a rede por cabo, WiFi geralmente é mais lento, principalmente se tiver vários dispositivos conectados nele
Isso aqui pode te ajudar
http://www.macoratti.net/12/03/c_oasql.htm
http://www.macoratti.net/09/06/vbn_upc.htm
http://www.macoratti.net/12/03/c_oasql.htm
http://www.macoratti.net/09/06/vbn_upc.htm
Tópico encerrado , respostas não são mais permitidas