Beagán níos mó faoi thástáil dona

Lá amháin tháinig mé trasna ar chód de thaisme go raibh úsáideoir ag iarraidh monatóireacht a dhéanamh ar fheidhmíocht RAM ina mheaisín fíorúil. Ní thabharfaidh mé an cód seo (tá "footcloth" ann) agus ní fhágfaidh mé ach an ceann is riachtanach. Mar sin, tá an cat sa stiúideo!

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

Tá sé simplí - leithroinnt cuimhne agus scríobh gigabyte amháin isteach ann. Agus cad a léiríonn an tástáil seo?

$ ./memtest
4.06504 GB / s

Thart ar 4GB/s.

Cad?!?!

Conas?!?!?

Is é seo Core i7 (cé nach é an ceann is nuaí), DDR4, nach bhfuil an próiseálaí luchtaithe beagnach - CÉN FÁTH?!?!

Is é an freagra, mar i gcónaí, neamhghnách gnáth.

Ní leithdháileann an t-oibreoir nua (cosúil leis an bhfeidhm malloc, dála an scéil) cuimhne i ndáiríre. Leis an nglao seo, breathnaíonn an leithroinnt ar liosta na láithreacha saora sa chomhthiomsú cuimhne, agus mura bhfuil ceann ar bith ann, cuireann sé glaoch ar sbrk() chun an deighleog sonraí a mhéadú, agus ansin filleann sé ar an gclár tagairt don seoladh ón suíomh nua díreach leithdháilte.

Is í an fhadhb atá ann go bhfuil an limistéar leithdháilte go hiomlán fíorúil. Ní leithdháiltear aon leathanaigh fíorchuimhne.

Agus nuair a tharlaíonn an chéad rochtain ar gach leathanach ón deighleog leithdháilte seo, déanann an MMU “fág” ar leathanach, agus ina dhiaidh sin sanntar fíorcheann don leathanach fíorúil atá á rochtain.

Dá bhrí sin, i ndáiríre, níl muid ag tástáil ar fheidhmíocht na modúil bus agus RAM, ach ar fheidhmíocht MMU agus VMM an chórais oibriúcháin. Agus chun fíorfheidhmíocht RAM a thástáil, ní gá dúinn ach na réimsí leithdháilte a thúsú uair amháin. Mar shampla mar seo:

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

Is é sin, ní dhéanaimid ach na maoláin leithdháilte a thúsú leis an luach réamhshocraithe (char 0).

Déanaimid seiceáil:

$ ./memtest
28.5714 GB / s

Rud eile.

Morálta an scéil - má theastaíonn maoláin mhóra uait chun oibriú go tapa, ná déan dearmad iad a thúsú.

Foinse: will.com

Ceannaigh óstáil iontaofa do shuímh le cosaint DDoS, freastalaithe VPS VDS 🔥 Ceannaigh óstáil gréasáin iontaofa le cosaint DDoS, freastalaithe VPS VDS | ProHoster