рдПрдХ рджрд┐рди рдореИрд▓реЗ рд╕рдВрдпреЛрдЧрд╡рд╢ рдХреЛрдб рднреЗрдЯреНрдЯрд╛рдПрдБ рдХрд┐ рдПрдХ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рд▓реЗ рдЖрдлреНрдиреЛ рднрд░реНрдЪреБрдЕрд▓ рдореЗрд╕рд┐рдирдорд╛ RAM рдкреНрд░рджрд░реНрд╢рди рдирд┐рдЧрд░рд╛рдиреА рдЧрд░реНрди рдкреНрд░рдпрд╛рд╕ рдЧрд░рд┐рд░рд╣реЗрдХреЛ рдерд┐рдпреЛред рдо рдпреЛ рдХреЛрдб рджрд┐рдиреЗрдЫреИрди (рддреНрдпрд╣рд╛рдБ "рдлреБрдЯрдХреНрд▓реЛрде" рдЫ) рд░ рдо рд╕рдмреИрднрдиреНрджрд╛ рдЖрд╡рд╢реНрдпрдХ рдорд╛рддреНрд░ рдЫреЛрдбреНрдиреЗрдЫреБред рддреНрдпрд╕реЛрднрдП, рдмрд┐рд░рд╛рд▓реЛ рд╕реНрдЯреБрдбрд┐рдпреЛрдорд╛ рдЫ!
#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ред
рдХреЗ?!?!
рдХрд╕рд░реА?!?!?
рдпреЛ рдХреЛрд░ i7 рд╣реЛ (рдпрджреНрдпрдкрд┐ рдирдпрд╛рдБ рд╣реЛрдЗрди), DDR4, рдкреНрд░реЛрд╕реЗрд╕рд░ рд▓рдЧрднрдЧ рд▓реЛрдб рдЧрд░рд┐рдПрдХреЛ рдЫреИрди - рдХрд┐рди?!?!
рдЬрд╡рд╛рдл, рд╕рдзреИрдВ рдЬрд╕реНрддреИ, рдЕрд╕рд╛рдорд╛рдиреНрдп рд░реВрдкрдорд╛ рд╕рд╛рдорд╛рдиреНрдп рдЫред
рдирдпрд╛рдБ рдЕрдкрд░реЗрдЯрд░ (рдЬрд╕реНрддреИ malloc рдкреНрд░рдХрд╛рд░реНрдп, рд╡реИрд╕реЗ) рд▓реЗ рд╡рд╛рд╕реНрддрд╡рдорд╛ рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдЧрд░реНрджреИрдиред рдпрд╕ рдХрд▓рдХреЛ рд╕рд╛рде, рдЖрд╡рдВрдЯрдХрд▓реЗ рдореЗрдореЛрд░реА рдкреВрд▓рдорд╛ рдирд┐: рд╢реБрд▓реНрдХ рд╕реНрдерд╛рдирд╣рд░реВрдХреЛ рд╕реВрдЪреА рд╣реЗрд░реНрдЫ, рд░ рдпрджрд┐ рддреНрдпрд╣рд╛рдБ рдХреБрдиреИ рдкрдирд┐ рдЫреИрди рднрдиреЗ, рдбреЗрдЯрд╛ рдЦрдгреНрдб рдмрдврд╛рдЙрди sbrk() рд▓рд╛рдИ рдХрд▓ рдЧрд░реНрджрдЫ, рд░ рддреНрдпрд╕рдкрдЫрд┐ рдХрд╛рд░реНрдпрдХреНрд░рдордорд╛ рдирдпрд╛рдБ рд╕реНрдерд╛рдирдмрд╛рдЯ рдареЗрдЧрд╛рдирд╛рдХреЛ рд╕рдиреНрджрд░реНрднрдорд╛ рдлрд░реНрдХрд╛рдЙрдБрдЫред рдЖрд╡рдВрдЯрд┐рддред
рд╕рдорд╕реНрдпрд╛ рдпреЛ рдЫ рдХрд┐ рдЖрд╡рдВрдЯрд┐рдд рдХреНрд╖реЗрддреНрд░ рдкреВрд░реНрдг рд░реВрдкрдорд╛ рднрд░реНрдЪреБрдЕрд▓ рдЫред рдХреБрдиреИ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдореЗрдореЛрд░реА рдкреГрд╖реНрдард╣рд░реВ рдЖрд╡рдВрдЯрд┐рдд рдЧрд░рд┐рдПрдХреЛ рдЫреИрдиред
рд░ рдЬрдм рдпреЛ рдЖрд╡рдВрдЯрд┐рдд рдЦрдгреНрдбрдмрд╛рдЯ рдкреНрд░рддреНрдпреЗрдХ рдкреГрд╖реНрдардорд╛ рдкрд╣рд┐рд▓реЛ рдкрд╣реБрдБрдЪ рд╣реБрдиреНрдЫ, MMU рд▓реЗ рдкреГрд╖реНрда рддреНрд░реБрдЯрд┐ "рд╢реВрдЯ" рдЧрд░реНрджрдЫ, рдЬрд╕ рдкрдЫрд┐ рдкрд╣реБрдБрдЪ рдЧрд░рд┐рдПрдХреЛ рднрд░реНрдЪреБрдЕрд▓ рдкреГрд╖реНрдард▓рд╛рдИ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдПрдХ рддреЛрдХрд┐рдиреНрдЫред
рддреНрдпрд╕рдХрд╛рд░рдг, рд╡рд╛рд╕реНрддрд╡рдорд╛, рд╣рд╛рдореА рдмрд╕ рд░ RAM рдореЛрдбреНрдпреБрд▓рд╣рд░реВрдХреЛ рдкреНрд░рджрд░реНрд╢рди рдкрд░реАрдХреНрд╖рдг рдЧрд░реНрджреИрдиреМрдВ, рддрд░ рдЕрдкрд░реЗрдЯрд┐рдЩ рд╕рд┐рд╕реНрдЯрдордХреЛ MMU рд░ VMM рдХреЛ рдкреНрд░рджрд░реНрд╢рдиред рд░ RAM рдХреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рджрд░реНрд╢рди рдкрд░реАрдХреНрд╖рдг рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐, рд╣рд╛рдореАрд▓реЗ рдПрдХ рдкрдЯрдХ рдЖрд╡рдВрдЯрд┐рдд рдХреНрд╖реЗрддреНрд░рд╣рд░реВ рдкреНрд░рд╛рд░рдореНрдн рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫред рдЙрджрд╛рд╣рд░рдг рдХреЛ рд▓рд╛рдЧреА рдпреЛ рдЬрд╕реНрддреИ:
#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