Okuncane mayelana nokuhlolwa okubi

Ngolunye usuku ngathola ngephutha ikhodi yokuthi umsebenzisi ubezama ukuqapha ukusebenza kwe-RAM emshinini wakhe obonakalayo. Ngeke nginikeze le khodi (kukhona "indwangu yezinyawo" lapho) futhi ngizoshiya kuphela ebaluleke kakhulu. Ngakho, ikati lisestudiyo!

#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;
}

Kulula - nikeza inkumbulo bese ubhala igigabhayithi eyodwa kuyo. Futhi lokhu kuhlola kubonisani?

$ ./memtest
I-4.06504 GB / s

Cishe i-4GB/s.

Ini?!?!

Kanjani?!?!?

Lena yi-Core i7 (yize ingeyona entsha), i-DDR4, iphrosesa cishe ayilayishwanga - KUNGANI?!?!

Impendulo, njengenjwayelo, ijwayelekile ngokungavamile.

U-opharetha omusha (njengomsebenzi we-malloc, ngendlela) empeleni akabeki inkumbulo. Ngalolu kholi, owabelayo ubheka uhlu lwezindawo zamahhala endaweni yenkumbulo, futhi uma zingekho, ushayela u-sbrk() ukukhulisa ingxenye yedatha, abese ebuyisela ohlelweni ireferensi yekheli elisuka endaweni entsha nje. eyabiwe.

Inkinga ukuthi indawo eyabelwe i-virtual ngokuphelele. Awekho amakhasi enkumbulo yangempela anikeziwe.

Futhi uma ukufinyelela kokuqala kwekhasi ngalinye kusuka kule ngxenye eyabelwe kwenzeka, i-MMU "idubula" iphutha lekhasi, ngemuva kwalokho ikhasi elibonakalayo elifinyelelwayo labelwa elangempela.

Ngakho-ke, eqinisweni, asihloli ukusebenza kwamamojula webhasi ne-RAM, kodwa ukusebenza kwe-MMU ne-VMM yohlelo lokusebenza. Futhi ukuze sihlole ukusebenza kwangempela kwe-RAM, sidinga nje ukuqalisa izindawo ezabiwe kanye. Ngokwesibonelo kanje:

#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;
}

Okusho ukuthi, simane siqalise amabhafa abiwe ngenani elizenzakalelayo (char 0).

Sihlola:

$ ./memtest
I-28.5714 GB / s

Enye into.

I-Moral of the story - uma udinga amabhafa amakhulu ukuze usebenze ngokushesha, ungakhohlwa ukuwaqalisa.

Source: www.habr.com

Engeza amazwana