Fórum Consumo de memória #355261
12/03/2008
0
Pessoal um programador experiente me falou algo que fiquei com dúvida, é verdade que declarar um campo de uma tabela desta forma
IbdtsPagamentosCODIGO.asinteger
Usa mais memória e processamente que declarar assim
IbdtsPagamentos.fieldbyname(´CODIGO´).asinteger
????Qual a forma mais prática e otimizada de usar????
Dúvida 2
Qual a forma de identação digamos ´homologada´ pela Borland ???
Desta forma :
if ... then begin
end else begin
end;
ou assim
if ...then
begin
end else
begin
end;
São dúvidas bobas, mas o cara me enche o saco por causa disso...desde já agradeço
Estanieski
Curtir tópico
+ 0Posts
12/03/2008
Massuda
Gostei + 0
23/09/2008
Pedroso
1º
IbdtsPagamentosCODIGO.asinteger (Quem é o campo aqui ? Pagamentos ou codigo ? Ou Codigo de pagamentos?)
IbdtsPagamentos.fieldbyname(´CODIGO´).asinteger (Aqui eu sei quem é o campo.)
2º
if ... then begin
end else begin
end;
Tu acha melhor usar assim ?
if ... then
begin
end else
begin
end;
Pela amor de Deus ... me diz que não.....
3º
Dúvidas nunca são bobas (dependendo do abobado) e sempre bom perguntar.
Mas da proxima vez pergunta pro teu chefe ....... tu num grupo, este grupo tem um chefe, e é ele quem sabe como deve ser feito.
Ass.
Cara que te enche o saco.
Gostei + 0
23/09/2008
Emerson Nascimento
se você já possui os campos persistidos (motivo pelo qual pode usar IbdtsPagamentosCODIGO.asinteger), não faz diferença usar IbdtsPagamentosCODIGO.asinteger ou IbdtsPagamentos.fieldbyname(´CODIGO´).asinteger, visto que a memória já está alocada. o que você perceberá é que se você usar IbdtsPagamentosCODIGO.asinteger o retorno da informação será mais rápido porque o conteúdo já estará alocado na memória, enquanto que, com o uso de IbdtsPagamentos.fieldbyname(´CODIGO´).asinteger o dataset irá fazer uma varredura na lista de campos até encontrar o campo informado - ´CODIGO´ - e só então irá retornar seu valor.
se você NÃO persistir os campos, com certeza alocará menos memória e terá de usar somente o esquema IbdtsPagamentos.fieldbyname(´XXX´).asXXX.
2o.
no caso de apenas uma linha de comando:
if ... then [comando] else [comando];
no caso de mais de uma linha:
if ... then begin [comando1]; [comando2]; end else begin [comando1]; [comando2]; [comando3]; end;
explico:
se sua condição tem apenas uma linha de resposta, como você faz?
if Valor <= 0 then ShowMessage(´Deve ser informado um valor!´) else if Valor >= 100 then ShowMessage(´O valor deve ser MENOR que 100!´);
ou
if Valor <= 0 then ShowMessage(´Deve ser informado um valor!´) else if Valor >= 100 then ShowMessage(´O valor deve ser MENOR que 100!´)
???
eu uso a primeira forma, então, pra mim, somente o comando em si (if..then ou else) deve estar na linha, visto que [i:e64f0204e0]begin...end[/i:e64f0204e0] são utilizados para conjuntos de comandos. eu vejo isso nas funções e procedimentos do Delphi.
[i:e64f0204e0]procedure TForm1.Button1Click(Sender: TObject);
begin
end;[/i:e64f0204e0]
e não
[i:e64f0204e0]procedure TForm1.Button1Click(Sender: TObject); begin
end;[/i:e64f0204e0]
em todos os exemplos mostrados na ajuda do Delphi o [i:e64f0204e0]begin[/i:e64f0204e0] está sempre na linha seguinte, e é esse o padrão que eu uso.
agora, se você trabalha com uma equipe, o bom mesmo é seguir o padrão adotado pela equipe.
Gostei + 0
24/09/2008
Pedroso
IbdtsPagamentosCODIGO.asinteger
Mesmo que se fale em persistencia, não é a forma mais adequada. O fato de demorar mais é que na realidade é feita uma requisição ao bd. Quando aplico o fieldbyname estou fazendo uma referencia a Classe TDataSet.
IbdtsPagamentosCODIGO.asinteger
IbdtsPagamentos.FieldValues[´CODIGO´];
IbdtsPagamentos.Fields[1].AsString;
IbdtsPagamentos[´CODIGO´];
Existem outras formas de chamar o campo alem destas. O problema esta no retrabalho. Toda a vez que voce tiver que mudar um campo de tamanho ou criar um novo será obrigado a fazê-lo no DataSet tambem. E no codigo. O fieldbyname necessita apenas no codigo. É obvio que os dois métodos tem suas aplicações. Eu uso DataWare mas estou migrando para persistencia.
Criar um ponteiro para o dataset ou seja bdtsPagamentosCODIGO.asinteger , é mais rapido na aplicação do que fieldbyname claro ??? O que devemos avaliar que isto acontecia muito na época de BDE quando existia os arquivos em disco servindo de cache para cada aplicação. Nos SGDB´s tambem existe cache porem mais rapido e paginado. O que nos faz pensar , qual a distancia entre ponteiro e fieldbyname. Eu diria ... no tempo de requisição. O Ponteiro aponta para o campo diretamente , enquanto o fieldbyname procura o campo na query. O que não faz do FieldByName uma carroça. Mas auxilia na abstração quando falamos em projeto. Mas se vamos falar realmente em grandes projetos. Acredito que devamos partir para o lado de persistencia onde ponteiro e referencia não tem muito espaço.
Já o fato de IbdtsPagamentosCODIGO.asinteger consumir mais memoria isto é verdade, Voce obriga o compilador a criar ponteiros (que consomem memoria) para a aplicação. Ai vão me dizer ´Nos dias de hoje onde memoria custa pouco não tem problema´. Eu diria a favor do fieldbyname: ´Nos dias de hoje onde temos processadores tão poderosos que não tem problema´. Desenvolvo desde o CP500 , me desculpem ... para mim memoria sempre teve seu valor. É a nestas pequenas diferencas é que notamos a performance.
Ja fiz testes na versão 3 e 5 do delphi com fieldbyname e Fields e sinceramente a diferença foi tão pequena que preferi ver meu codigo com uma leitura mais facil. Acredito na boa reutilização do código , nas boas praticas de desenvolvimento, no crer e tentar entender o compilador ...... Amem.
O Estanieski trabalha comigo , antes que alguem apele para chefe turrão. Estava apenas brincando com ele. E falando a verdade tambem.
Gostei + 0
24/09/2008
Pedroso
Neste caso não sei se o compilador trata no assembly. Mas vlw ... é bom descutir.
Gostei + 0
24/09/2008
Emerson Nascimento
o compilador trata isso, sim. compile um programa que tenha um trecho de código qualquer, por exemplo, um try...except
try StrToFloat(Edit1.Text); ShowMessage(´Você digitou um valor numérico´); except ShowMessage(´Você digitou um valor alfanumérico´); end;
depois altere para
try
begin
{aqui será avaliado o valor digitado}
StrToFloat(Edit1.Text);
{se o comando acima for válido, será exibida a msg abaixo}
ShowMessage(´Você digitou um valor numérico´);
end;
except
{essa msg será exibida caso haja algum erro}
ShowMessage(´Você digitou um valor alfanumérico´);
end;
note que no segundo exemplo, além de linhas em branco e dos comentários, ainda tem um [i:688208e625]begin..end[/i:688208e625] a mais, porém o compilador trata os dois códigos da mesma forma.
Gostei + 0
26/09/2008
Pedroso
Gostei + 0
26/09/2008
Emerson Nascimento
beleza. não quero saber mais que ninguém.
eu só estava ´palpitando´....
:D
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)