เดฎเต‹เดถเด‚ เดชเดฐเดฟเดถเต‹เดงเดจเดฏเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเต เด•เตเดฑเดšเตเดšเตเด•เต‚เดŸเดฟ

เด’เดฐเต เด‰เดชเดฏเต‹เด•เตเดคเดพเดตเต เดคเดจเตเดฑเต† เดตเต†เตผเดšเตเดตเตฝ เดฎเต†เดทเต€เดจเดฟเดฒเต† เดฑเดพเด‚ เดชเตเดฐเด•เดŸเดจเด‚ เดจเดฟเดฐเต€เด•เตเดทเดฟเด•เตเด•เดพเตป เดถเตเดฐเดฎเดฟเด•เตเด•เตเดจเตเดจเดคเดพเดฏเดฟ เด’เดฐเต เดฆเดฟเดตเดธเด‚ เดžเดพเตป เด…เดฌเดฆเตเดงเดคเตเดคเดฟเตฝ เด•เต‹เดกเต เด•เดฃเตเดŸเต. เดžเดพเตป เดˆ เด•เต‹เดกเต เดจเตฝเด•เดฟเดฒเตเดฒ (เด…เดตเดฟเดŸเต† เด’เดฐเต "เด•เดพเตฝเดคเตเดฃเดฟ" เด‰เดฃเตเดŸเต) เดžเดพเตป เดเดฑเตเดฑเดตเตเด‚ เด…เดคเตเดฏเดพเดตเดถเตเดฏเดฎเดพเดฏเดคเต เดฎเดพเดคเตเดฐเด‚ เดตเดฟเดŸเตเด‚. เด…เดคเดฟเดจเดพเตฝ, เดชเต‚เดšเตเดš เดธเตเดฑเตเดฑเตเดกเดฟเดฏเต‹เดฏเดฟเดฒเดพเดฃเต!

#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.

เดŽเดจเตเดคเต?!?!

เดŽเด™เตเด™เดจเต†?!?!?

เด‡เดคเดพเดฃเต Core i7 (เดเดฑเตเดฑเดตเตเด‚ เดชเตเดคเดฟเดฏเดคเดฒเตเดฒเต†เด™เตเด•เดฟเดฒเตเด‚), DDR4, เดชเตเดฐเต‹เดธเดธเตผ เดฎเดฟเด•เตเด•เดตเดพเดฑเตเด‚ เดฒเต‹เดกเตเดšเต†เดฏเตเดคเดฟเดŸเตเดŸเดฟเดฒเตเดฒ - เดŽเดจเตเดคเตเด•เตŠเดฃเตเดŸเต?!?!

เด‰เดคเตเดคเดฐเด‚, เดŽเดฒเตเดฒเดพเดฏเตเดชเตเดชเต‹เดดเตเด‚ เดŽเดจเตเดจเดชเต‹เดฒเต†, เด…เดธเดพเดงเดพเดฐเดฃเดฎเดพเด‚เดตเดฟเดงเด‚ เดธเดพเดงเดพเดฐเดฃเดฎเดพเดฃเต.

เดชเตเดคเดฟเดฏ เด“เดชเตเดชเดฑเต‡เดฑเตเดฑเตผ (malloc เดซเด‚เด—เตโ€Œเดทเตป เดชเต‹เดฒเต†) เดฏเดฅเดพเตผเดคเตเดฅเดคเตเดคเดฟเตฝ เดฎเต†เดฎเตเดฎเดฑเดฟ เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเดจเตเดจเดฟเดฒเตเดฒ. เดˆ เด•เต‹เดณเดฟเดฒเต‚เดŸเต†, เด…เดฒเต‹เด•เตเด•เต‡เดฑเตเดฑเตผ เดฎเต†เดฎเตเดฎเดฑเดฟ เดชเต‚เดณเดฟเดฒเต† เดธเตŒเดœเดจเตเดฏ เดฒเตŠเด•เตเด•เต‡เดทเดจเตเด•เดณเตเดŸเต† เดฒเดฟเดธเตเดฑเตเดฑเต เดจเต‹เด•เตเด•เตเดจเตเดจเต, เด’เดจเตเดจเตเดฎเดฟเดฒเตเดฒเต†เด™เตเด•เดฟเตฝ, เดกเดพเดฑเตเดฑ เดธเต†เด—เตเดฎเต†เดจเตเดฑเต เดตเตผเดฆเตเดงเดฟเดชเตเดชเดฟเด•เตเด•เดพเตป sbrk() เดŽเดจเตเดจเต เดตเดฟเดณเดฟเด•เตเด•เตเดจเตเดจเต, เดคเตเดŸเตผเดจเตเดจเต เดชเตเดคเดฟเดฏ เดธเตเดฅเดฒเดคเตเดคเต เดจเดฟเดจเตเดจเต เดตเดฟเดฒเดพเดธเดคเตเดคเดฟเดฒเต‡เด•เตเด•เต เด’เดฐเต เดฑเดซเดฑเตปเดธเต เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเดฟเดฒเต‡เด•เตเด•เต เดฎเดŸเด™เตเด™เตเดจเตเดจเต. เด…เดจเตเดตเดฆเดฟเดšเตเดšเต.

เด…เดจเตเดตเดฆเดฟเดšเตเดš เดชเตเดฐเดฆเต‡เดถเด‚ เดชเต‚เตผเดฃเตเดฃเดฎเดพเดฏเตเด‚ เดตเต†เตผเดšเตเดตเตฝ เด†เดฃเต เดŽเดจเตเดจเดคเดพเดฃเต เดชเตเดฐเดถเตเดจเด‚. เดฏเดฅเดพเตผเดคเตเดฅ เดฎเต†เดฎเตเดฎเดฑเดฟ เดชเต‡เดœเตเด•เดณเตŠเดจเตเดจเตเด‚ เด…เดจเตเดตเดฆเดฟเดšเตเดšเดฟเดŸเตเดŸเดฟเดฒเตเดฒ.

เดˆ เด…เดจเตเดตเดฆเดฟเดšเตเดš เดธเต†เด—เตโ€Œเดฎเต†เดจเตเดฑเดฟเตฝ เดจเดฟเดจเตเดจเต เด“เดฐเต‹ เดชเต‡เดœเดฟเดฒเต‡เด•เตเด•เตเด‚ เด†เดฆเตเดฏ เด†เด•เตโ€Œเดธเดธเต เดธเด‚เดญเดตเดฟเด•เตเด•เตเดฎเตเดชเต‹เตพ, MMU เด’เดฐเต เดชเต‡เดœเต เดคเด•เดฐเดพเตผ "เดทเต‚เดŸเตเดŸเต" เดšเต†เดฏเตเดฏเตเดจเตเดจเต, เด…เดคเดฟเดจเตเดถเต‡เดทเด‚ เด†เด•เตโ€Œเดธเดธเต เดšเต†เดฏเตเดฏเตเดจเตเดจ เดตเต†เตผเดšเตเดตเตฝ เดชเต‡เดœเดฟเดจเต เดฏเดฅเดพเตผเดคเตเดฅเดฎเดพเดฏ เด’เดจเตเดจเต เดจเตฝเด•เตเด‚.

เด…เดคเดฟเดจเดพเตฝ, เดตเดพเดธเตเดคเดตเดคเตเดคเดฟเตฝ, เดžเด™เตเด™เตพ เดฌเดธเดฟเดจเตเดฑเต†เดฏเตเด‚ เดฑเดพเด‚ เดฎเตŠเดกเตเดฏเต‚เดณเตเด•เดณเตเดŸเต†เดฏเตเด‚ เดชเตเดฐเด•เดŸเดจเดฎเดฒเตเดฒ, เด“เดชเตเดชเดฑเต‡เดฑเตเดฑเดฟเด‚เด—เต เดธเดฟเดธเตเดฑเตเดฑเดคเตเดคเดฟเดจเตเดฑเต† MMU, VMM เดŽเดจเตเดจเดฟเดตเดฏเตเดŸเต† เดชเตเดฐเด•เดŸเดจเดฎเดพเดฃเต เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เตเดจเตเดจเดคเต. เดฑเดพเดฎเดฟเดจเตเดฑเต† เดฏเดฅเดพเตผเดคเตเดฅ เดชเตเดฐเด•เดŸเดจเด‚ เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต, เดžเด™เตเด™เตพ เด…เดจเตเดตเดฆเดฟเดšเตเดš เดเดฐเดฟเดฏเด•เตพ เด’เดฐเดฟเด•เตเด•เตฝ เด†เดฐเด‚เดญเดฟเด•เตเด•เต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต. เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต เด‡เดคเตเดชเต‹เดฒเต†:

#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

เด’เดฐเต เด…เดญเดฟเดชเตเดฐเดพเดฏเด‚ เดšเต‡เตผเด•เตเด•เตเด•