рдПрдХреЗ рджрд┐рд╡рд╢реА рдорд▓рд╛ рдЪреБрдХреВрди рдХреЛрдб рдЖрд▓рд╛ рдХреА рдПрдХ рд╡рд╛рдкрд░рдХрд░реНрддрд╛ рддреНрдпрд╛рдЪреНрдпрд╛ рд╡реНрд╣рд░реНрдЪреНрдпреБрдЕрд▓ рдорд╢реАрдирдордзреНрдпреЗ рд░реЕрдо рдХрд╛рд░реНрдпрдХреНрд╖рдорддреЗрдЪреЗ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рдгреНрдпрд╛рдЪрд╛ рдкреНрд░рдпрддреНрди рдХрд░реАрдд рдЖрд╣реЗ. рдореА рд╣рд╛ рдХреЛрдб рджреЗрдгрд╛рд░ рдирд╛рд╣реА (рддрд┐рдереЗ рдПрдХ "рдлреБрдЯрдХреНрд▓реЛрде" рдЖрд╣реЗ) рдЖрдгрд┐ рдореА рдлрдХреНрдд рд╕рд░реНрд╡рд╛рдд рдЖрд╡рд╢реНрдпрдХ рд╕реЛрдбреЗрди. рддрд░, рдорд╛рдВрдЬрд░ рд╕реНрдЯреБрдбрд┐рдУрдордзреНрдпреЗ рдЖрд╣реЗ!
#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 / рд╕реЗрдХрдВрдж
рдЕрдВрджрд╛рдЬреЗ 4GB/s.
рдХрд╛рдп?!?!
рдХрд╕реЗ?!?!?
рд╣рд╛ Core i7 (рдирд╡реАрди рдирд╕рд▓рд╛ рддрд░реА), DDR4 рдЖрд╣реЗ, рдкреНрд░реЛрд╕реЗрд╕рд░ рдЬрд╡рд│рдЬрд╡рд│ рд▓реЛрдб рдХреЗрд▓реЗрд▓рд╛ рдирд╛рд╣реА - рдХрд╛?!?!
рдЙрддреНрддрд░, рдиреЗрд╣рдореАрдкреНрд░рдорд╛рдгреЗ, рдЕрд╕рд╛рдорд╛рдиреНрдпрдкрдгреЗ рд╕рд╛рдорд╛рдиреНрдп рдЖрд╣реЗ.
рдирд╡реАрди рдСрдкрд░реЗрдЯрд░ (malloc рдлрдВрдХреНрд╢рди рдкреНрд░рдорд╛рдгреЗ, рддрд╕реЗ) рдкреНрд░рддреНрдпрдХреНрд╖рд╛рдд рдореЗрдорд░реА рд╡рд╛рдЯрдк рдХрд░рдд рдирд╛рд╣реА. рдпрд╛ рдХреЙрд▓рд╕рд╣, рд╡рд╛рдЯрдкрдХрд░реНрддрд╛ рдореЗрдорд░реА рдкреВрд▓рдордзреАрд▓ рд╡рд┐рдирд╛рдореВрд▓реНрдп рд╕реНрдерд╛рдирд╛рдВрдЪреА рд╕реВрдЪреА рдкрд╛рд╣рддреЛ рдЖрдгрд┐ рдЬрд░ рддреЗрдереЗ рдХрд╛рд╣реАрд╣реА рдирд╕реЗрд▓, рддрд░ рдбреЗрдЯрд╛ рд╡рд┐рднрд╛рдЧ рд╡рд╛рдврд╡рдгреНрдпрд╛рд╕рд╛рдареА sbrk() рд▓рд╛ рдХреЙрд▓ рдХрд░рддреЛ рдЖрдгрд┐ рдирдВрддрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд▓рд╛ рдирд╡реАрди рд╕реНрдерд╛рдирд╛рд╡рд░реАрд▓ рдкрддреНрддреНрдпрд╛рдЪрд╛ рд╕рдВрджрд░реНрдн рджреЗрддреЛ. рд╡рд╛рдЯрдк рдХреЗрд▓реЗ.
рд╕рдорд╕реНрдпрд╛ рдЕрд╢реА рдЖрд╣реЗ рдХреА рд╡рд╛рдЯрдк рдХреЗрд▓реЗрд▓реЗ рдХреНрд╖реЗрддреНрд░ рдкреВрд░реНрдгрдкрдгреЗ рдЖрднрд╛рд╕реА рдЖрд╣реЗ. рдХреЛрдгрддреАрд╣реА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдореЗрдорд░реА рдкреГрд╖реНрдареЗ рд╡рд╛рдЯрдк рдХреЗрд▓реЗрд▓реА рдирд╛рд╣реАрдд.
рдЖрдгрд┐ рдЬреЗрд╡реНрд╣рд╛ рдпрд╛ рд╡рд╛рдЯрдк рдХреЗрд▓реЗрд▓реНрдпрд╛ рд╡рд┐рднрд╛рдЧрд╛рддреАрд▓ рдкреНрд░рддреНрдпреЗрдХ рдкреГрд╖реНрдард╛рд╡рд░ рдкреНрд░рдердо рдкреНрд░рд╡реЗрд╢ рд╣реЛрддреЛ, рддреЗрд╡реНрд╣рд╛ MMU рдПрдХ рдкреГрд╖реНрда рджреЛрд╖ "рд╢реВрдЯ" рдХрд░рддреЗ, рддреНрдпрд╛рдирдВрддрд░ рдкреНрд░рд╡реЗрд╢ рдХреЗрд▓реЗрд▓реНрдпрд╛ рдЖрднрд╛рд╕реА рдкреГрд╖реНрдард╛рд╕ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдирд┐рдпреБрдХреНрдд рдХреЗрд▓реЗ рдЬрд╛рддреЗ.
рдореНрд╣рдгреВрди, рдЦрд░рдВ рддрд░, рдЖрдореНрд╣реА рдмрд╕ рдЖрдгрд┐ рд░реЕрдо рдореЙрдбреНрдпреВрд▓реНрд╕рдЪреНрдпрд╛ рдХрд╛рд░реНрдпрдХреНрд╖рдорддреЗрдЪреА рдЪрд╛рдЪрдгреА рдХрд░рдд рдирд╛рд╣реА, рдкрд░рдВрддреБ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдордЪреНрдпрд╛ 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 / рд╕реЗрдХрдВрдж
рдЖрдгрдЦреА рдПрдХ рдЧреЛрд╖реНрдЯ.
рдиреИрддрд┐рдХ - рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рддреНрд╡рд░реАрдд рдХрд╛рд░реНрдп рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдореЛрдареНрдпрд╛ рдмрдлрд░рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЕрд╕рд▓реНрдпрд╛рд╕, рддреНрдпрд╛рдВрдирд╛ рдкреНрд░рд╛рд░рдВрдн рдХрд░рдгреНрдпрд╛рд╕ рд╡рд┐рд╕рд░реВ рдирдХрд╛.
рд╕реНрддреНрд░реЛрдд: www.habr.com