MEMCOPY y copiar tablas

Started by Hola, October 28, 2017, 05:49:42 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Hola

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?

SplinterGU

no hice la comparacion, pero me suena que memcopy seria mas lento.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Hola

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..

SplinterGU

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.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

SplinterGU

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.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Hola

#5
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.

SplinterGU

#6

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]

Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Hola

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?

Hola

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.

SplinterGU

#9
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.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Hola

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..

SplinterGU

por ejemplo


for ( x = 0; x < 1000000; i++ )
...
end
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Hola

Ah perfecto. Gracias por toda la ayuda.

SplinterGU

de nada, despues, si puedes y quieres, comparte el ejemplo, los resultados y las caracteristicas del equipo en el que probaste.

gracias a ti.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2