рдЦрд╝рд░рд╛рдм рдкрд░реАрдХреНрд╖рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рдФрд░

рдПрдХ рджрд┐рди рдореБрдЭреЗ рдЧрд▓рддреА рд╕реЗ рдХреЛрдб рдорд┐рд▓рд╛ рдХрд┐ рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдкрдиреА рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдореЗрдВ рд░реИрдо рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рдерд╛ред рдореИрдВ рдпрд╣ рдХреЛрдб рдирд╣реАрдВ рджреВрдВрдЧрд╛ (рд╡рд╣рд╛рдВ рдПрдХ "рдлреБрдЯрдХреНрд▓реЙрде" рд╣реИ) рдФрд░ рдореИрдВ рдХреЗрд╡рд▓ рд╕рдмрд╕реЗ рдЖрд╡рд╢реНрдпрдХ рдЪреАрдЬреЗрдВ рд╣реА рдЫреЛрдбрд╝реВрдВрдЧрд╛ред рддреЛ, рдмрд┐рд▓реНрд▓реА рд╕реНрдЯреВрдбрд┐рдпреЛ рдореЗрдВ рд╣реИ!

#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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╝реЗрдВ