рд╡рд╛рдИрдЯ рдЪрд╛рдЪрдгреАрдмрджреНрджрд▓ рдереЛрдбреЗ рдЕрдзрд┐рдХ

рдПрдХреЗ рджрд┐рд╡рд╢реА рдорд▓рд╛ рдЪреБрдХреВрди рдХреЛрдб рдЖрд▓рд╛ рдХреА рдПрдХ рд╡рд╛рдкрд░рдХрд░реНрддрд╛ рддреНрдпрд╛рдЪреНрдпрд╛ рд╡реНрд╣рд░реНрдЪреНрдпреБрдЕрд▓ рдорд╢реАрдирдордзреНрдпреЗ рд░реЕрдо рдХрд╛рд░реНрдпрдХреНрд╖рдорддреЗрдЪреЗ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рдгреНрдпрд╛рдЪрд╛ рдкреНрд░рдпрддреНрди рдХрд░реАрдд рдЖрд╣реЗ. рдореА рд╣рд╛ рдХреЛрдб рджреЗрдгрд╛рд░ рдирд╛рд╣реА (рддрд┐рдереЗ рдПрдХ "рдлреБрдЯрдХреНрд▓реЛрде" рдЖрд╣реЗ) рдЖрдгрд┐ рдореА рдлрдХреНрдд рд╕рд░реНрд╡рд╛рдд рдЖрд╡рд╢реНрдпрдХ рд╕реЛрдбреЗрди. рддрд░, рдорд╛рдВрдЬрд░ рд╕реНрдЯреБрдбрд┐рдУрдордзреНрдпреЗ рдЖрд╣реЗ!

#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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛