Otimizar operação matematica no clipper

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

Avatar do usuário
ANDRIL
Usuário Nível 5
Usuário Nível 5
Mensagens: 1297
Registrado em: 06 Jul 2004 00:44
Contato:

Otimizar operação matematica no clipper

Mensagem por ANDRIL »

Pessoal, estou fazendo um teste simples:

inicio=1
fim=100000

Código: Selecionar todos

do while inicio<=fim
    @00,00 say inicio
    inicio++
enddo

Ocorre que no inicio, mais ou menos até 10.000 vai rapido e começa durante o loop ficar mais lento. Esta lentidao tem como resolvê-la? Tem alguma lib que faça o processador trabalhar mais rapido no calculo de variaveis.

Notei que conforme o valor de inicio se torna maior, mais lento o calculo fica.

Ate+
Clipper 5.2e / Blinker 5.1 / Harbour 3.2 / GTwvg
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Re: Otimizar operação matematica no clipper

Mensagem por Maligno »

Esse código executa dentro de uma máquina virtual que interpreta os opCodes. Acho que a cada iteração o cálculo pode estar sendo reinterpretado. A falta dessa otimização explicaria a lentidão exagerada. Sua necessidade é só com inteiros? Acho que internamente todos os cálculo numéricos são tratados como ponto flutuante, o que é um agravante.

A solução seria uma biblioteca matemática que lide com cálculos de inteiros e que seja feita em C ou Assembly. Ou fazer uma função pra isso. Ou, dependendo da aplicação, criar uma tabela de constantes com valores pré-calculados. Aliás, isso não é incomum.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Avatar do usuário
ANDRIL
Usuário Nível 5
Usuário Nível 5
Mensagens: 1297
Registrado em: 06 Jul 2004 00:44
Contato:

Re: Otimizar operação matematica no clipper

Mensagem por ANDRIL »

Compilei o mesmo exemplo em xharbour pra ficar 32bits e para minha surpresa ficou 3x mais lento. Imaginei que fosse ocorrer o contrário.

Se tivesse um modo de limpar o overhead durante o ciclo, acho que resolveria. Coloquei memory(-1) em alguns pontos, mais nao surtil efeito nenhum.

Já criei constantes, mais tbem nao resolveu!

Vou continuar tentando, se alguem tiver alguma ideia, agradeço.


Ate+,
Clipper 5.2e / Blinker 5.1 / Harbour 3.2 / GTwvg
Adalberto
Usuário Nível 3
Usuário Nível 3
Mensagens: 343
Registrado em: 01 Set 2007 01:09
Localização: Santa Cruz de la Sierra - Bolivia

Re: Otimizar operação matematica no clipper

Mensagem por Adalberto »

Ola Andril,

Fiz uma copia de seu código, compilei assim:

Clipper Prueba
Blinker Fi Prueba

Logo o executei e finalizou em menos de um segundo, como e que você vê a demora?, Precisa mais rápido de milésimas de segundo?

Testei com inicio:= 1 e Fim:= 1000000 // um milhão
Executou em menos de 3 (três) segundos.

Um abraço
Avatar do usuário
ANDRIL
Usuário Nível 5
Usuário Nível 5
Mensagens: 1297
Registrado em: 06 Jul 2004 00:44
Contato:

Re: Otimizar operação matematica no clipper

Mensagem por ANDRIL »

Adalberto, tambem obtive o mesmo resultado que vc. Após perder um dia inteiro em uma única função (logaritimo) acabei por achar a tal "demora". Nada tinha a haver com o processador, e sim, com o próprio fluxo do logaritimo matemático, ou seja, a demora esta "correta".

Agradeço a ajuda de todos.

Ate+
Clipper 5.2e / Blinker 5.1 / Harbour 3.2 / GTwvg
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Otimizar operação matematica no clipper

Mensagem por Pablo César »

Olha pessoal, eu tenho a "intuição" de um druida que talvez essa operação fose feita de algum outro modo, muito possível em C e não em Clipper. O que eu acho que talvez essa operação venha a sofrer demora por causa da alocação do conteúdo numa área distante ao acesso a ULA (unidade Lógica Aritmérica) que a faz atraves da UC (Unidade de Controle) e que os Registradores (pequenas memórias que auxiliam o processador) estariam não tendo o acesso de tais endereço de forma não tão direta quanto poderia. Isto é, os registradores estaria copiando tais resultados (obtido da ULA) para a memória principal (RAM) através da UC (unidade de controle). Talvez falei chinês, nem eu mesmo entendo direito... hihihi

Ja ouví falar de bibliotecas para finalidades matemáticas, talvez seja este o caminho ou então escolher outro tipo de processador... talvez um que seja mais específico para cálculo matemáticos...

Desculpem se falei besteira, mas tem uma certa lógica. É questão também de entender como trabalham os componentes de um computador.
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Re: Otimizar operação matematica no clipper

Mensagem por Maligno »

Pablo César escreveu:Ja ouví falar de bibliotecas para finalidades matemáticas, talvez seja este o caminho
Para alguns tipos de cálculos avançados esse é o único caminho. Mas imagino que o que o OP precisa não chega a tanto. Estou só supondo.
ou então escolher outro tipo de processador... talvez um que seja mais específico para cálculo matemáticos...
Se fosse nos tempos do guaraná com rolha, até diria que seria o caso de instalar um co-processador. Antes ele não existia por default. Era comprado à parte. Se não tivesse, o código de emulação entrava em ação sempre que o processador encontrava uma instrução de co-processamento matemático.

Mas há um bom tempo já não é mais assim. Se bem que o Clipper ainda carrega o código de emulação, já totalmente inútil. Hoje a unidade matemática é um núcleo especializado dentros dos processadores X86, e é padrão nos PCs, seja qual for o fabricante. E tinha que ser mesmo, senão não haveria compatibilidade.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Otimizar operação matematica no clipper

Mensagem por Pablo César »

Maligno escreveu:Se fosse nos tempos do guaraná com rolha, até diria que seria o caso de instalar um co-processador. Antes ele não existia por default. Era comprado à parte. Se não tivesse, o código de emulação entrava em ação sempre que o processador encontrava uma instrução de co-processamento matemático.
Agora fazendo um pouco de fundamentação teórica... (ou falando um pouco demais... hihihi) queria esclarecer que ao que eu me referia sobre processadores é com respeito ao tipo RISC versus CISC ou até mesmo um processador de main frame.

A Apple projetou seu processador RISC a qual utiliza um conjunto reduzido de instruções e que compete ou competia com o processador da Intel CISC o qual possue um número maior de instruções (mais funções matemáticas). O que facilita a vida do programador, pois o mesmo teria de codificar instruções mais complexas para alcançar seu objetivo num processador da Apple. Sei que não é o caso do colega, mas valeria a pena fazer um teste a nível de experiência: se tivesse disponibilidade de um Apple, e faria um exemplo que para um processador RISC para fazer uma multiplicação 5x2 realiza a operação 2+2+2+2+2. Também podemos dizer que mais rápido nem sempre significa melhor. Os computadores da Apple (power pc, I-mac), não são tão populares no Brasil e não dá para dizer qual é melhor. Mas quando o assunto é, por exemplo, processamento de vídeo, som e gráfico... os preferidos são os de processadores RISC. Também a questão de retro compatibilidade coloca a Intel em posição comercial previlegiada no mercado.

Ao que eu quero chegar, talvez o atual mercado, esteja "evoluindo" para criar processadores mais rápido e mais complexos para atender as funções gráficas e não tanto as funções matemáticas. Podemos observar que Pentium II já incorporam a tecnologia MMX (MultiMedia eXtensoins), a qual foi desenvolvida especialmente para processar video, audio , dados gráficos de um modo mais eficiente.

Claro como disse o Maligno, os processadores da família x86, usada em micros PC, são basicamente processadores de números inteiros. Muitos aplicativos porém, precisam utilizar números fracionários, assim como funções matemáticas complexas e que também podem emular via software estas funções matemáticas complexas, através da combinação de várias instruções simples, porém com uma baixa performance.

A instalação de um coprocessador aritmético é justamente auxiliar o processador principal no cálculo destas funções complexas. Como o coprocessador possui instruções específicas para executar vários tipos de cálculo, ele é em média de 30 a 50 vezes mais rápido do que o processador principal executando o mesmo tipo de cálculo via emulação. Só não sei se este componente é possível instalar nos microcomputadores da nossa atualidade.
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar do usuário
vagucs
Membro Master
Membro Master
Mensagens: 1480
Registrado em: 10 Jul 2004 10:45
Localização: Ipanema - MG
Contato:

Re: Otimizar operação matematica no clipper

Mensagem por vagucs »

Andril,

A lentidão é por causa da saida de tela, mesmo em uma maquina virtual nao deveria ficar tão lento. Faça o teste com e sem a saida de tela e confira se vai dar alguma diferença.
Sem mais
Wagner Nunes
www.vagucs.com.br
Responder