Palm lento

11 respostas
P

Eu estou usando o Palm Os Emulator, e fiz uma aplicação de cadastro de clientes e produtos, utilizando RecordStore, RecordEnumeration, RecordFilter etc, acontece que a partir do momento que eu começo a inserir mais que 20 registros no RecordStore a aplicação começa a ficar lenta… isso só acontece no emulador, no palm vai lento igual? e existe alguma forma de minimizar isso?

11 Respostas

P

O problema de lentidão é principalmente agravado quando se usa uma enumeration que foi construída usando-se um RecordEnumeration/RecordFilter.

Você quando implementa uma destas duas interfaces (ou as duas), tem que ter em mente que como elas vão ser chamadas muitas vezes, o tempo gasto dentro do corpo do método tem que ser mínimo.

Reveja seu código nestas classes e tente cortar ou otimizar o que for possível. Uma mudança na abordagem utilizada para fazer as comparações e/ou sorts também ajuda.

P

“boone”:
O problema de lentidão é principalmente agravado quando se usa uma enumeration que foi construída usando-se um RecordEnumeration/RecordFilter.

Você quando implementa uma destas duas interfaces (ou as duas), tem que ter em mente que como elas vão ser chamadas muitas vezes, o tempo gasto dentro do corpo do método tem que ser mínimo.

Reveja seu código nestas classes e tente cortar ou otimizar o que for possível. Uma mudança na abordagem utilizada para fazer as comparações e/ou sorts também ajuda.

Mas ao meu ver o código já está enxutíssimo, eu posso postar os códigos das interfaces pra vcs olharem e talvez otimizarem ele?

P

Pode.

P
class Enumera implements RecordComparator
 {
	public int compare(byte[] rec1, byte[] rec2)
	{
		String str1 = new String(rec1), str2 = new String(rec2);
		//O formato dos produtos ou clientes é codigo;nome... por isso o substring
		// para que a ordenação seja feita pelo nome, não pelo código
		str1 = str1.substring(2);
		str2 = str2.substring(2);
 		
		int result = str1.compareTo(str2);
		if (result == 0)
			return RecordComparator.EQUIVALENT;
		else if (result < 0)
			return RecordComparator.PRECEDES;
		else
			return RecordComparator.FOLLOWS;
	}
 }
 
 class Filtro implements RecordFilter
 {
 	private String searchText = null;
 	
 	public Filtro(String txt)
 	{
 		this.searchText = txt;
 	}
 	
 	public boolean matches(byte[] candidate)
 	{
 		String str = new String(candidate).toLowerCase();
 		
 		//Procura
 		if (searchText != null && str.indexOf(searchText) != -1)
 			return true;
 		else
 			return false;
 	}
 }
P

Por quê já não construir as String com o conteúdo desejado para a comparação ? Isto evita criação desnecessária de objetos.Faça assim:

str1 = new String(rec1,2,10);
str2 = new String(rec2,2,10);

Você pode construir o objeto Filtro sem ter o pattern de busca ? Faz sentido ?

A comparação também poderia ser feita de outra forma…

P

“boone”:
Por quê já não construir as String com o conteúdo desejado para a comparação ? Isto evita criação desnecessária de objetos.Faça assim:

str1 = new String(rec1,2,10);
str2 = new String(rec2,2,10);

Você pode construir o objeto Filtro sem ter o pattern de busca ? Faz sentido ?

A comparação também poderia ser feita de outra forma…

Não entendi quando vc falou…

Você pode construir o objeto Filtro sem ter o pattern de busca? Faz sentido?

P

E tem outra, o tamanho da String nem sempre vai ser 10

P

Eu coloquei de tamanho 10 pois não sei qual o tamanho da string de comparação no seu RecordComparator, ok ?!

Quando ao RecordFilter é o seguinte:

Dentro do match, acho que esta comparação que para saber se searchtext é diferente de null, não faz sentido, pois vc sempre quando construir o filtro, vai passar algo para o contrutor do objeto, certo ?

Ex:

Filtro filtro = new Filtro(“Alex”);

Portanto, a comparação deve ser retirada do código pois não lhe ajuda em nada.

P

Aham, isso turdo que vc falou está certo e eu já fiz as alterações necessárias, mas mesmo assim isso não vai causar impacto na performance… outra coisinha, é melhor eu ter somente algns commands em váriosforms, e na hora do evento eu vejo em qual form está para tomar a decisão apropriada, usando um display.getCurrent(), ou crio um command diferente para cada form?

P

A primeira abordagem referente ao uso de Commands, parece ser a melhor, já que gasta menos memória e você usa o conceito de reutilização.

O que dita se vc usa a primeira ou a segunda abordagem é como sua aplicação foi construída.

Por exemplo, tenho uma midlet onde cada tela ocupa um .java, e tenho 1 Command “Voltar” em cada classe que representa cada tela.

Gasto mais memória, mas tenho o código de cada tela bem separado, e a manutenção tá mais fácil. Hoje eu não consigo usar a primeira abordagem que te sugeri, pois do jeito que aplicação está, seria custoso mudar tudo.

P

Então do jeito que eu fiz, acho que a primeira abordagem é melhor, porque eu não estou usando classes separadas para cada form… talvez depois eu até separe o código em classes

Criado 1 de julho de 2004
Ultima resposta 2 de jul. de 2004
Respostas 11
Participantes 2