เจฎเจพเฉœเฉ‡ เจŸเฉˆเจธเจŸเจฟเฉฐเจ— เจฌเจพเจฐเฉ‡ เจฅเฉ‹เฉœเจพ เจนเฉ‹เจฐ

เจ‡เฉฑเจ• เจฆเจฟเจจ เจฎเฉˆเจจเฉ‚เฉฐ เจ—เจฒเจคเฉ€ เจจเจพเจฒ เจ•เฉ‹เจก เจฎเจฟเจฒเจฟเจ† เจ•เจฟ เจ‡เฉฑเจ• เจ‰เจชเจญเฉ‹เจ—เจคเจพ เจ†เจชเจฃเฉ€ เจตเจฐเจšเฉเจ…เจฒ เจฎเจธเจผเฉ€เจจ เจตเจฟเฉฑเจš เจฐเฉˆเจฎ เจชเฉเจฐเจฆเจฐเจธเจผเจจ เจฆเฉ€ เจจเจฟเจ—เจฐเจพเจจเฉ€ เจ•เจฐเจจ เจฆเฉ€ เจ•เฉ‹เจธเจผเจฟเจธเจผ เจ•เจฐ เจฐเจฟเจนเจพ เจธเฉ€เฅค เจฎเฉˆเจ‚ เจ‡เจน เจ•เฉ‹เจก เจจเจนเฉ€เจ‚ เจฆเฉ‡เจตเจพเจ‚เจ—เจพ (เจ‰เฉฑเจฅเฉ‡ เจ‡เฉฑเจ• "เจซเฉเจŸเจ•เจฒเฉŒเจฅ" เจนเฉˆ) เจ…เจคเฉ‡ เจฎเฉˆเจ‚ เจธเจฟเจฐเจซเจผ เจธเจญ เจคเฉ‹เจ‚ เจœเจผเจฐเฉ‚เจฐเฉ€ เจ›เฉฑเจกเจพเจ‚เจ—เจพเฅค เจ‡เจธ เจฒเจˆ, เจฌเจฟเฉฑเจฒเฉ€ เจธเจŸเฉ‚เจกเฉ€เจ“ เจตเจฟเฉฑเจš เจนเฉˆ!

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

เจ•เฉ€?!?!

เจ•เจฟเจตเฉ‡เจ‚?!?!?

เจ‡เจน เจ•เฉ‹เจฐ 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

เจ‡เฉฑเจ• เจŸเจฟเฉฑเจชเจฃเฉ€ เจœเฉ‹เฉœเฉ‹