04. april 2005 - 21:10Der er
14 kommentarer og 1 løsning
fast copy memory block
Jeg har 2 pointere (p1 og p2). Den ene - p1 - peger paa noget data, den anden - p2 - peger paa en destination. Hvordan kopierer jeg alt det p1 peger paa over til der hvor p2 peger paa? Lad os antage at p1 peger paa noget data der er length bytes i laengde...
Jeg tror ikke på int kopierings funktionen på CPU arkitekturer med en instruktion som kan flytte mange bytes. Kun hvis memcpy alligevel skal lave en løkke kan der være en fordel.
Med optimering enabled kan Func gøre det næsten lige så hurtigt som memcpy: G++: 2250/1906 Bcc32: 2297/1968 Mars: 2265/1985 Så med disse er der ikke sparet noget ved at lave sin egen memcpy.
C:\>moving memcpy 1390 (A) int loop 12594 (A) memcpy 1391 (A) int loop 12593 (A) memcpy 1391 (A) int loop 12594 (A)
C:\>gcc -O6 moving.c -o moving.exe
C:\>moving memcpy 1421 (A) int loop 2547 (A) memcpy 1438 (A) int loop 2562 (A) memcpy 1422 (A) int loop 2547 (A)
C:\>cl moving.c Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 13.10.3052 for 80x86 Copyright (C) Microsoft Corporation 1984-2002. All rights reserved.
moving.c Microsoft (R) Incremental Linker Version 7.10.3052 Copyright (C) Microsoft Corporation. All rights reserved.
/out:moving.exe moving.obj
C:\>moving memcpy 2312 (A) int loop 11047 (A) memcpy 2312 (A) int loop 11047 (A) memcpy 2312 (A) int loop 11047 (A)
C:\>cl /Ox moving.c Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 13.10.3052 for 80x86 Copyright (C) Microsoft Corporation 1984-2002. All rights reserved.
moving.c Microsoft (R) Incremental Linker Version 7.10.3052 Copyright (C) Microsoft Corporation. All rights reserved.
/out:moving.exe moving.obj
C:\>moving memcpy 1015 (A) int loop 1031 (A) memcpy 1032 (A) int loop 1015 (A) memcpy 1032 (A) int loop 1015 (A)
Et par hurtige hastigheds test viser at CopyMemory er meget præcis lige så hurtig/langsom som memcpy. Så der er ikke rigtigt nogen grund til at bruge den.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.