Copy speeds (as reported by MSCV++ 6.0 Professional’s Profiler)
Using an array of 16 floats (10,000 copies)
Fastest – a[0] = b[0]; a[1] = b[1] …… etc.
Middle – memcpy(a, b, 64);
Slowest – a[y] = b[y];
Profiler results
|
Function Time |
% of time |
Func + Child Time |
% of time |
Hit count |
Function |
|
1.807 |
73.2 |
1.807 |
73.2 |
1 |
T3(void) |
|
0.514 |
20.8 |
0.514 |
20.8 |
1 |
T1(void) |
|
0.147 |
5.9 |
0.147 |
5.9 |
1 |
T2(void) |
|
0.002 |
0.1 |
2.469 |
100.0 |
1 |
_main |
Conclusion: don’t use memcpy in matrix/vector classes.
Code used:
int main()
{
T3();
T2();
T1();
return 0;
}
void T1()
{
for(int x = 0; x < 5000; x++)
{
memcpy(b, a, 64);
memcpy(a, b, 64);
}
}
void T2()
{
for(int x =0; x < 5000; x++)
{
b[0] = a[0];
b[1] = a[1];
b[2] = a[2];
b[3] = a[3];
b[4] = a[4];
b[5] = a[5];
b[6] = a[6];
b[7] = a[7];
b[8] = a[8];
b[9] = a[9];
b[10] = a[10];
b[11] = a[11];
b[12] = a[12];
b[13] = a[13];
b[14] = a[14];
b[15] = a[15];
a[0] = b[0];
a[1] = b[1];
a[2] = b[2];
a[3] = b[3];
a[4] = b[4];
a[5] = b[5];
a[6] = b[6];
a[7] = b[7];
a[8] = b[8];
a[9] = b[9];
a[10] = b[10];
a[11] = b[11];
a[12] = b[12];
a[13] = b[13];
a[14] = b[14];
a[15] = b[15];
}
}
void T3()
{
for(int x = 0; x < 5000; x++)
{
for(int y = 0; y < 16; y++)
{
a[y] = b[y];
}
for(y = 0; y < 16; y++)
{
b[y] = a[y];
}
}
}