Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Porque ocurre esto? (https://www.clubdelphi.com/foros/showthread.php?t=84979)

paquechu 08-01-2014 20:56:34

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 :-)

Casimiro Notevi 09-01-2014 03:46:59

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?

paquechu 09-01-2014 12:26:38

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.

duilioisola 09-01-2014 15:56:12

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;

paquechu 09-01-2014 17:07:59

Entendido, muchas gracias :-)
Saludos.

Cita:

Empezado por duilioisola (Mensaje 471487)
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;


ElDioni 09-01-2014 18:32:05

Cita:

Empezado por duilioisola (Mensaje 471487)

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.

paquechu 09-01-2014 19:35:43

Cita:

Empezado por ElDioni (Mensaje 471495)
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 :-)


La franja horaria es GMT +2. Ahora son las 09:11:37.

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