Gå til innhold

[Løst] strncpy vs memcpy


Anbefalte innlegg

I forbindelse med et lite forsøk på assembly-programmering ble jeg (litt tilfeldig) oppmerksom på ytelsesforskjellen på strncpy og memcpy. Utskriften under viser en kjøring av programmet der jeg bruker memcpy:

randomStrGen		91.10 megabytes/s (used 10976.70 ms)
array copy		 937.09 megabytes/s (used  1067.13 ms)
stringRotationASM  686.80 megabytes/s (used  1456.02 ms)
stringRotation2	746.43 megabytes/s (used  1339.71 ms)

Linjen som starter med "array copy" sier noe om hvor lang tid memcpy med 1 GB med data (char-array) tar. "stringRotation2"-metoden er en metode som bytter om alle forekomster av 'a'-'m' med 'n'-'z' og omvendt, og det samme for store bokstaver (ROT13).

 

Hvis jeg endrer programmet til å bruke strncpy istedenfor memcpy blir utskriften slik:

randomStrGen		90.45 megabytes/s (used 11055.56 ms)
array copy		   1.37 gigabytes/s (used   729.57 ms)
stringRotationASM  687.54 megabytes/s (used  1454.46 ms)
stringRotation2	  1.95 gigabytes/s (used   511.61 ms)

 

Kan noen forklare hvorfor strncpy er raskere (hadde absolutt forventet det motsatte), og ikke minst, hvorfor påvirker dette stringRotation2-hastigheten?

 

Dette er kjørt på Ubuntu 12.4 LTS (64-bit), med GCC 4.6.3. Prosessoren er en AMD A6-3410mx.

Endret av jonny
Lenke til kommentar
Videoannonse
Annonse

Er du sikker på at

  • du ikke har noe bugs i programmet ditt, f.eks. embedded '\0' i dataene som får strcpy til å avslutte tidligere enn memcpy
  • du har nok memory så du ikke blir lurt av swapping og at rekkefølgen du kjører programmene gir ulik disk cache hit
  • at programmet er organisert slik at strcpy får mye mer L1/L2/L3 cache hit (husker ikke detaljene for CPU'en din) enn memcpy varianten

Lenke til kommentar

Takk for svar! Det er jeg som har klart (utrolig nok) å misforstå hvordan strncpy fungerer. Ditt første punkt ('\0' i dataene som kopieres) er det som skjer her. Jeg sammenligner de to array'ene etter de har vært gjennom ROT13-algoritmen, men bruker der strncmp, som også avslutter så fort en '\0' dukker opp.

 

Etter å ha endret metoden som genererer random data til å aldri generere '\0', ser resultatene slik ut (fortsatt med 1 GB data):

 

strncpy:

randomStrGen					 82.03 MB/s (used 12190.40 ms)
array copy					  588.65 MB/s (used  1698.81 ms)
stringRotationASM			   679.46 MB/s (used  1471.75 ms)
stringRotation2				 734.92 MB/s (used  1360.70 ms)

 

memcpy:

randomStrGen					 85.41 MB/s (used 11708.80 ms)
array copy					  942.94 MB/s (used  1060.51 ms)
stringRotationASM			   681.39 MB/s (used  1467.58 ms)
stringRotation2				 736.18 MB/s (used  1358.36 ms)

 

Som jo ser litt mer riktig ut...

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...