4.4.3 CopyMem() and SetMem() Operations
The following example shows how to use the EDK II library
BaseMemoryLib
functions CopyMem()
and SetMem()
to improve the performance of a UEFI driver. These techniques apply to arrays, structures, or allocated buffers.Note: By default, the EDK II enables high levels of optimization, so this example may not build for all compilers because the loops are optimized into intrinsics that can cause the link to fail. So not only does use of 'CopyMem()' and 'SetMem()' improve performance, it also improves UEFI Driver portability.
#include <Uefi.h>
typedef struct {
UINT8 First;
UINT32 Second;
} MY_STRUCTURE;
UINTN Index;
UINT8 A[100];
UINT8 B[100];
MY_STRUCTURE MyStructureA;
MY_STRUCTURE MyStructureB;
//
// Using a loop is slow or structure assignments is slow
//
for (Index = 0; Index < 100; Index++) {
A[Index] = B[Index];
}
MyStructureA = MyStructureB;
//
// Using the optimized CopyMem() Boot Services is fast
//
CopyMem (
(VOID *)A,
(VOID *)B,
100
);
CopyMem (
(VOID *)&MyStructureA,
(VOID *)&MyStructureB,
sizeof (MY_STRUCTURE)
);
//
// Using a loop or individual assignment statements is slow
//
for (Index = 0; Index < 100; Index++) {
A[Index] = 0;
}
MyStructureA.First = 0;
MyStructureA.Second = 0;
//
// Using the optimized SetMem() Boot Service is fast.
//
SetMem ((VOID *)A, 100, 0);
SetMem ((VOID *)&MyStructureA, sizeof (MY_STRUCTURE), 0);
Last modified 2yr ago