Zvimwe zvishoma pamusoro pekuedzwa kwakaipa

Rimwe zuva ndakangoerekana ndasangana nekodhi kuti mushandisi aiedza kutarisa mashandiro eRAM mumushini wake chaiwo. Ini handisi kuzopa iyi kodhi (kune "gumbo retsoka" ipapo) uye ini ndichasiya chete inonyanya kukosha. Saka, katsi iri mu studio!

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

Zviri nyore - kugovera ndangariro uye nyora gigabyte imwe mairi. Uye bvunzo iyi inoratidzei?

$ ./memtest
4.06504 GB / s

Anenge 4GB/s.

Chii?!?!

Sei?!?!?

Iyi iCore i7 (kunyangwe isiri iyo nyowani), DDR4, iyo processor inenge isina kurodha - NEI?!?!

Mhinduro, senguva dzose, yakajairika.

Mushandi mutsva (sebasa remalloc, nenzira) haagovera ndangariro. Nekufona uku, mugoveri anotarisa rondedzero yenzvimbo dzemahara mune dziva rekurangarira, uye kana pasina, inodaidza sbrk () kuti iwedzere chikamu che data, uyezve inodzokera kuchirongwa chirevo chekero kubva kunzvimbo itsva chete. allocated.

Dambudziko nderekuti nzvimbo yakagoverwa ndeyechokwadi. Hapana mapeji endangariro chaiwo akagoverwa.

Uye kana yekutanga kuwana kune peji rega rega kubva kune chikamu chakagoverwa ichiitika, iyo MMU "inopfura" kukanganisa kwepeji, mushure meiyo iyo chaiyo peji iri kuwanikwa inopihwa chaiyo.

Nokudaro, chaizvoizvo, hatisi kuedza kushanda kwebhazi uye RAM modules, asi kushanda kweMMU neVMM yehurongwa hwekushanda. Uye kuti tiedze kuita chaiko kweRAM, isu tinongoda kutanga nzvimbo dzakagoverwa kamwe chete. Somuenzaniso seizvi:

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

Ndiko kuti, isu tinongotanga mabhafa akagoverwa neiyo default kukosha (char 0).

Tinotarisa:

$ ./memtest
28.5714 GB / s

Chimwe chinhu.

Tsika yenyaya - kana iwe uchida mabhafa makuru kuti ashande nekukurumidza, usakanganwe kuvatanga.

Source: www.habr.com

Voeg