Witam,
Mam takie pytanie, czy któryś z kolegów zastanawiał się nad sensem stosowania funkcji "memcpy" do kopiowania tablic typu "char" w pamięci programu?
Napisałem taki program:
Fragment programu znajdujący się pomiędzy komentarzami "start - stop" wykonuje się w 80 taktach zegara.
Zastępując teraz to "żmudne kopiowanie" funkcją "memcpy":
... zauważymy, że ten sam fragment kodu wykonuje się aż 145 taktów zegara - dwa razy dłużej!
Oczywiście zmieniając typ tablicy na np. "int" otrzymujemy już porządany efekt:
160 taktów dla "żmudnego kopiowania"
144 taktów dla "memcpy"
Zatem czy takie postępowanie jest zabiegiem czysto kosmetycznym (dla tablic typu char)? Można temu jakoś zaradzić?
Pozdrawiam,
Hiob.
Mam takie pytanie, czy któryś z kolegów zastanawiał się nad sensem stosowania funkcji "memcpy" do kopiowania tablic typu "char" w pamięci programu?
Napisałem taki program:
#include <string.h>
#include <avr/io.h>
#define MAC0_CELU_ARP 0
#define MAC0_ZRODLA_ARP 50
unsigned char bufor[100];
int main(void)
{
bufor[MAC0_CELU_ARP + 31] = bufor[MAC0_ZRODLA_ARP + 31];
//start
bufor[MAC0_CELU_ARP + 0] = bufor[MAC0_ZRODLA_ARP + 0];
bufor[MAC0_CELU_ARP + 1] = bufor[MAC0_ZRODLA_ARP + 1];
bufor[MAC0_CELU_ARP + 2] = bufor[MAC0_ZRODLA_ARP + 2];
bufor[MAC0_CELU_ARP + 3] = bufor[MAC0_ZRODLA_ARP + 3];
bufor[MAC0_CELU_ARP + 4] = bufor[MAC0_ZRODLA_ARP + 4];
bufor[MAC0_CELU_ARP + 5] = bufor[MAC0_ZRODLA_ARP + 5];
bufor[MAC0_CELU_ARP + 6] = bufor[MAC0_ZRODLA_ARP + 6];
bufor[MAC0_CELU_ARP + 7] = bufor[MAC0_ZRODLA_ARP + 7];
bufor[MAC0_CELU_ARP + 8] = bufor[MAC0_ZRODLA_ARP + 8];
bufor[MAC0_CELU_ARP + 9] = bufor[MAC0_ZRODLA_ARP + 9];
bufor[MAC0_CELU_ARP + 10] = bufor[MAC0_ZRODLA_ARP + 10];
bufor[MAC0_CELU_ARP + 11] = bufor[MAC0_ZRODLA_ARP + 11];
bufor[MAC0_CELU_ARP + 12] = bufor[MAC0_ZRODLA_ARP + 12];
bufor[MAC0_CELU_ARP + 13] = bufor[MAC0_ZRODLA_ARP + 13];
bufor[MAC0_CELU_ARP + 14] = bufor[MAC0_ZRODLA_ARP + 14];
bufor[MAC0_CELU_ARP + 15] = bufor[MAC0_ZRODLA_ARP + 15];
bufor[MAC0_CELU_ARP + 16] = bufor[MAC0_ZRODLA_ARP + 16];
bufor[MAC0_CELU_ARP + 17] = bufor[MAC0_ZRODLA_ARP + 17];
bufor[MAC0_CELU_ARP + 18] = bufor[MAC0_ZRODLA_ARP + 18];
bufor[MAC0_CELU_ARP + 19] = bufor[MAC0_ZRODLA_ARP + 19];
//stop
bufor[MAC0_CELU_ARP + 30] = bufor[MAC0_ZRODLA_ARP + 30];
for(;;);
return (0);
}
Fragment programu znajdujący się pomiędzy komentarzami "start - stop" wykonuje się w 80 taktach zegara.
Zastępując teraz to "żmudne kopiowanie" funkcją "memcpy":
#include <string.h>
#include <avr/io.h>
#define MAC0_CELU_ARP 0
#define MAC0_ZRODLA_ARP 50
unsigned char bufor[100];
int main(void)
{
bufor[MAC0_CELU_ARP + 31] = bufor[MAC0_ZRODLA_ARP + 31];
//start
memcpy(&bufor[MAC0_CELU_ARP], &bufor[MAC0_ZRODLA_ARP], 20);
//stop
bufor[MAC0_CELU_ARP + 30] = bufor[MAC0_ZRODLA_ARP + 30];
for(;;);
return (0);
}
... zauważymy, że ten sam fragment kodu wykonuje się aż 145 taktów zegara - dwa razy dłużej!
Oczywiście zmieniając typ tablicy na np. "int" otrzymujemy już porządany efekt:
160 taktów dla "żmudnego kopiowania"
144 taktów dla "memcpy"
Zatem czy takie postępowanie jest zabiegiem czysto kosmetycznym (dla tablic typu char)? Można temu jakoś zaradzić?
Pozdrawiam,
Hiob.
