рдЕрдиреБрдЪрд┐рдд рдкрд░реАрдХреНрд╖рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рдФрд░

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

#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++) {
                // 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/s\n";
	for (int i=0;i<CNT;i++) {
		delete buffers[i];
	}
	delete buffers;
	return 0;
}

рдпрд╣реА рд╣реИ, рд╣рдо рдХреЗрд╡рд▓ рдЖрд╡рдВрдЯрд┐рдд рдмрдлрд╝рд░реНрд╕ рдХреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди (char 0) рдХреЗ рд╕рд╛рде рдЖрд░рдВрдн рдХрд░рддреЗ рд╣реИрдВред

рдЬрд╛рдБрдЪ рдХрд░рдирд╛:

$ ./emtest
28.5714 GB / s


рджреВрд╕рд░реА рдмрд╛рддред

рдиреИрддрд┐рдХ - рдпрджрд┐ рдЖрдкрдХреЛ рдЬрд▓реНрджреА рдФрд░ рдЬрд▓реНрджреА рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдбрд╝реЗ рдмрдлрд╝рд░реНрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЙрдиреНрд╣реЗрдВ рдкреНрд░рд╛рд░рдВрдн рдХрд░рдирд╛ рди рднреВрд▓реЗрдВред

Source: https://habr.com/ru/post/undefined/


All Articles