рдПрдХ рджрд┐рди рдореИрдВрдиреЗ рдЧрд▓рддреА рд╕реЗ рдПрдХ рдХреЛрдб рдХреА рдЖрдВрдЦ рдХреЛ рдкрдХрдбрд╝ рд▓рд┐рдпрд╛ рдЬреЛ рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдкрдиреА рдЖрднрд╛рд╕реА рдорд╢реАрди рдореЗрдВ рд░реИрдо рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рдерд╛ред рдореИрдВрдиреЗ рдпрд╣ рдХреЛрдб рдирд╣реАрдВ рджрд┐рдпрд╛ рд╣реИ ("рдлреБрдЯрдХреНрд▓реЙрде" рд╣реИ) рдФрд░ рдХреЗрд╡рд▓ рд╕рдмрд╕реЗ рдЖрд╡рд╢реНрдпрдХ рдЫреЛрдбрд╝ рджреЗрдВред рддреЛ, рдмрд┐рд▓реНрд▓реА рд╕реНрдЯреВрдбрд┐рдпреЛ рдореЗрдВ рд╣реИ!#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/s\n";
for (int i=0;i<CNT;i++) {
delete buffers[i];
}
delete buffers;
return 0;
}
рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИ - рд╣рдо рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдореЗрдВ рдПрдХ рдЧреАрдЧрд╛рдмрд╛рдЗрдЯ рд▓рд┐рдЦрддреЗ рд╣реИрдВред рдФрд░ рдпрд╣ рдкрд░реАрдХреНрд╖рдг рдХреНрдпрд╛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ?$ ./memestest
4.06504 GB / sрд▓рдЧрднрдЧ 4GB / sредрдХреНрдпрд╛?!?!рдХрд┐рд╕ рддрд░рд╣?!?!?рдпрд╣ рдХреЛрд░ i7 (рд╕рдмрд╕реЗ рдирдпрд╛ рдирд╣реАрдВ рд╣реИ), DDR4, рдкреНрд░реЛрд╕реЗрд╕рд░ рд▓рдЧрднрдЧ рд▓реЛрдб рдирд╣реАрдВ рд╣реИ - WHY !?!рдЙрддреНрддрд░, рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рдЕрд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рд╣реИредрдирдпрд╛ рдСрдкрд░реЗрдЯрд░ (рдЬреИрд╕реЗ рдореИрд▓реЛрдХ рдлрд╝рдВрдХреНрд╢рди, рд╡реИрд╕реЗ) рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдХреЙрд▓ рдХреЗ рд╕рд╛рде, рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдореЗрдореЛрд░реА рдкреВрд▓ рдореЗрдВ рдирд┐: рд╢реБрд▓реНрдХ рдЕрдиреБрднрд╛рдЧреЛрдВ рдХреА рд╕реВрдЪреА рдХреЛ рджреЗрдЦрддрд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рдХреЛрдИ рдирд╣реАрдВ рд╣реИ, рддреЛ рдбреЗрдЯрд╛ рдЦрдВрдб рдХреЛ рдмрдбрд╝рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП sbrk () рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдирдП рдЖрд╡рдВрдЯрд┐рдд рдЕрдиреБрднрд╛рдЧ рд╕реЗ рдкрддреЗ рдХрд╛ рд▓рд┐рдВрдХ рд▓реМрдЯрд╛рддрд╛ рд╣реИредрд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЪрдпрдирд┐рдд рдХреНрд╖реЗрддреНрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЖрднрд╛рд╕реА рд╣реИред рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдореЗрдореЛрд░реА рдкреЗрдЬ рдЖрд╡рдВрдЯрд┐рдд рдирд╣реАрдВ рдХрд┐рдП рдЧрдП рд╣реИрдВредрдФрд░ рдЬрдм рдЗрд╕ рдЪрдпрдирд┐рдд рдЦрдВрдб рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдкреГрд╖реНрда рдкрд░ рдкрд╣рд▓реА рдкрд╣реБрдВрдЪ рд╣реЛрддреА рд╣реИ, рддреЛ рдПрдордПрдордпреВ рдкреГрд╖реНрда рджреЛрд╖ рдХреЛ "рд╢реВрдЯ" рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдЬрд┐рд╕ рд╡рд░реНрдЪреБрдЕрд▓ рдкреГрд╖реНрда рддрдХ рдкрд╣реБрдВрдЪ рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИ, рдЙрд╕реЗ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЕрд╕рд╛рдЗрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИредрдЗрд╕рд▓рд┐рдП, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣рдо рдмрд╕ рдФрд░ рд░реИрдо рдореЙрдбреНрдпреВрд▓ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдПрдордПрдордпреВ рдФрд░ рд╡реАрдПрдордПрдо рдХрд╛ рдкреНрд░рджрд░реНрд╢рдиред рдФрд░ рд░реИрдо рдХреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рджрд░реНрд╢рди рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдмрд╕ рдПрдХ рдмрд╛рд░ рдЖрд╡рдВрдЯрд┐рдд рдЕрдиреБрднрд╛рдЧреЛрдВ рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рддрд░рд╣:#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/s\n";
for (int i=0;i<CNT;i++) {
delete buffers[i];
}
delete buffers;
return 0;
}
рдпрд╣реА рд╣реИ, рд╣рдо рдХреЗрд╡рд▓ рдЖрд╡рдВрдЯрд┐рдд рдмрдлрд╝рд░реНрд╕ рдХреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди (char 0) рдХреЗ рд╕рд╛рде рдЖрд░рдВрдн рдХрд░рддреЗ рд╣реИрдВредрдЬрд╛рдБрдЪ рдХрд░рдирд╛:$ ./emtest
28.5714 GB / sрджреВрд╕рд░реА рдмрд╛рддредрдиреИрддрд┐рдХ - рдпрджрд┐ рдЖрдкрдХреЛ рдЬрд▓реНрджреА рдФрд░ рдЬрд▓реНрджреА рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдбрд╝реЗ рдмрдлрд╝рд░реНрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЙрдиреНрд╣реЗрдВ рдкреНрд░рд╛рд░рдВрдн рдХрд░рдирд╛ рди рднреВрд▓реЗрдВред