¿Qué carga menos o que carga más?

Estado

🔒 Este tema está cerrado para nuevas respuestas.

⏰ Solo el creador del tema puede solicitar la reapertura de sus propios temas, pero únicamente dentro de los 60 días previos a la última actualización.

DoctorPC Seguir

1
Pi
SEO
Verificado
Verificación en dos pasos activada
Verificado por Whatsapp
¡Ha verificado su Paypal!
Verificado por Binance
Suscripción a IA
Desde
10 Dic 2010
Mensajes
6.062
Hola
Pregunta técnica. Uso el plugin WP125 para mostrar unos banners de forma aleatorea.
El problema es que me mandaron un warning por uso de CPU (el clásico) y el problema son los banners aleatoreos: unos 200 banners y muchas páginas vistas con 4 banners por página.

Tengo la opción de pasar esos random a PHP, o sea, lo mismo que hace el plugin pero a código puro (con un array), que es lo que mostraría en mis páginas.

¿Que carga más el procesador: la consulta a la BD o el random en código por PHP?

Cualquier otra idea es bienvenida

(favor no mencionar el sacar algunos banners, es algo que ya tengo en la lista)
 
Última edición:

Brandon Díaz

Lambda
SEO
Verificación en dos pasos activada
Desde
24 Nov 2011
Mensajes
2.821
Como funciona el plugin WP125??

Por lo que mencionas de la consulta de BD me imagino un poco el funcionamiento, pero no al cien

Realiza solo una consulta, o realiza varias consultas a la BD?
 

DoctorPC

1
Pi
SEO
Verificado
Verificación en dos pasos activada
Verificado por Whatsapp
¡Ha verificado su Paypal!
Verificado por Binance
Suscripción a IA
Desde
10 Dic 2010
Mensajes
6.062
El plugin tiene varias tablas:

`id`, `slot`, `name`, `clicks`, `start_date`, `end_date`, `status`, `target`, `image_url`, `pre_exp_email`

De esas al momento de hacer la consulta usa 4
id, name, target y image_url

El resto no las estoy usando.
Apartir de la línea 105 hace el proceso de "crear el banner"


Ver el archivo adjunto wp125.txt


Cambiar extensión a PHP para ver el archivo.
En la línea 129 aparece:

if ($setting_ad_order == 'random') {
srand((float)microtime() * 1000000);
shuffle($adguidearray);

¿Podré bajar la carga usando un tiempo más corto?
 

Brandon Díaz

Lambda
SEO
Verificación en dos pasos activada
Desde
24 Nov 2011
Mensajes
2.821
No creo que ese sea el problema, la funcion shuffle solo revuelve el array para que quede un poco aleatorio, y eso de srand(etc) comienza el generador de numeros aleatorios para la funcion shuffle (que a partir de php 4.2 ya no es necesario inicializar)

Ese microtime()*1000000 solo obtiene el tiempo en microsegundos del sistema y lo multiplica para que quede de la forma 4 y no .000004, se llama la semilla, para generar tu numero aleatorio, pero de nuevo, a partir de php 4.2 no es necesario incluir una semilla)

Pero creo que he encontrado el problema, en la linea 116:

if ($setting_ad_order == 'random') { $theorder = 'RAND() LIMIT '.$setting_num_slots; } else { $theorder = 'slot ASC'; }

y luego en la 118:

$theads = $wpdb->get_results("SELECT * FROM $adtable_name WHERE status = '1' $exclude_sql ORDER BY $theorder", ARRAY_A);

Con esa $theorder lo que hace es una sentencia sql del tipo
SELECT * FROM * WHERE * ORDER BY RAND() LIMIT numerolimite....

Y ahi esta el problema, lo que hace esa consulta es seleccionar TODOS los registros de la tabla, despues ordena aleatoriamente TODOS los registros de la tabla, y al final te devuelve numerolimite registros de TODOS los que selecciono y ordeno

LUEEEEEGO, el codigo lo que hace es que obtiene cada uno de los registros que sacaste de la BD (numerolimite registros) "foreach ($theads as $thead){", verifica no se que "wp125_CheckAdDate($thead['end_date'], $thead['id']," y luego los acomoda en un arreglo "$adguidearray", el cual DESPUEEES vuelve a "randomizar", con las lineas de codigo que tu pusiste, randomiza el arreglo donde ya tiene registros aleatorios de la base


El problema del uso de CPU debe estar en el uso del ORDER BY RAND()

INTENTA eliminar la parte que dice RAND() y agregando el order by en la linea 116! Quedando:

if ($setting_ad_order == 'random') { $theorder = 'LIMIT '.$setting_num_slots; } else { $theorder = 'ORDER BY slot ASC'; }

y en la 118 quita el ORDER BY, que quede algo como:

$theads = $wpdb->get_results("SELECT * FROM $adtable_name WHERE status = '1' $exclude_sql $theorder", ARRAY_A);
 
Última edición:

DoctorPC

1
Pi
SEO
Verificado
Verificación en dos pasos activada
Verificado por Whatsapp
¡Ha verificado su Paypal!
Verificado por Binance
Suscripción a IA
Desde
10 Dic 2010
Mensajes
6.062
No creo que ese sea el problema, la funcion shuffle solo revuelve el array para que quede un poco aleatorio, y eso de srand(etc) comienza el generador de numeros aleatorios para la funcion shuffle (que a partir de php 4.2 ya no es necesario inicializar)

Ese microtime()*1000000 solo obtiene el tiempo en microsegundos del sistema y lo multiplica para que quede de la forma 4 y no .000004, se llama la semilla, para generar tu numero aleatorio, pero de nuevo, a partir de php 4.2 no es necesario incluir una semilla)

Pero creo que he encontrado el problema, en la linea 116:

if ($setting_ad_order == 'random') { $theorder = 'RAND() LIMIT '.$setting_num_slots; } else { $theorder = 'slot ASC'; }

y luego en la 118:

$theads = $wpdb->get_results("SELECT * FROM $adtable_name WHERE status = '1' $exclude_sql ORDER BY $theorder", ARRAY_A);

Con esa $theorder lo que hace es una sentencia sql del tipo
SELECT * FROM * WHERE * ORDER BY RAND() LIMIT numerolimite....

Y ahi esta el problema, lo que hace esa consulta es seleccionar TODOS los registros de la tabla, despues ordena aleatoriamente TODOS los registros de la tabla, y al final te devuelve numerolimite registros de TODOS los que selecciono y ordeno

LUEEEEEGO, el codigo lo que hace es que obtiene cada uno de los registros que sacaste de la BD (numerolimite registros) "foreach ($theads as $thead){", verifica no se que "wp125_CheckAdDate($thead['end_date'], $thead['id']," y luego los acomoda en un arreglo "$adguidearray", el cual DESPUEEES vuelve a "randomizar", con las lineas de codigo que tu pusiste, randomiza el arreglo donde ya tiene registros aleatorios de la base


El problema del uso de CPU debe estar en el uso del ORDER BY RAND()

INTENTA eliminar la parte que dice RAND() y agregando el order by en la linea 116! Quedando:

if ($setting_ad_order == 'random') { $theorder = 'LIMIT '.$setting_num_slots; } else { $theorder = 'ORDER BY slot ASC'; }

y en la 118 quita el ORDER BY, que quede algo como:

$theads = $wpdb->get_results("SELECT * FROM $adtable_name WHERE status = '1' $exclude_sql $theorder", ARRAY_A);

Uff gracias por esa respuesta, era exactamente lo que necesitaba =D!!. Modificaré el plugin a futuro con las referencias tuyas. Gracias nuevamente!

En definitiva: El plugin realiza muchos procesos para algo que no debería cargar tanto, por tanto pase el random a código y creo que ya no cargará tanto el CPU.

¿Alguna herramienta recomendada para ver la carga del procesador?
 
Última edición:

DoctorPC

1
Pi
SEO
Verificado
Verificación en dos pasos activada
Verificado por Whatsapp
¡Ha verificado su Paypal!
Verificado por Binance
Suscripción a IA
Desde
10 Dic 2010
Mensajes
6.062
Carga menos un random en PHP, cierro el tema.
 
Estado

🔒 Este tema está cerrado para nuevas respuestas.

⏰ Solo el creador del tema puede solicitar la reapertura de sus propios temas, pero únicamente dentro de los 60 días previos a la última actualización.

Arriba