Bennu Game Development

Foros en Español => Mesa de Ayuda => Topic started by: Hola on October 28, 2017, 05:49:42 PM

Title: MEMCOPY y copiar tablas
Post by: Hola on October 28, 2017, 05:49:42 PM
Hola de nuevo, quería plantear una duda respecto a este tema de copiar el contenido de una tabla a otra. Lo que quiero saber es, qué método seria mas rápido o eficiente a nivel interno en este caso, si tirarse escribiendo:



Tabla[0]=Tabla2[0]; y asi con todos los demas elementos.


Ó usar MEMCOPY?


Teniendo en cuenta que el tamaño de ambas tablas es el mismo y los valores son de un solo dìgito. De la primera forma obviamente ocuparia mas codigo y seria un poco sucio pero seria un método mas veloz que memcopy o es igual? Me explico?
Title: Re:MEMCOPY y copiar tablas
Post by: SplinterGU on October 28, 2017, 11:21:48 PM
no hice la comparacion, pero me suena que memcopy seria mas lento.
Title: Re:MEMCOPY y copiar tablas
Post by: Hola on October 29, 2017, 12:10:50 AM
Gracias splinter.., mm, si, eso pensé..., digo, a simple vista cualquiera pensaría que la primera forma es más rápida ya que la otra es una función y todo ese tema, pero esperaba que tal vez podría obtener una respuesta mas exacta.., sobretodo viniendo de ti splinter que eres el diseñador de bennu. Yo no se cómo se hace la comparación..., leí por otros post tambien que poniendo tabla1=tabla2; funciona (segun el manual de bennu dice que no). Uhm.., no se si puedes agregarme algo mas o sino esta bien, me sirve igual.


Salu2..
Title: Re:MEMCOPY y copiar tablas
Post by: SplinterGU on October 29, 2017, 12:55:30 AM
cuidado, si intentas copiar la tabla entera, seguramente memcopy sea mas rapida, pero esto no sirve para tablas de strings, tablas de strings deben copiarse con tabla1=tabla2.

si copias un 1 item, sin dudas es mas rapida la asignacion, ya que ambos empujan elementos al stack y recuperan elementos, pero en el caso del memcpy empuja mas elementos y tiene incluso una llamada a funcion.

repito, siempre 1 cuando sea 1 elemento, y no una tabla entera o una serie de elementos de una tabla.

y otra cosa importantisima, no usar memcpy con strings.
Title: Re:MEMCOPY y copiar tablas
Post by: SplinterGU on October 29, 2017, 01:02:11 AM
por si no quedo claro, para una tabla entera (que no sea, una tabla de 1 o 2 elementos, digamos 30, 100 o 1000) es mas rapido memcopy, con las restricciones dadas.
Title: Re:MEMCOPY y copiar tablas
Post by: Hola on October 29, 2017, 02:07:17 AM
Gracias por contestar, una pregunta más, para ser exactos, la tabla que necesito copiar es tabla[8][8]; osea bidimensional, lo que me comentas se aplica de igual forma en este caso? 

Edit.., osea copiar el contenido de esa tabla bidimensional a otra tabla bidimensional de 8x8 también.
Title: Re:MEMCOPY y copiar tablas
Post by: SplinterGU on October 29, 2017, 03:29:58 AM

import "mod_say";
import "mod_mem";


global
    int tabla1[8][8];
    int tabla2[8][8];
end

private
    int i,ii;
    string row;
begin

    tabla1[0][0] = 1;
    tabla1[0][1] = 2;
    tabla1[0][2] = 3;
    tabla1[0][3] = 4;
    tabla1[1][4] = 8;
    tabla1[1][5] = 7;
    tabla1[1][6] = 6;
    tabla1[1][7] = 5;

    say("- tabla1 ----");

    for ( i = 0; i < 9; i++ )
        row = "";
        for ( ii = 0; ii < 9; ii++ )
            row += "[" + tabla1[i][ii] + "] ";
        end
        say( row );
    end

    say("- tabla2 (asignacion) ----");

    tabla2 = tabla1;

    for ( i = 0; i < 9; i++ )
        row = "";
        for ( ii = 0; ii < 9; ii++ )
            row += "[" + tabla2[i][ii] + "] ";
        end
        say( row );
    end

    say("- tabla2 (clear) ----");

    memset(&tabla2[0],0,sizeof(tabla2));

    for ( i = 0; i < 9; i++ )
        row = "";
        for ( ii = 0; ii < 9; ii++ )
            row += "[" + tabla2[i][ii] + "] ";
        end
        say( row );
    end

    say("- tabla2 (memcopy) ----");

    memcopy(&tabla2[0],&tabla1[0],sizeof(tabla1));

    for ( i = 0; i < 9; i++ )
        row = "";
        for ( ii = 0; ii < 9; ii++ )
            row += "[" + tabla2[i][ii] + "] ";
        end
        say( row );
    end

end


output:


$ bgdi tabla_copy     
- tabla1 ----
[1] [2] [3] [4] [0] [0] [0] [0] [0]
[0] [0] [0] [0] [8] [7] [6] [5] [0]
[0] [0] [0] [0] [0] [0] [0] [0] [0]
[0] [0] [0] [0] [0] [0] [0] [0] [0]
[0] [0] [0] [0] [0] [0] [0] [0] [0]
[0] [0] [0] [0] [0] [0] [0] [0] [0]
[0] [0] [0] [0] [0] [0] [0] [0] [0]
[0] [0] [0] [0] [0] [0] [0] [0] [0]
[0] [0] [0] [0] [0] [0] [0] [0] [0]
- tabla2 (asignacion) ----
[1] [2] [3] [4] [0] [0] [0] [0] [0]
[0] [0] [0] [0] [8] [7] [6] [5] [0]
[0] [0] [0] [0] [0] [0] [0] [0] [0]
[0] [0] [0] [0] [0] [0] [0] [0] [0]
[0] [0] [0] [0] [0] [0] [0] [0] [0]
[0] [0] [0] [0] [0] [0] [0] [0] [0]
[0] [0] [0] [0] [0] [0] [0] [0] [0]
[0] [0] [0] [0] [0] [0] [0] [0] [0]
[0] [0] [0] [0] [0] [0] [0] [0] [0]
- tabla2 (clear) ----
[0] [0] [0] [0] [0] [0] [0] [0] [0]
[0] [0] [0] [0] [0] [0] [0] [0] [0]
[0] [0] [0] [0] [0] [0] [0] [0] [0]
[0] [0] [0] [0] [0] [0] [0] [0] [0]
[0] [0] [0] [0] [0] [0] [0] [0] [0]
[0] [0] [0] [0] [0] [0] [0] [0] [0]
[0] [0] [0] [0] [0] [0] [0] [0] [0]
[0] [0] [0] [0] [0] [0] [0] [0] [0]
[0] [0] [0] [0] [0] [0] [0] [0] [0]
- tabla2 (memcopy) ----
[1] [2] [3] [4] [0] [0] [0] [0] [0]
[0] [0] [0] [0] [8] [7] [6] [5] [0]
[0] [0] [0] [0] [0] [0] [0] [0] [0]
[0] [0] [0] [0] [0] [0] [0] [0] [0]
[0] [0] [0] [0] [0] [0] [0] [0] [0]
[0] [0] [0] [0] [0] [0] [0] [0] [0]
[0] [0] [0] [0] [0] [0] [0] [0] [0]
[0] [0] [0] [0] [0] [0] [0] [0] [0]
[0] [0] [0] [0] [0] [0] [0] [0] [0]

Title: Re:MEMCOPY y copiar tablas
Post by: Hola on October 29, 2017, 02:14:09 PM
Hola, agradezco el ejemplo, pero yo preguntaba si se aplicaba lo mismo en el sentido de que, al ser la tabla bidimensional 8x8, copiar con memcopy resulta mas rápido que ir asignando cada elemento?
Title: Re:MEMCOPY y copiar tablas
Post by: Hola on October 29, 2017, 02:55:50 PM
Vaya, acabo de probar tabla1=tabla2 así nomas y me copio la tabla, que joya, no sabia que funcionaba. Aun así me gustaría la respuesta de mi post anterior.
Title: Re:MEMCOPY y copiar tablas
Post by: SplinterGU on October 30, 2017, 10:14:10 AM
si, varios elementos a la vez (las dimensiones que sean) es mas rapido que asignacion.

puedes probar el ejemplo que te pase, encerrando en loops de varios millones cada instruccion y tomar los tiempos. Y tendras una respuesta mas exacta de cual es mas rapido y por cuanto.
Title: Re:MEMCOPY y copiar tablas
Post by: Hola on October 30, 2017, 01:49:38 PM
Hola splinter, ya me quedo todo mas claro, gracias, lo único que no entendí es eso de 'loops de varios millones' si puedes explicarme que quisiste decir..
Title: Re:MEMCOPY y copiar tablas
Post by: SplinterGU on October 30, 2017, 08:16:17 PM
por ejemplo


for ( x = 0; x < 1000000; i++ )
...
end
Title: Re:MEMCOPY y copiar tablas
Post by: Hola on October 30, 2017, 10:09:09 PM
Ah perfecto. Gracias por toda la ayuda.
Title: Re:MEMCOPY y copiar tablas
Post by: SplinterGU on October 31, 2017, 05:11:05 PM
de nada, despues, si puedes y quieres, comparte el ejemplo, los resultados y las caracteristicas del equipo en el que probaste.

gracias a ti.