Skip to content

Instantly share code, notes, and snippets.

@AndrewTsao
Last active April 11, 2016 02:28
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save AndrewTsao/51c97dd884e11afa439281e593a80e4c to your computer and use it in GitHub Desktop.
Save AndrewTsao/51c97dd884e11afa439281e593a80e4c to your computer and use it in GitHub Desktop.
测试alignment对内存访问性能的影响
#include <iostream>
#include <stdint.h>
template<typename T>
inline void copy_byte(uint8_t* dst, uint8_t* src, size_t size ) {
T* sdst = (T*)dst;
T* ssrc = (T*)src;
size /= sizeof(T);
clock_t s = clock();
while (size-- > 0)
*sdst++ = *ssrc++;
clock_t e = clock();
std::cout << "size:" << sizeof(T) << "," << (e - s) * 1.0/(CLOCKS_PER_SEC) << std::endl;
}
int main(int argc, char** argv) {
const size_t kSize = 1024*1024*100;
uint8_t* dst = (uint8_t*) malloc(kSize);
uint8_t* src = (uint8_t*) malloc(kSize);
std::cout << (void*)dst << std::endl;
for (int i = 0; i < 8; i++) {
std::cout << (void*)(dst + i) << std::endl;
clock_t s = clock();
memcpy(dst + i, src + i, kSize - i);
clock_t e = clock();
std::cout << (e - s) * 1.0/CLOCKS_PER_SEC << std::endl;
copy_byte<uint8_t>(dst + i, src + i, kSize - i);
copy_byte<uint16_t>(dst + i, src + i, kSize - i);
copy_byte<uint32_t>(dst + i, src + i, kSize - i);
copy_byte<size_t>(dst + i, src + i, kSize - i);
}
// memcpy(dst + 1, src + 1, kSize - 1);
return 0;
}
/*
caoshiweideMacBook-Pro:test caoshiwei$ g++ -O3 alignment.cc
caoshiweideMacBook-Pro:test caoshiwei$ ./a.out
0x10652f000
0x10652f000
0.099874
size:1,0.017212
size:2,0.016584
size:4,0.025358
size:8,0.017103
0x10652f001
0.015442
size:1,0.025877
size:2,0.016838
size:4,0.017774
size:8,0.021104
0x10652f002
0.01942
size:1,0.025366
size:2,0.019621
size:4,0.025841
size:8,0.018191
0x10652f003
0.020936
size:1,0.022729
size:2,0.023116
size:4,0.029354
size:8,0.022287
0x10652f004
0.022226
size:1,0.023343
size:2,0.023158
size:4,0.017101
size:8,0.022718
0x10652f005
0.021892
size:1,0.023646
size:2,0.025684
size:4,0.019284
size:8,0.026392
0x10652f006
0.019575
size:1,0.021858
size:2,0.024489
size:4,0.025159
size:8,0.023368
0x10652f007
0.018965
size:1,0.026968
size:2,0.01899
size:4,0.025701
size:8,0.020535
*/
#include <iostream>
#include <stdint.h>
int main(int argc, char** argv) {
const size_t kSize = 1024*1024;
uint8_t* mem1 = (uint8_t*) malloc(kSize*sizeof(double));
uint8_t* mem2 = (uint8_t*) malloc(kSize*sizeof(double));
std::cout << (void*) mem1 << "," << (void*) mem2 << std::endl;
for (int i = 0; i < kSize*sizeof(double); i++) {
mem1[i] = 0;
mem2[i] = 0;
}
double sum = 0;
for (int align = 0; align < 8; align++) {
double* nums = (double*)(mem1 + align);
double* numb = (double*)(mem2 + align);
for (int i = 0; i < kSize - 1; i++) {
nums[i] = i*random();
numb[i] = i*random();
}
clock_t s = clock();
for (int i = 0; i < kSize - 1; i++) {
nums[i] = nums[i] * numb[i];
sum += nums[i];
}
clock_t e = clock();
std::cout << "align:" << align << "," << (e - s) * 1.0/(CLOCKS_PER_SEC) << std::endl;
std::cout << sum << std::endl;
}
return 0;
}
/*
caoshiweideMacBook-Pro:test caoshiwei$ ./a.out
0x10fd9d000,0x11059e000
align:0,0.00296
4.42795e+35
align:1,0.001538
8.86286e+35
align:2,0.003423
1.32945e+36
align:3,0.001611
1.77246e+36
align:4,0.001402
2.21554e+36
align:5,0.00242
2.65889e+36
align:6,0.001776
3.10164e+36
align:7,0.002441
3.5454e+36
*/
/*
swcao@swcao-linux:~$ ./a.out
0x7f5358757010,0x7f5326756010
align:0,0.38
4.43033e+41
align:1,0.37
8.86186e+41
align:2,0.38
1.32928e+42
align:3,0.37
1.77234e+42
align:4,0.38
2.21538e+42
align:5,0.37
2.65848e+42
align:6,0.38
3.10148e+42
align:7,0.38
3.54458e+42
*/
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment