เดเดฐเต เดเดชเดฏเตเดเตเดคเดพเดตเต เดคเดจเตเดฑเต เดตเตเตผเดเตเดตเตฝ เดฎเตเดทเตเดจเดฟเดฒเต เดฑเดพเด เดชเตเดฐเดเดเดจเด เดจเดฟเดฐเตเดเตเดทเดฟเดเตเดเดพเตป เดถเตเดฐเดฎเดฟเดเตเดเตเดจเตเดจเดคเดพเดฏเดฟ เดเดฐเต เดฆเดฟเดตเดธเด เดเดพเตป เด
เดฌเดฆเตเดงเดคเตเดคเดฟเตฝ เดเตเดกเต เดเดฃเตเดเต. เดเดพเตป เด เดเตเดกเต เดจเตฝเดเดฟเดฒเตเดฒ (เด
เดตเดฟเดเต เดเดฐเต "เดเดพเตฝเดคเตเดฃเดฟ" เดเดฃเตเดเต) เดเดพเตป เดเดฑเตเดฑเดตเตเด เด
เดคเตเดฏเดพเดตเดถเตเดฏเดฎเดพเดฏเดคเต เดฎเดพเดคเตเดฐเด เดตเดฟเดเตเด. เด
เดคเดฟเดจเดพเตฝ, เดชเตเดเตเด เดธเตเดฑเตเดฑเตเดกเดฟเดฏเตเดฏเดฟเดฒเดพเดฃเต!
#include <sys/time.h>
#include <string.h>
#include <iostream>
#define CNT 1024
#define SIZE (1024*1024)
int main() {
struct timeval start;
struct timeval end;
long millis;
double gbs;
char ** buffers;
buffers = new char*[CNT];
for (int i=0;i<CNT;i++) {
buffers[i] = new char[SIZE];
}
gettimeofday(&start, NULL);
for (int i=0;i<CNT;i++) {
memset(buffers[i], 0, SIZE);
}
gettimeofday(&end, NULL);
millis = (end.tv_sec - start.tv_sec) * 1000 +
(end.tv_usec - start.tv_usec) / 1000;
gbs = 1000.0 / millis;
std::cout << gbs << " GB/sn";
for (int i=0;i<CNT;i++) {
delete buffers[i];
}
delete buffers;
return 0;
}
เดเดคเต เดฒเดณเดฟเดคเดฎเดพเดฃเต - เดฎเตเดฎเตเดฎเดฑเดฟ เด เดจเตเดตเดฆเดฟเดเตเดเต เด เดคเดฟเตฝ เดเดฐเต เดเดฟเดเดพเดฌเตเดฑเตเดฑเต เดเดดเตเดคเตเด. เด เดชเดฐเดฟเดถเตเดงเดจ เดเดจเตเดคเดพเดฃเต เดเดพเดฃเดฟเดเตเดเตเดจเตเดจเดคเต?
$./memtest
4.06504 GB / s
เดเดเดฆเตเดถเด 4GB/s.
เดเดจเตเดคเต?!?!
เดเดเตเดเดจเต?!?!?
เดเดคเดพเดฃเต Core i7 (เดเดฑเตเดฑเดตเตเด เดชเตเดคเดฟเดฏเดคเดฒเตเดฒเตเดเตเดเดฟเดฒเตเด), DDR4, เดชเตเดฐเตเดธเดธเตผ เดฎเดฟเดเตเดเดตเดพเดฑเตเด เดฒเตเดกเตเดเตเดฏเตเดคเดฟเดเตเดเดฟเดฒเตเดฒ - เดเดจเตเดคเตเดเตเดฃเตเดเต?!?!
เดเดคเตเดคเดฐเด, เดเดฒเตเดฒเดพเดฏเตเดชเตเดชเตเดดเตเด เดเดจเตเดจเดชเตเดฒเต, เด เดธเดพเดงเดพเดฐเดฃเดฎเดพเดเดตเดฟเดงเด เดธเดพเดงเดพเดฐเดฃเดฎเดพเดฃเต.
เดชเตเดคเดฟเดฏ เดเดชเตเดชเดฑเตเดฑเตเดฑเตผ (malloc เดซเดเดเตโเดทเตป เดชเตเดฒเต) เดฏเดฅเดพเตผเดคเตเดฅเดคเตเดคเดฟเตฝ เดฎเตเดฎเตเดฎเดฑเดฟ เด เดจเตเดตเดฆเดฟเดเตเดเตเดจเตเดจเดฟเดฒเตเดฒ. เด เดเตเดณเดฟเดฒเตเดเต, เด เดฒเตเดเตเดเตเดฑเตเดฑเตผ เดฎเตเดฎเตเดฎเดฑเดฟ เดชเตเดณเดฟเดฒเต เดธเตเดเดจเตเดฏ เดฒเตเดเตเดเตเดทเดจเตเดเดณเตเดเต เดฒเดฟเดธเตเดฑเตเดฑเต เดจเตเดเตเดเตเดจเตเดจเต, เดเดจเตเดจเตเดฎเดฟเดฒเตเดฒเตเดเตเดเดฟเตฝ, เดกเดพเดฑเตเดฑ เดธเตเดเตเดฎเตเดจเตเดฑเต เดตเตผเดฆเตเดงเดฟเดชเตเดชเดฟเดเตเดเดพเตป sbrk() เดเดจเตเดจเต เดตเดฟเดณเดฟเดเตเดเตเดจเตเดจเต, เดคเตเดเตผเดจเตเดจเต เดชเตเดคเดฟเดฏ เดธเตเดฅเดฒเดคเตเดคเต เดจเดฟเดจเตเดจเต เดตเดฟเดฒเดพเดธเดคเตเดคเดฟเดฒเตเดเตเดเต เดเดฐเต เดฑเดซเดฑเตปเดธเต เดชเตเดฐเตเดเตเดฐเดพเดฎเดฟเดฒเตเดเตเดเต เดฎเดเดเตเดเตเดจเตเดจเต. เด เดจเตเดตเดฆเดฟเดเตเดเต.
เด เดจเตเดตเดฆเดฟเดเตเด เดชเตเดฐเดฆเตเดถเด เดชเตเตผเดฃเตเดฃเดฎเดพเดฏเตเด เดตเตเตผเดเตเดตเตฝ เดเดฃเต เดเดจเตเดจเดคเดพเดฃเต เดชเตเดฐเดถเตเดจเด. เดฏเดฅเดพเตผเดคเตเดฅ เดฎเตเดฎเตเดฎเดฑเดฟ เดชเตเดเตเดเดณเตเดจเตเดจเตเด เด เดจเตเดตเดฆเดฟเดเตเดเดฟเดเตเดเดฟเดฒเตเดฒ.
เด เด เดจเตเดตเดฆเดฟเดเตเด เดธเตเดเตโเดฎเตเดจเตเดฑเดฟเตฝ เดจเดฟเดจเตเดจเต เดเดฐเต เดชเตเดเดฟเดฒเตเดเตเดเตเด เดเดฆเตเดฏ เดเดเตโเดธเดธเต เดธเดเดญเดตเดฟเดเตเดเตเดฎเตเดชเตเตพ, MMU เดเดฐเต เดชเตเดเต เดคเดเดฐเดพเตผ "เดทเตเดเตเดเต" เดเตเดฏเตเดฏเตเดจเตเดจเต, เด เดคเดฟเดจเตเดถเตเดทเด เดเดเตโเดธเดธเต เดเตเดฏเตเดฏเตเดจเตเดจ เดตเตเตผเดเตเดตเตฝ เดชเตเดเดฟเดจเต เดฏเดฅเดพเตผเดคเตเดฅเดฎเดพเดฏ เดเดจเตเดจเต เดจเตฝเดเตเด.
เด เดคเดฟเดจเดพเตฝ, เดตเดพเดธเตเดคเดตเดคเตเดคเดฟเตฝ, เดเดเตเดเตพ เดฌเดธเดฟเดจเตเดฑเตเดฏเตเด เดฑเดพเด เดฎเตเดกเตเดฏเตเดณเตเดเดณเตเดเตเดฏเตเด เดชเตเดฐเดเดเดจเดฎเดฒเตเดฒ, เดเดชเตเดชเดฑเตเดฑเตเดฑเดฟเดเดเต เดธเดฟเดธเตเดฑเตเดฑเดคเตเดคเดฟเดจเตเดฑเต MMU, VMM เดเดจเตเดจเดฟเดตเดฏเตเดเต เดชเตเดฐเดเดเดจเดฎเดพเดฃเต เดชเดฐเดฟเดถเตเดงเดฟเดเตเดเตเดจเตเดจเดคเต. เดฑเดพเดฎเดฟเดจเตเดฑเต เดฏเดฅเดพเตผเดคเตเดฅ เดชเตเดฐเดเดเดจเด เดชเดฐเดฟเดถเตเดงเดฟเดเตเดเตเดจเตเดจเดคเดฟเดจเต, เดเดเตเดเตพ เด เดจเตเดตเดฆเดฟเดเตเด เดเดฐเดฟเดฏเดเตพ เดเดฐเดฟเดเตเดเตฝ เดเดฐเดเดญเดฟเดเตเดเตเดฃเตเดเดคเตเดฃเตเดเต. เดเดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต เดเดคเตเดชเตเดฒเต:
#include <sys/time.h>
#include <string.h>
#include <iostream>
#define CNT 1024
#define SIZE (1024*1024)
int main() {
struct timeval start;
struct timeval end;
long millis;
double gbs;
char ** buffers;
buffers = new char*[CNT];
for (int i=0;i<CNT;i++) {
// FIXED HERE!!!
buffers[i] = new char[SIZE](); // Add brackets, &$# !!!
}
gettimeofday(&start, NULL);
for (int i=0;i<CNT;i++) {
memset(buffers[i], 0, SIZE);
}
gettimeofday(&end, NULL);
millis = (end.tv_sec - start.tv_sec) * 1000 +
(end.tv_usec - start.tv_usec) / 1000;
gbs = 1000.0 / millis;
std::cout << gbs << " GB/sn";
for (int i=0;i<CNT;i++) {
delete buffers[i];
}
delete buffers;
return 0;
}
เด เดคเดพเดฏเดคเต, เดกเดฟเดซเตเตพเดเตเดเต เดฎเตเดฒเตเดฏเด (char 0) เดเดชเดฏเตเดเดฟเดเตเดเต เดเดเตเดเตพ เด เดจเตเดตเดฆเดฟเดเตเด เดฌเดซเดฑเตเดเตพ เดเดฐเดเดญเดฟเดเตเดเตเดจเตเดจเต.
เดเดเตเดเตพ เดชเดฐเดฟเดถเตเดงเดฟเดเตเดเตเดจเตเดจเต:
$./memtest
28.5714 GB / s
เดฎเดฑเตเดฑเตเดพเดฐเต เดเดพเดฐเตเดฏเด.
เดเดฅเดฏเตเดเต เดงเดพเตผเดฎเตเดฎเดฟเดเดค - เดตเตเดเดคเตเดคเดฟเตฝ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดเตเดเดพเตป เดจเดฟเดเตเดเตพเดเตเดเต เดตเดฒเดฟเดฏ เดฌเดซเดฑเตเดเตพ เดเดตเดถเตเดฏเดฎเตเดฃเตเดเตเดเตเดเดฟเตฝ, เด
เดต เดเดฐเดเดญเดฟเดเตเดเดพเตป เดฎเดฑเดเตเดเดฐเตเดคเต.
เด
เดตเดฒเดเดฌเด: www.habr.com