рдЦрд░рд╛рдм рдкрд░реАрдХреНрд╖рдгрдХреЛ рдмрд╛рд░реЗрдорд╛ рдЕрд▓рд┐ рдмрдвреА

рдПрдХ рджрд┐рди рдореИрд▓реЗ рд╕рдВрдпреЛрдЧрд╡рд╢ рдХреЛрдб рднреЗрдЯреНрдЯрд╛рдПрдБ рдХрд┐ рдПрдХ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рд▓реЗ рдЖрдлреНрдиреЛ рднрд░реНрдЪреБрдЕрд▓ рдореЗрд╕рд┐рдирдорд╛ 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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди