рдПрдХ рджрд┐рди рдореБрдЭреЗ рдЧрд▓рддреА рд╕реЗ рдХреЛрдб рдорд┐рд▓рд╛ рдХрд┐ рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдкрдиреА рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдореЗрдВ рд░реИрдо рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рдерд╛ред рдореИрдВ рдпрд╣ рдХреЛрдб рдирд╣реАрдВ рджреВрдВрдЧрд╛ (рд╡рд╣рд╛рдВ рдПрдХ "рдлреБрдЯрдХреНрд▓реЙрде" рд╣реИ) рдФрд░ рдореИрдВ рдХреЗрд╡рд▓ рд╕рдмрд╕реЗ рдЖрд╡рд╢реНрдпрдХ рдЪреАрдЬреЗрдВ рд╣реА рдЫреЛрдбрд╝реВрдВрдЧрд╛ред рддреЛ, рдмрд┐рд▓реНрд▓реА рд╕реНрдЯреВрдбрд┐рдпреЛ рдореЗрдВ рд╣реИ!
#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 рдЬреАрдмреА / рдПрд╕
рд▓рдЧрднрдЧ 4GB/s.
рдХреНрдпрд╛?!?!
рдХреИрд╕реЗ?!?!?
рдпрд╣ рдХреЛрд░ i7 (рдпрджреНрдпрдкрд┐ рдирд╡реАрдирддрдо рдирд╣реАрдВ), DDR4 рд╣реИ, рдкреНрд░реЛрд╕реЗрд╕рд░ рд▓рдЧрднрдЧ рд▓реЛрдб рдирд╣реАрдВ рд╣реИ - рдХреНрдпреЛрдВ?!?!
рдЙрддреНрддрд░, рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рдЕрд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рд╣реИред
рдирдпрд╛ рдСрдкрд░реЗрдЯрд░ (рд╡реИрд╕реЗ, рдореЙрд▓реЛрдХ рдлрд╝рдВрдХреНрд╢рди рдХреА рддрд░рд╣) рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдХреЙрд▓ рдХреЗ рд╕рд╛рде, рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдореЗрдореЛрд░реА рдкреВрд▓ рдореЗрдВ рдЦрд╛рд▓реА рд╕реНрдерд╛рдиреЛрдВ рдХреА рд╕реВрдЪреА рджреЗрдЦрддрд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рдХреЛрдИ рдирд╣реАрдВ рд╣реИ, рддреЛ рдбреЗрдЯрд╛ рд╕реЗрдЧрдореЗрдВрдЯ рдХреЛ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП 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++) {
// 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 рдЬреАрдмреА / рдПрд╕
рдПрдХ рдФрд░ рдмрд╛рддред
рдХрд╣рд╛рдиреА рдХрд╛ рд╕рд╛рд░ - рдпрджрд┐ рдЖрдкрдХреЛ рддреЗрдЬреА рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдбрд╝реЗ рдмрдлрд╝рд░реНрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЙрдиреНрд╣реЗрдВ рдЖрд░рдВрдн рдХрд░рдирд╛ рди рднреВрд▓реЗрдВред
рд╕реНрд░реЛрдд: www.habr.com