เช–เชฐเชพเชฌ เชชเชฐเซ€เช•เซเชทเชฃ เชตเชฟเชถเซ‡ เชฅเซ‹เชกเซเช‚ เชตเชงเซ

เชเช• เชฆเชฟเชตเชธ เชฎเชจเซ‡ เช†เช•เชธเซเชฎเชฟเช• เชฐเซ€เชคเซ‡ เช•เซ‹เชก เชฎเชณเซเชฏเซ‹ เช•เซ‡ เชเช• เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เชคเซ‡เชจเชพ เชตเชฐเซเชšเซเชฏเซเช…เชฒ เชฎเชถเซ€เชจเชฎเชพเช‚ 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;
}

เชคเซ‡ เชธเชฐเชณ เช›เซ‡ - เชฎเซ‡เชฎเชฐเซ€ เชซเชพเชณเชตเซ‹ เช…เชจเซ‡ เชคเซ‡เชฎเชพเช‚ เชเช• เช—เซ€เช—เชพเชฌเชพเชˆเชŸ เชฒเช–เซ‹. เช…เชจเซ‡ เช† เชŸเซ‡เชธเซเชŸ เชถเซเช‚ เชฌเชคเชพเชตเซ‡ เช›เซ‡?

$ ./เชฎเซ‡เชฎเชŸเซ‡เชธเซเชŸ
4.06504 GB / เชธเซ‡เช•เช‚เชก

เช†เชถเชฐเซ‡ 4GB/s.

เชถเซเช‚?!?!

เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡?!?!?

เช† เช•เซ‹เชฐ 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) เชธเชพเชฅเซ‡ เชซเชพเชณเชตเซ‡เชฒ เชฌเชซเชฐเซเชธเชจเซ‡ เชซเช•เซเชค เชชเซเชฐเชพเชฐเช‚เชญ เช•เชฐเซ€เช เช›เซ€เช.

เชคเชชเชพเชธ เช•เชฐเซ€ เชฐเชนเซเชฏเซเช‚ เช›เซ‡:

$ ./เชฎเซ‡เชฎเชŸเซ‡เชธเซเชŸ
28.5714 GB / เชธเซ‡เช•เช‚เชก

เชฌเซ€เชœเซ€ เชตเชพเชค.

เชตเชพเชฐเซเชคเชพเชจเซ€ เชจเซˆเชคเชฟเช•เชคเชพ - เชœเซ‹ เชคเชฎเชจเซ‡ เชเชกเชชเชฅเซ€ เช•เชพเชฎ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชฎเซ‹เชŸเชพ เชฌเชซเชฐเชจเซ€ เชœเชฐเซ‚เชฐ เชนเซ‹เชฏ, เชคเซ‹ เชคเซ‡เชจเซ‡ เชชเซเชฐเชพเชฐเช‚เชญ เช•เชฐเชตเชพเชจเซเช‚ เชญเซ‚เชฒเชถเซ‹ เชจเชนเซ€เช‚.

เชธเซ‹เชฐเซเชธ: www.habr.com

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹