Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 08-01-2014
paquechu paquechu is offline
Miembro
 
Registrado: oct 2008
Posts: 51
Poder: 16
paquechu Va por buen camino
Question Porque ocurre esto?

Buenas,
Trabajando con un TCheckListBox (con 7 líneas solamente), en un bucle de unos 14 millones de iteraciones, al preguntar por el estado de uno de los elementos del checklistbox, el proceso se ralantiza muchisimo, sin embargo haciendo la misma pregunta en una variable de tipo bool es muy rpaído..

El caso que os comento que es muy lento

Código Delphi [-]
i:=0
While i<=14000000 do
begin
         if checklistbox.checked[i] then
         begin
                /// acciones
         end
         inc(i)
end;

El caso rapido

Código Delphi [-]
i:=0
While i<=14000000 do
begin
         if variable_bool then
         begin
                /// acciones
         end
         inc(i)
end;

Se os ocurre porqué?
Saludos :-)
Responder Con Cita
  #2  
Antiguo 09-01-2014
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is online now
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Por favor, no olvides poner títulos descriptivos a tus preguntas, gracias

¿Por qué es lento?, porque son 14 millones de iteraciones.

Primer caso: tiene que acceder al valor de una propiedad de un objeto.
Segundo caso: una variable boolean.

Si la diferencia es ¿10 milésimas de segundo?, multiplicado por ¡¡¡ 14 millones !!!, serían 14000000*10 = 140000 segundos=2333 minutos =38 horas=casi 2 días

¿Para qué puede servir hacer ese bucle?
Responder Con Cita
  #3  
Antiguo 09-01-2014
paquechu paquechu is offline
Miembro
 
Registrado: oct 2008
Posts: 51
Poder: 16
paquechu Va por buen camino
Hola Casimiro,
Disculpa por el lapsus!!!

Veras, estoy haciendo un programa para evaluar todas las combinaciones posibles de la loto 6/49 (Combinaciones de 49 elementos tomados de 6 en 6) aproximadamente son 14 millones.
Por tanto para evaluarlas todas hay que hacer un bucle con este número de iteraciones.

Por otro lado, el caso mas lento (cuando se accede a los elementos del CheckListBox para preguntar por la propiedad checked) tarda 3 o 4 minutos (no recuerdo ahora bien de memoria). y el otro caso entre 2 y 3 segundos.

Pero independientemente del porqué de este número de iteraciones tan elevado, lo que NO ENTIENDO es porqué cuando al IF le coloco como condición Checklistbox.Checked[0] tarda tantisimo más que si le coloco una variable de tipo bool IF bChecked.

Porque he preguntado esto, pues porque para realizar la interfaz gráfica del programa necesito este control y para no enredar mas de lo necesario el codigo teniendo que establecer un paralelismo entre el control checklistbox y las variables bool me gustaria utilizar solamente el control gráfico. No se si me explico.....

Saludos y gracias por el interes :-)
Paco.
Responder Con Cita
  #4  
Antiguo 09-01-2014
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Como te han comentado, se hace lento porque tiene que acceder a varias capas de abstracción (VALOR de una PROPIEDAD de un OBJETO).

Podrías solucionarlo así:

Código Delphi [-]
i:=0
chk := checklistbox.checked[i]
While i<=14000000 do
begin
         if chk then
         begin
                /// acciones
         end
         inc(i)
end;
Responder Con Cita
  #5  
Antiguo 09-01-2014
paquechu paquechu is offline
Miembro
 
Registrado: oct 2008
Posts: 51
Poder: 16
paquechu Va por buen camino
Entendido, muchas gracias :-)
Saludos.

Cita:
Empezado por duilioisola Ver Mensaje
Como te han comentado, se hace lento porque tiene que acceder a varias capas de abstracción (VALOR de una PROPIEDAD de un OBJETO).

Podrías solucionarlo así:

Código Delphi [-]
i:=0
chk := checklistbox.checked[i]
While i<=14000000 do
begin
         if chk then
         begin
                /// acciones
         end
         inc(i)
end;
Responder Con Cita
  #6  
Antiguo 09-01-2014
Avatar de ElDioni
[ElDioni] ElDioni is offline
Miembro Premium
 
Registrado: jul 2005
Ubicación: Murcia (España)
Posts: 935
Poder: 19
ElDioni Va por buen camino
Cita:
Empezado por duilioisola Ver Mensaje

Código Delphi [-]i:=0 chk := checklistbox.checked[i] While i<=14000000 do begin if chk then begin /// acciones end inc(i) end;
La línea chk:=checklistbox.checked[i], ¿no debería estar dentro del bucle while?

Saludos.
__________________
Confórmate con lo que tienes pero anhela lo que te falta.
Responder Con Cita
  #7  
Antiguo 09-01-2014
paquechu paquechu is offline
Miembro
 
Registrado: oct 2008
Posts: 51
Poder: 16
paquechu Va por buen camino
Cita:
Empezado por ElDioni Ver Mensaje
La línea chk:=checklistbox.checked[i], ¿no debería estar dentro del bucle while?

Saludos.
Eldioni,
Debe ir fuera ya que al evaluar el checklistbox dentro del bucle se enlentece mucho el proceso.

La asignación se debe realizar fuera de este bucle principal en otro distinto donde se asigne al array booleano los valores del checklistbox.checked

Es la misma solución que puse yo como opción b, solo que se me pasó ponerle el indice a la variable

Código Delphi [-]
i:=0

Aqui un bucle para asignar a variable_bool[i] los valores CheckListBox.Checked[i]

While i<=14000000 do
begin
         if variable_bool[i] then
         begin
                /// acciones
         end
         inc(i)
end;

Saludos :-)

Última edición por paquechu fecha: 09-01-2014 a las 19:39:50.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Mostrar un caracter si ocurre una condicion titooo MS SQL Server 4 31-07-2013 12:23:50
No se porque falla esto :-( jorgegetafe Varios 3 26-07-2007 17:19:58
myDAC: ¿qué ocurre después de 60 días? pepe123 Conexión con bases de datos 0 26-01-2007 18:01:50
¿Que ocurre con Vista y el DRM? Casimiro Notevi La Taberna 7 10-01-2007 22:02:26


La franja horaria es GMT +2. Ahora son las 10:36:08.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi