jonny Skrevet 6. oktober 2012 Del Skrevet 6. oktober 2012 (endret) 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 6. oktober 2012 av jonny Lenke til kommentar
asicman Skrevet 8. oktober 2012 Del Skrevet 8. oktober 2012 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
jonny Skrevet 8. oktober 2012 Forfatter Del Skrevet 8. oktober 2012 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
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå