Jump to content
WolfmanZ

Optimizacao de programa

Recommended Posts

WolfmanZ

Boas estou com problemas a optimizar este codigo será que alguém pode dar uma ajuda!

#include<stdio.h>
#include<fcntl.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>

int main(int argc, const char* argv[]){
char string[100];
char stringfinal[100];
char b[3];
int i;
int fd = open( argv[1],  O_RDONLY);
if (fd== -1)
	exit(1);

stringfinal[0]='\0';

while(1){
	read(STDIN_FILENO,b,3);
	i = atoi(&b[2]);
		if(b[0]=='r'){
			read( fd, string, i);
			strcat(stringfinal,string);
		}
		if(b[0]=='i'){
			lseek(fd, i, SEEK_SET);
		}
		if(b[0]=='f'){
			lseek(fd, -i, SEEK_END);
		}

		if(b[0]=='+'){
			lseek(fd, i, SEEK_CUR);
		}

		if(b[0]=='-'){
			lseek(fd, -i, SEEK_CUR);
		}

		else if(b[0]=='s' && b[2]=='0'){
		break;
		}
}
strcat(stringfinal,"\n");
int tamanho = strlen(stringfinal);	
write(STDOUT_FILENO, stringfinal, tamanho);
close(fd);
return 0;
}

O programa serve para avançar e recuar na frase do ficheiro de acordo com o i/f/+/-  e quando aparece r tende ler

exemplo:

i 2 vai po inicio e avança 2 caracteres

+ 2 vai po inicio e avança 2 caracteres

f 2 vai po inicio e recua 2 caracteres

- 2 vai po inicio e recua 2 caracteres

r 2 le dois caracteres

Atençao que nao posso usar printfs e tenho de usar write read e lseeks.

Share this post


Link to post
Share on other sites
WolfmanZ

isto é para o exercicio de universidade so que é para ser entrege numa plataforma que faz teste e da um resultado a mim disse que demora muito a correr o programa logo tem de se optimizar! o exercicio está feito so falta é optimiza-lo, mas nao sei como optimiza-lo mais!

Share this post


Link to post
Share on other sites
pmg

Em vez de atoi(&b[2]) experimenta

        i = b[2] - '0';

E ainda ...

O strcat() vai ser ler a string destino desde o principio. Podes guardar um ponteiro para a proxima posição de escrita e usá-lo em vez de fazeres strcat() constantemente.

Atenção ao buffer overflow!


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Share this post


Link to post
Share on other sites
brunoais

Usa o switch. É um pouco mais rápido que if then else


"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Share this post


Link to post
Share on other sites
HappyHippyHippo

Atençao que nao posso usar printfs e tenho de usar write read e lseeks.

não há milagres ...


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
brunoais

mostra o código atual, sff


"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Share this post


Link to post
Share on other sites
pedrosorio

o codigo está igual visto que as alteraçoes nao fizeram efeito!

A minha ideia inicial seria que com strcat (no if b[0]=='r') o teu código corre em O(N^2) em que N é o número de caracteres da string final, provavelmente precisarias de um algoritmo O(N). Terias que guardar um apontador para o fim da tua string e acrescentar o que lês diretamente no fim, em vez de fazer strcat.

No entanto, depois de ver a constante que tens aí (e se tens a certeza absoluta que a nunca vais ler mais que 100 caracteres), não pode ser esse o problema. Uma dúvida: tens sempre apenas um algarismo nas instruções garantidamente?


Não respondo a dúvidas por mensagem.

Share this post


Link to post
Share on other sites
WolfmanZ

em primeiro lugar, sim a constante nao tem mais de 100 caracteres quanto a ter dois digitos é uma boa pergunta porque no exemplo e num enuciado ele nao fala em 2 algarismos mas se calhar pode ter 2 algarismos!

Afinal nao pode ter 2 algarismos.

Share this post


Link to post
Share on other sites
WolfmanZ

codigo actual:

#include<stdio.h>
#include<fcntl.h>
#include<stdlib.h>
#include<unistd.h>

int main(int argc, const char* argv[]){
char string[100];
char b[3];
int i,m=0;
int fd = open( argv[1],  O_RDONLY);
if (fd == -1)
	exit(1);

while(1){
	read(STDIN_FILENO,b,3);
	i=b[2]-'0';
		if(b[0]=='r'){
			read( fd, string+sizeof(char)*m , i*sizeof(char));
			m += i;
		}
		if(b[0]=='i'){
			lseek(fd, i, SEEK_SET);
		}
		if(b[0]=='f'){
			lseek(fd, -i, SEEK_END);
		}

		if(b[0]=='+'){
			lseek(fd, i, SEEK_CUR);
		}

		if(b[0]=='-'){
			lseek(fd, -i, SEEK_CUR);
		}

		else if(b[0]=='s' && b[2]=='0'){
		break;
		}
}
write(STDOUT_FILENO, string, m);
write(STDOUT_FILENO, "\n", 1);
close(fd);
return 0;
}

Share this post


Link to post
Share on other sites
bsccara

Aposto que o que domina o tempo de execução desse código são essas chamadas constantes ao lseek e read.

Share this post


Link to post
Share on other sites
HappyHippyHippo

parece que estas a ler do teclado os i/f/+/- ...

porque não :

- guardas numa variável o tamanho do ficheiro

- tratas lógicamente do ponteiro onde deverás ler os bytes

    isto é : alteras o valor da variável que guarda a posição a ser lida do ficheiro

- só executas um lseek quando necessitas de ler bytes do ficheiro


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
WolfmanZ

pessoal ja descrobri porque nao aceitava a resoluçao :

a instruçao é : por exemplo "i 3" mas tem o \n no final e no codigo tinha

char b[3];
read(STDIN_FILENO,b,3);

e devia estar :

char b[4];
read(STDIN_FILENO,b,4);

obrigado a todos pela ajuda!!

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.