PRINT follao

Todo sobre la creación, diseño y programación de nuevo software para
nuestro Spectrum

Moderador: Sir Cilve Sinclair

Responder
Bubu
Freddy Hardest
Mensajes: 544
Registrado: Mié Oct 31, 2007 12:15 am

PRINT follao

Mensaje por Bubu » Mar Ene 01, 2008 3:34 am

Feliz 2k8 a toda la speccipeña.

Yos toy mu malito

Bueno, oyes, ¿cuál es la manera Más Rápida (aunque gaste más memoria) para imprimir en BASIC "Feliz 2008" ?

A parte de

Código: Seleccionar todo

10 PRINT "Feliz 2008"

Avatar de Usuario
mcleod_ideafix
Johnny Jones
Mensajes: 3985
Registrado: Vie Sep 21, 2007 1:26 am
Ubicación: Jerez de la Frontera
Contactar:

Re: PRINT follao

Mensaje por mcleod_ideafix » Mar Ene 01, 2008 3:21 pm

En BASIC? Esa es la forma más rápida.
Web: ZX Projects | Twitter: @zxprojects

Bubu
Freddy Hardest
Mensajes: 544
Registrado: Mié Oct 31, 2007 12:15 am

Re: PRINT follao

Mensaje por Bubu » Jue Ene 03, 2008 1:19 am

Rehago la pregunta:

¿cómo se puede medir en BASIC el tiempo de ejecución de una serie de instrucciones? Creo recordar que había un par de direcciones en la RAM cuyos valores contenidos se iban incrementando cada x milisegundos. Supongamos que son M1 y M2 esas direcciones. Entonces, para medir el tiempo de una serie de instrucciones sólo habría que hacer esto:

Código: Seleccionar todo

10 LET INI = (PEEK M1) + 256*(PEEK M2)
20 instruccion 1
30 instruccion 2
...
70 instruccion N
80 LET FIN = (PEEK M1) + 256*(PEEK M2)
90 PRINT FIN - INI


¿no?

Así, FIN - INI nos da la "duración" de las N instrucciones, y podemos comparar si

Código: Seleccionar todo

10 PRINT "Feliz 2008"


es más o no más rápido que

Código: Seleccionar todo

10 LET A$="Feliz 2008"
20 PRINT A$

rockersuke
Jack The Nipper
Mensajes: 105
Registrado: Vie May 11, 2007 1:08 am

Re: PRINT follao

Mensaje por rockersuke » Jue Ene 03, 2008 8:58 am

Bubu escribió:¿cómo se puede medir en BASIC el tiempo de ejecución de una serie de instrucciones? Creo recordar que había un par de direcciones en la RAM cuyos valores contenidos se iban incrementando cada x milisegundos. Supongamos que son M1 y M2 esas direcciones. Entonces, para medir el tiempo de una serie de instrucciones sólo habría que hacer esto:


Se trata de la variable del sistema FRAMES, entre 23672 y 23674. Lo más rápido es ponerlos a cero pokeando, ejecutar las instrucciones que quieras medir, y luego mirar "cuantas frames" han transcurrido peekeando. Es cualquier cosa menos preciso (usado desde y para BASIC), pero desde luego sí te puede aclarar en términos absolutos si una alternativa es o no más rápida que otra. Ejemplo en un post mío sobre otro tema aquí

Bubu
Freddy Hardest
Mensajes: 544
Registrado: Mié Oct 31, 2007 12:15 am

Re: PRINT follao

Mensaje por Bubu » Jue Ene 03, 2008 4:26 pm

¡¡ Eso es, FRAMES !!

Hi hecho este pograma:

Código: Seleccionar todo

10 GO SUB 9000: LET ini = x
20 FOR n = 1 TO 100: PRINT AT 10, 10; "Feliz 2008": Next n
30 GOSUB 9000: LET fin = x
40 PRINT fin - ini
8999 STOP
9000 LET x = PEEK 23672 + 256*23673 + 256*256*23684: RETURN


y produce un resultado de 72 frames. Si el texto lo asocio a una variable y hago el PRINT de esa variable:

Código: Seleccionar todo

10 GO SUB 9000: LET ini = x
20 FOR n = 1 TO 100: LET a$="Feliz 2008": PRINT AT 10, 10; a$: Next n
30 GOSUB 9000: LET fin = x
40 PRINT fin - ini
8999 STOP
9000 LET x = PEEK 23672 + 256*23673 + 256*256*23684: RETURN


produce un resultado de 95 frames. Más lento, jiji. Incluso si hubiera que imprimir N veces lo mismo, es mejor escribir N veces el texto a pelo, que almacenarlo en una variable y escribir N veces la variable, porque si sustituyo la línea 20 por:

Código: Seleccionar todo

20 LET a$="Feliz 2008": FOR n = 1 TO 100: PRINT AT 10, 10; a$: NEXT n


resulta un total de 75 frames, que es superior a los 72 frames iniciales.

Gracias por la indicación, rockersuke

Avatar de Usuario
mcleod_ideafix
Johnny Jones
Mensajes: 3985
Registrado: Vie Sep 21, 2007 1:26 am
Ubicación: Jerez de la Frontera
Contactar:

Re: PRINT follao

Mensaje por mcleod_ideafix » Jue Ene 03, 2008 6:25 pm

Me pregunto si será aún más rápido si sustituyes:

Código: Seleccionar todo

20 LET a$="Feliz 2008": FOR n = 1 TO 100: PRINT AT 10, 10; a$: NEXT n

Por:

Código: Seleccionar todo

20 LET a$=CHR$ 22+CHR$ 10+CHR$ 10+"Feliz 2008": FOR n = 1 TO 100: PRINT a$: NEXT n
Web: ZX Projects | Twitter: @zxprojects

Bubu
Freddy Hardest
Mensajes: 544
Registrado: Mié Oct 31, 2007 12:15 am

Re: PRINT follao

Mensaje por Bubu » Jue Ene 03, 2008 8:22 pm

Pues vamos allá: 68 frames.
Y sin usar variables pero poniendo el PRINT a pelo con los CHR$ en lugar de AT salen 117 frames, qué bárbaro, casi el doble.

Avatar de Usuario
Metalbrain
Freddy Hardest
Mensajes: 592
Registrado: Lun May 07, 2007 8:17 am
Ubicación: Sevilla
Contactar:

Re: PRINT follao

Mensaje por Metalbrain » Jue Ene 03, 2008 9:03 pm

Lo más rápido seguramente sea:

Código: Seleccionar todo

20 FOR n = 1 TO 100: PRINT AT 10, 10; "***Feliz 2008": Next n


Y ahora pokeando los códigos de 22,10,10 en encima de los asteriscos. :twisted:

Probando... ¡60!
SevenuP se escribe con u minúscula y P mayúscula.

Avatar de Usuario
mcleod_ideafix
Johnny Jones
Mensajes: 3985
Registrado: Vie Sep 21, 2007 1:26 am
Ubicación: Jerez de la Frontera
Contactar:

Re: PRINT follao

Mensaje por mcleod_ideafix » Jue Ene 03, 2008 9:33 pm

Vale... veo tus 60 y bajo a.... ¡¡¡18!!!

Eso sí, ya no es en BASIC... ;)

Código: Seleccionar todo

void main (void)
{
  long ti,tf;
  BYTE i;
  WORD elaps;
  BYTE num[6];

  cls(PWHITE|IBLACK);
  ti=frames();
  for (i=1;i<=100;i++)
  {
    locate(10,10);
    puts("Feliz 2008");
  }
  tf=frames();
  elaps=tf-ti;

  cls(PWHITE|IBLACK);
  puts ("Ha tardado ");
  u16todec(elaps,num);
  puts (num);
  puts (" frames.");
}
Web: ZX Projects | Twitter: @zxprojects

Bubu
Freddy Hardest
Mensajes: 544
Registrado: Mié Oct 31, 2007 12:15 am

Re: PRINT follao

Mensaje por Bubu » Jue Ene 03, 2008 9:36 pm

¡¡ Tramposo !! Y yo acabo de poner un postit en el monitor que pone a boli "Feliz 2008" y ha tardado 5 frames, jiji.

No, en serio, ¿se puede almacenar un byte en la memoria del programa pulsando p.ej. CAPS SHIFT + SYMBOL SHIFT + 9 + código ASCII? Si esto hiciera almacenar el código ascii en el lugar correspondiente del pograma, no habría que estar escribiendo CHR$, pero nu sé si se puede hacer ese poke con el teclado al pogramar.

Avatar de Usuario
mcleod_ideafix
Johnny Jones
Mensajes: 3985
Registrado: Vie Sep 21, 2007 1:26 am
Ubicación: Jerez de la Frontera
Contactar:

Re: PRINT follao

Mensaje por mcleod_ideafix » Jue Ene 03, 2008 9:54 pm

Bubu escribió:¡¡ Tramposo !! Y yo acabo de poner un postit en el monitor que pone a boli "Feliz 2008" y ha tardado 5 frames, jiji.

No vale. Tienes que escribir 100 post-its con la frase "Feliz 2008" y pegarlos uno justo encima del otro, aproximadamente en el centro de la pantalla, para que sea equivalente. :P
Bubu escribió:No, en serio,

A ver...
Bubu escribió:¿se puede almacenar un byte en la memoria del programa pulsando p.ej. CAPS SHIFT + SYMBOL SHIFT + 9 + código ASCII?

¿Pues no decías que la pregunta iba en serio? :P
Web: ZX Projects | Twitter: @zxprojects

Bubu
Freddy Hardest
Mensajes: 544
Registrado: Mié Oct 31, 2007 12:15 am

Re: PRINT follao

Mensaje por Bubu » Jue Ene 03, 2008 9:58 pm

jaja, qué cabrón, o sea, que no, ¿no? Ej que como en un PC pulsando ALT + 0 + código ASCII se almacena ese código, pensaba yo que alguna combinación rara de esas tipo CAPS + SYMBOL haría algo así. Pero en fins, debe ser que todavía tengo la resaca del fin de año, jiji

Responder

¿Quién está conectado?

Usuarios navegando por este Foro: Ahrefs [Bot], Bing [Bot], Google [Bot] y 16 invitados