Windows reduce velocidad de ejecucion.

Iniciado por Usuario887, 20 Octubre 2021, 11:01 AM

0 Miembros y 1 Visitante están viendo este tema.

MinusFour

CitarImportante tomar en cuenta: Para cuando se llama esta funcion el contenido del archivo ya esta en memoria RAM. Se encuentra todo en csvheader->bBuffer.

Eh, entonces no tarda 40 minutos en cargar el archivo en memoria... Tarda 40 minutos en hacer el copiado a tu __quotesmem. ¿Donde haces el malloc en esta función? Idealmente no vas a querer llamar a esta función millones de veces... Vas a querer asignar un espacio considerable porque el coste de la interrupción es alto.

Aún así, algo esta haciendo windows si te esta limitando el % de utilización de CPU. ¿Alguna configuración de energía?

Usuario887

Cita de: MinusFour en 21 Octubre 2021, 17:04 PM
el coste de la interrupción es alto.

Idealmente no querras llamar esta funcion millones de veces

A malloc la llamo tantas veces como filas haya en el archivo, y en este hay once millones...

Esa funcion solo carga la fila actual en la estructura, en bQuotesmem, luego ese puntero es recogido por el caller de la funcion y llama a otra que mete la estructura en la lista enlazada (pero claro, cada vez que la llama, es decir, por fila, reserva memoria nuevamente)

¿Entonces si se debe a eso?

Eternal Idol

#12
Si el programa tiene un solo hilo ese es el comportamiento esperado y logico.

Ejemplo, 12 procesadores/nucleos:


Código (c++) [Seleccionar]
#include <cstdio>

void main()
{
for (int x = 0; ; x++);
}


Usa el 100% de un nucleo/proceador, ni uno solito mas, el S.O. no puede poner en ejecucion UN hilo en varios procesadores/nucleos a la misma vez por obvias razones.




Código (c++) [Seleccionar]
#include <windows.h>
#include <cstdio>

DWORD WINAPI WasteThread(LPVOID lpParam)
{
for (int x = (int)lpParam; ; x++);
}

void main()
{
for (int x = 0; x < 3; ++x)
CreateThread(NULL, 0, WasteThread, (LPVOID)x, 0, nullptr);
for (int x = 0; ; x++);
}




Con 4 hilos (el principal y los 3 creados) pasa a consumir (100 / 12 * 4) = 33% de CPU.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

Usuario887

Si, Eternal Idol, entiendo que la ejecucion de un ciclo no puede ser dividida, pero lo que no entiendo es por que disminuye, porque no es que sea baja la velocidad, es que disminuye con el tiempo, es decir, es mas rapida en un momento y mas lenta a medida que pasan los segundos... eso es lo que no logro comprender




¿Es eso lo que esta detectando el sistema? ¿Un waste.exe?

Usuario887


Eternal Idol

#15
Cita de: marax en 21 Octubre 2021, 17:34 PM
Si, Eternal Idol, entiendo que la ejecucion de un ciclo no puede ser dividida, pero lo que no entiendo es por que disminuye, porque no es que sea baja la velocidad, es que disminuye con el tiempo, es decir, es mas rapida en un momento y mas lenta a medida que pasan los segundos... eso es lo que no logro comprender


No se. ¿Te estas quedando sin RAM? Tu programa opera con memoria virtual, eventualmente tendra que paginar si no paras de reservar. ¿Estas ordenando los datos a medida que los procesas? Con unos pocos, al principio, el ordenamiento es mucho menos costoso ...

Cita de: marax en 21 Octubre 2021, 17:34 PM¿Es eso lo que esta detectando el sistema? ¿Un waste.exe?

No; waste.exe es el ejecutable generado con el codigo que deje, en sus dos versiones. El sistema no detecta nada, esa es una conclusion apresurada y sin respaldo.

marax: edita los mensajes por favor en lugar de crear dos consecutivos.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

MinusFour

#16
Vaya, juraría que windows le daba prioridad a uno o dos núcleos por defecto. ¿Quizás mejore el rendimiento si le das una afinidad a los primeros dos cores? Siendo el proceso de un solo hilo...

Edit: Aún así, no creo que mejore el rendimiento drásticamente.

Usuario887

Cita de: Eternal Idol en 21 Octubre 2021, 17:40 PM
No; waste.exe es el ejecutable generado con el codigo que deje, en sus dos versiones. El sistema no detecta nada, esa es una conclusion apresurada y sin respaldo.

Ya lo se ya lo se... Fue una metafora. Me referia a que si el sistema operativo estaba detectando un programa que aparentemente no esta haciendo nada mas que dar vueltas en la nada.




Ya se que pasa... Comente la linea que llama a la funcion que reserva memoria y cargo los 20 MB en menos de tres segundos  :xD :xD :xD :xD :xD :xD

No se por que malloc es tan lenta... Bueno. Supongo que tendre que arreglarmelas sin listas enlazadas... A saber como hago eso... En fin.

Muchisimas gracias en verdad... No se cuanto habria tardado en darme cuenta de eso por mi mismo...

3 segundos... hijo de p*ta...

Eternal Idol

Cita de: marax en 21 Octubre 2021, 17:50 PM
Ya lo se ya lo se... Fue una metafora. Me referia a que si el sistema operativo estaba detectando un programa que aparentemente no esta haciendo nada mas que dar vueltas en la nada.

Si ese fuera el caso no le daria el 100% de un procesador logico a cada hilo de waste.exe  ;)

Cita de: MinusFour en 21 Octubre 2021, 17:43 PM
Vaya, juraría que windows le daba prioridad a uno o dos núcleos por defecto. ¿Quizás mejore el rendimiento si le das una afinidad a los primeros dos cores? Siendo el proceso de un solo hilo...

Edit: Aún así, no creo que mejore el rendimiento drásticamente.

Exactamente lo mismo de arriba.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

Usuario887

#19
Nada... La afinidad igual no era el problema. Me hubiera gustado que fuera cuestion solo de ajustar la afinidad porque no tendria que volver a programar todo otra vez xd




Por si a alguien le interesa:

Ya que de antemano conozco el tamaño del archivo, lo que hice fue modificar la funcion que adhiere al final de la lista creando un nuevo espacio de memoria para que en vez de eso simplemente cargase en un espacio mayor anteriormente reservado sumando el tamaño de la lista:

Es decir, de:

struct __quotesmem *newq=(struct __quotesmem *)malloc(sizeof(struct __quotesmem));
...

quotesmem->next=newq;


A:

memcpy((struct __quotesmem *) &quotesmem[i],
               (struct __quotesmem *) &newq,
               sizeof (struct __quotesmem));

        quotesmem[i].next=NULL;
        quotesmem[i-1].next=&quotesmem[i];
        quotesmem[i].last=&quotesmem[i-1];


Asi no tuve que modificar el comportamiento del programa entero ya que esta totalmente basado en listas enlazadas.




Gracias de nuevo.