• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

mellony

Projecto Experiencia AI

31 mensagens neste tópico

Boas

Vou reservar este tópico para tirar as muitas duvidas que me vão surgir ao longo deste programa que pretendo fazer.

Espero que não levem a mal eu criar um tópico antes de ele fazer falta.

Nesta primeira fase vou usar a linguagem C, e as duvidas que irei colocar serão sempre relacionadas com a propria linguagem, e o bom uso dela.

Para não deixar isto para já completamente vazio, queria que me recomendassem o melhor compilador de C freeware e o melhor shareware.

P.S. Costumava usar um freeware cujo o nome já não me lembro, mas tinha o problema de os projectos não terem espaços no nome e a directoria tambem nao podia ter espaço no nome, para alem de outros bugs.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Se estás em Windows, recomendo-te o Mingw, se for em Linux tens o gcc (ambos free)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

NetBeans com o mingw e msys ou DevC++ o conjunto de ferramentas mingw, ambos open source. Ou uma das versões Express do Visual Studio.  Não conheço nenhum shareware.

Agora, se tens dúvidas especificas sobre uma linguagem usa os quadros dessa linguagem.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

NetBeans é um IDE para muita coisa, eu uso para Java, C/C++, PHP, Javascript, HTML e CSS e para UML

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Fiz um programito em C para contar até 1000000, com o objectivo de ver o quanto gastava no CPU, ele ficou pelos 40% de utilização, será possivel com algum codigo fonte fazer com que ele use mais o CPU e consequentemente execute as tarefas mais rapidamente?

CPU usado: Core 2 Duo E6750 2.66 GHz @ 2.67

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Usar mais o CPU é diferente de executar as tarefas mais rapidamente.

Porque queres consumir mais CPU? Isso não se vai traduzir em melhor processamento ou processamento mais rápido, aliás, se para contar apenas usastes 40% do CPU então alguma coisa está mal, um código tão simples não pode consumir tanto processador, era o fim dos sistemas operativos :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Estáva a supor que talvez um programa escrito em C por definição não podesse usar mais que 40% do CPU a menos que houvesse algum codigo para tal.

Estou a usar o XP com SP2, o minimo que atinjo é 35%.

Aqui está o codigo fonte.

#include <stdio.h>

void main()

{

    int i;

    for(i=1; i<=1000000; i++)

    printf("%d\n",i);

    system("pause");

}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Um programa consome tanto processador quanto o que o SO lhe der e a tarefa que ele estiver a executar exigir. Mas  no uso do processador entram vários factores, como o tipo de escalonamento usado, a quantidade de processos/threads a executar, a prioridade de cada uma, etc.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Então eu em C posso por exemplo fazer com que o programa conte os primeiros 500.000 ao mesmo tempo que conta os 2ºs 500.000? e poupar tempo?

P.S. Acredito que meta alguma piada estas minhas perguntas eu sei lool mas queria no fundo saber e existe alguma maneira de na linguagem C optimizar o desempenho.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Os 40% deve-se ao facto do teu processador ter na realidade 2 processadores. Com um programa sequencial só podes ocupar um dos processadores.

Podias dividir o trabalho entre os processadores com threads, mas se ainda não sabes bem C, não faz sentido ires para coisas mais avançadas. O melhor é aprender o basico primeiro.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Apesar de tudo, os 2 cores que tenho no meu CPU....provaria que eu deveria alcançar os 50%....mas ok..vou supor que os 40% servem para o PC não bloquear etc. alem disso eu sei que é muito dificil atingir os 100% num cpu destes ao contrario do que acontece com o pentium 4.

Ou seja é muito complexo mesmo fazer a situação atraves de 2 treads certo? mas se ainda assim quiesse...poderia faze-lo só com a linguagem C ou precisaria de mais alguma coisa?

P.S. Haverá outras alternativas para optimizar o desempenho? Quando vosses pretendem optimizar o desempenho duma aplicação, as unicas opção que tem passam apenas por fazer codigo mais simples e apagar o que nao faz falta, ou há mais alguma coisa?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Mellony. A sério... estas são situações complexas e difíceis de responder uma forma forma concreta porque dependem de muitos factores. São questões avançadas de programação para as quais não vais conseguir dar utilidade nenhuma enquanto não aprenderes a linguagem a um nível mais elevado.

Obrigas a um esforço na resposta às tuas questões mas esse esforço não vai se vai reflectir em nada de concreto. Sugiro que esqueças tudo isto. Não é a altura. Aprende primeiro a linguagem de programação. Aí vais ter muita ajuda e muitas das tuas dúvidas irão em muitos casos ser respondidas por ti mesmo à medida que comprendes melhor como é que a linguagem funciona e como é que a máquina "pensa".

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ok...vou colocar o problema da optimização do desempenho para depois.

De qualquer forma, pelos poucos segundos que demora contar até 1000000, prevejo que mesmo a aplicação que pretendo fazer corra bastante bem, até melhor do que o que eu esperava.

Basicamente já acabei o programa na minha mente, agora quero tornalo menos abstracto, vou escrever uns esquemas em papel, etc. depois devo começar a passar isso para a linguagem propriamente dita.

...Quando e SE isto funcionar, daqui a uns tempos colocarei uma demo aqui no forum...até lá ainda vou colocar mais algumas duvidas :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Só uma nota, fazer uma instrução de output no ecrã como o printf é relativamente lenta comparadas com as outras operações. Se retirares o printf e ficares só com o ciclo, o programa tem de correr instantaneamente. Um milhão é muito pouco :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ok.

E é possivel que uma aplicação em C, processe informação, e possa interromper para fazer outra coisa?

Exemplo:

Ao iniciar a aplicação, o programa automaticamente começa a contar até 1000000 e quando acaba de contar guarda num ficheiro do bloco de notas essa contagem, alem disso o programa se eu permir qualquer tecla enquanto ele conta até 1000000, interrompe a contagme e guarda num ficheiro do bloco de notas o que já contou, e pergunta se quero multiplicar 3 por quantos? eu insiro o valor 5, ele apresenta o resultado de 15 obviamente e depois continua a contar apartir de onde ficou e guarda o resto da contagem no mesmo ficheiro.

isto é possivel?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sim, é possível. Tal como já foi sugerido, o melhor é aprenderes bem a linguagem primeiro :P

edit: outro motivo para os 40% e não 50% de cpu é precisamente o printf. Quando o programa executa uma instrução de input/output tem de esperar que esta seja efecuada pelos dispositivos. Nesta espera, o cpu (no que diz respeito a este programa) está em espera. De qualquer modo, esta pode não ser a razão porque o sistema operativo ocupa o cpu com outras tarefas.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Bem eu acho que devia ser possivel, optimizar mais.....o Crysis por exemplo...como é que eles fizeram para optimizar algo com tantoo processamento?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

o Crysis por exemplo...como é que eles fizeram para optimizar algo com tantoo processamento?

Apenderam a programar em C++ primeiro...

Bem eu acho que devia ser possivel, optimizar mais

Estás a confundir optimização com a capacidade de processamento de instruções de um cpu. As duas coisas são distintas. Como já te foi dito, mas tu decidiste ignorar, não existe uma relação directa entre a carga do CPU e o nível de optimização do teu código. Por mais que optimizes os código, isso só se vai traduzir no desempenho do CPU em processar o código, não na carga do mesmo.

Por norma, um CPU vai utilizar toda a sua capacidade para processar um conjunto de instruções. Seja um ciclo que conta de 1 a 1 milhão, seja fazer o rendering de uma boneco 3D. Quando adicionas instruções estás apenas a reduzir a velocidade de processamento. Ou seja, se no teu código, a seguir ao printf, decides guardar o valor também num array, estarás a aumentar o tempo que o CPU vai demorar para processar todo o ciclo. Mas a carga irá manter-se mais ou menos a mesma.

Em sistemas dual-core a coisa muda um bocado de figura, mas o principio mantém-se. Em todo o caso existem formas de ganhar algum controle sobre o CPU e sobrepor a tua vontade à do sistema operativo. Mas são temas avançados de programação os quais eu não domino inteiramente.

Peço-te mais uma vez que ignores estes assuntos por agora. Não é assim que se aprende a programar. Começa-se por baixo.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Então eu em C posso por exemplo fazer com que o programa conte os primeiros 500.000 ao mesmo tempo que conta os 2ºs 500.000? e poupar tempo?

Sim podes, com relativa facilidade. Tal como te foi dito, podias usar threads para fazer processamento paralelo.

Apesar de tudo, os 2 cores que tenho no meu CPU....provaria que eu deveria alcançar os 50%....mas ok..vou supor que os 40% servem para o PC não bloquear etc. alem disso eu sei que é muito dificil atingir os 100% num cpu destes ao contrario do que acontece com o pentium 4.

Onde é que ter dois núcleos prova que deverias alcançar 50%? Nem imagino porque é que 40% será para o PC não bloquear, ou porque é que é difícil atingir 100% num dual core e não num P4. É tão difícil num como no outro, ou melhor é tão fácil num como no outro, consumir 100% de processamento é bastante simples. Consumir todo o CPU, toda a RAM e todo o disco são tarefas de programação triviais :P

Ou seja é muito complexo mesmo fazer a situação atraves de 2 treads certo? mas se ainda assim quiesse...poderia faze-lo só com a linguagem C ou precisaria de mais alguma coisa?

Não é que seja muito complexo, mas exige teres já alguns conhecimentos de programação, não é algo muito complicado, mas sempre é considerado uma área avançada da programação. Mas há que ter em conta que duas threads não tornam o processamento mais rápido, mesmo num dual core, teoricamente deveria mas na prática há muitos factores que estão envolvidos para poder responder a essa questão de forma leviana.

C tem todo o suporta para threads que precisas, não irias precisar de mais nada em especial.

P.S. Haverá outras alternativas para optimizar o desempenho? Quando vosses pretendem optimizar o desempenho duma aplicação, as unicas opção que tem passam apenas por fazer codigo mais simples e apagar o que nao faz falta, ou há mais alguma coisa?

C é um linguagem que é bastante optimizada pelo compilador, e não há muito mais a optimizar. Aliás, não se optimiza durante a programação, isso seria o que se chama de pré-optimização e não dá grandes resultados. Como é que esperas optimizar algo se não sabes onde está o problema de performance? Sabes qual é a instrução ou instruções de código que vão estar a ocupar mais o processador? Sabes se o programa vai ser lento antes de o teres criado? Optimização é algo que se faz quando se encontram problemas de performance não é algo que se faça para resolver problemas que ainda não existem.

Além disso, é complicado optimizar código porque nem sabes como é que o compilador vai tratar esse código. por exemplo, é comum a optimização de executar uma instrução FOR de forma invertida, isto é, em vez de incrementar a variável, decrementá-la para no fim comparar com zero, isso é até feito, por exemplo, pelo compilador existente no Delphi 7 se uma das opções de optimização for activada. Se em Java pegares nessa "optimização", o código ficará mais lento, em Java é mais lento fazer um for decrescente e comparar no fim com zero. Claro que estamos a falar de diferenças mínimas, e o exemplo serve apenas para reforçar a ideia que optimizar enquanto se está a programar, é algo que poderá apenas trazer vantagens se dominares completamente a tecnologia que estás a usar. E mesmo assim, nunca são grandes optimizações.

E como o Marfig indicou, primeiro convinha que aprendesses mais sobre o que estás a querer fazer, não só sobre programação como sobre computadores em geral, estás a misturar muitos conceitos e muitas áreas diferentes.

Só a área de processamento e escalonamento de processos/threads, é um mundo enorme para o qual irás precisar de algum tempo para aprender alguma coisa útil.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

outro motivo para os 40% e não 50% de cpu é precisamente o printf. Quando o programa executa uma instrução de input/output tem de esperar que esta seja efecuada pelos dispositivos. Nesta espera, o cpu (no que diz respeito a este programa) está em espera. De qualquer modo, esta pode não ser a razão porque o sistema operativo ocupa o cpu com outras tarefas.

Com buffering, esse tempo de espera é limitado. Enquanto o conteúdo do buffer não é despejado para o dispositivo, o programa continua a processar e a adicionar ao buffer. Quando este enche, ou o conteúdo mais antigo é descartado (tem lógica acontecer numa aplicação de consola, em que a quantidade de dados que são mostrados é limitada), ou pode ser suspensa a execução do programa até que o buffer seja esvaziado.

Só a área de processamento e escalonamento de processos/threads, é um mundo enorme para o qual irás precisar de algum tempo para aprender alguma coisa útil.

Trabalhar com múltiplos fios de execução é realmente uma das disciplinas mais complexas da engenharia informática. É preciso ter um bom conhecimento de tudo o que se está a passar "under the hood" para conseguir programar coisas minimamente complexas com múltiplas threads.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

OK, o assunto das optimizações está encerrado :D

Não apaguem o post, que depois quando precisar irei colocar aqui mais duvidas sobre o projecto que estou a fazer :P

P.S. Alguem era capaz de fazer o codigo fonte daquela aplicação exemplo que disse? epa secalhar é pedir demais, eu posso fazer sozinho mas vou dmeorar mais tempo...bem mas se alguem quiser :-[

O codigo fonte daquele exemplo tem algumas bases para o que pretendo fazer.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

OK, o assunto das optimizações está encerrado :D

Não apaguem o post, que depois quando precisar irei colocar aqui mais duvidas sobre o projecto que estou a fazer :P

P.S. Alguem era capaz de fazer o codigo fonte daquela aplicação exemplo que disse? epa secalhar é pedir demais, eu posso fazer sozinho mas vou dmeorar mais tempo...bem mas se alguem quiser :-[

O codigo fonte daquele exemplo tem algumas bases para o que pretendo fazer.

Por agora não penses em execução paralela de código. Estuda durante uns meses a linguagem, faz programas mais simples, e depois volta a fazer essas perguntas e vais ver que vai ser tudo muito mais claro. Parece-me que estás a tentar fazer coisas complexas, e ainda não tens as bases que vais precisar de ganhar. :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não, não pretendo fazer coisas complexas ao nivel de programação, ou seja não pretendo fazer coisas complexas com a linguagem em si, eu sei que a conversa sobre o processamente foi um pouco contraditoria a esse respeito...mas não pretendo fazer nada muito complexo com a linguagem em si, já a maneira como vou colocar o problema irá conter uma complexidade inimaginavel mas isso tambem não vou pedir ajuda...faz parte da minha concepção do problema.

Relativamente, ao exemplo que meti aí, de contar ate 1 milhao e interromper para fazer outra coisa e recomeçar, não me parece que seja por aí alem para quem já domina a 100% o C, mas se não me quiserem ajudar nisso, eu vou tentar fazer isso com a ajuda do livro do Luis Damas, mas vou perder é mais tempo.

Gosto sempre de ter alguns exemplos basicos, para poder aplicar depois de forma mais complexa.

Para quem esta a seguir estes meus topicos, a ideia é criar um programa com inteligencia propria, mas quero fugir aos conceitos atuais de AI, e criar uma coisa de raiz. Esse exemplo, faz-me falta para uma vez que o C (e a maioria) das linguagens são sequenciais, poderei então fazer com que o programa pense uma coisa, pare e pense outra etc., e alem disso quero que a aplicação esteja sempre a pensar e a organizar a sua "mente" mesmo quando não estamos a interagir com ela.

E quando interagirmos ela interrompe os seus "pensamentos", e concentra-se naquilo que estamos a comunicar.

Tudo isto parece que precisa de muito processamente ma nem por isso, eu resolvi a solução mas não posso adiantar esses dados :D

Vá não levem a mal, eu acredito que consiga fazer isto, mas mesmo que não consiga, não me digam que nunca fizeram as vossas experiencias com a programação? :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Com buffering, esse tempo de espera é limitado. Enquanto o conteúdo do buffer não é despejado para o dispositivo, o programa continua a processar e a adicionar ao buffer. Quando este enche, ou o conteúdo mais antigo é descartado (tem lógica acontecer numa aplicação de consola, em que a quantidade de dados que são mostrados é limitada), ou pode ser suspensa a execução do programa até que o buffer seja esvaziado.

Como ele tem "%d\n", o fim de linha obriga o buffer a despejar o conteúdo para o dispositivo.

Relativamente, ao exemplo que meti aí, de contar ate 1 milhao e interromper para fazer outra coisa e recomeçar, não me parece que seja por aí alem para quem já domina a 100% o C, mas se não me quiserem ajudar nisso, eu vou tentar fazer isso com a ajuda do livro do Luis Damas, mas vou perder é mais tempo.

Não estás a perder tempo nenhum. Ao colocares aqui as coisas no fórum perdes muito mais tempo porque tens de esperar as respostas. Se te dedicares a aprender a linguagem, terás muito mais facilidade para fazer as coisas. Além disso ficas com uma ferramenta para fazer programas que dêem jeito.

PS: programação paralela até é simples em termos de código, mas convém ter bases do funcionamento dos sistemas operativos e de alguma linguagem, para a usar convenientemente.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora