Beagan a bharrachd mu dheidhinn droch dheuchainnean

Aon latha thàinig mi tarsainn air còd gun fhiosta a bha neach-cleachdaidh a’ feuchainn ri sùil a chumail air coileanadh RAM anns an inneal brìgheil aige. Cha toir mi an còd seo seachad (tha “footcloth” ann) agus chan fhàg mi ach an fheadhainn as riatanach. Mar sin, tha an cat anns an stiùidio!

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

Tha e sìmplidh - riarachadh cuimhne agus sgrìobh aon gigabyte a-steach ann. Agus dè tha an deuchainn seo a 'sealltainn?

$ ./memtest
4.06504 GB / s

Mu 4 GB / s.

Dè?!?!

Ciamar?!?!?

Is e seo Core i7 (ged nach e am fear as ùire), DDR4, cha mhòr nach eil am pròiseasar air a luchdachadh - CARSON?!?!

Tha am freagairt, mar a tha e an-còmhnaidh, neo-àbhaisteach.

Chan eil an gnìomhaiche ùr (mar an gnìomh malloc, co-dhiù) a’ riarachadh cuimhne. Leis a’ ghairm seo, bidh an neach-cuairteachaidh a’ coimhead air liosta nan àiteachan an-asgaidh anns an amar cuimhne, agus mura h-eil gin ann, cuir fios gu sbrk() gus an roinn dàta àrdachadh, agus an uairsin tillidh e chun phrògram iomradh air an t-seòladh bhon àite ùr dìreach riarachadh.

Is e an duilgheadas a th’ ann gu bheil an raon ainmichte gu tur brìgheil. Chan eil fìor dhuilleagan cuimhne air an riarachadh.

Agus nuair a thachras a’ chiad ruigsinneachd air gach duilleag bhon roinn ainmichte seo, bidh am MMU “a’ losgadh ”sgàineadh duilleag, agus às deidh sin tha fìor dhuilleag air a shònrachadh don duilleag bhrìgheil.

Mar sin, gu dearbh, chan eil sinn a 'dèanamh deuchainn air coileanadh nam modalan bus agus RAM, ach coileanadh MMU agus VMM an t-siostaim obrachaidh. Agus gus fìor choileanadh RAM a dhearbhadh, chan fheum sinn ach na raointean ainmichte a thòiseachadh aon uair. Mar eisimpleir 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 e sin, bidh sinn dìreach a’ tòiseachadh nam bufairean ainmichte leis an luach bunaiteach (char 0).

Bidh sinn a ’sgrùdadh:

$ ./memtest
28.5714 GB / s

Rud eile.

Moraltachd na sgeòil - ma tha feum agad air bufairean mòra airson a bhith ag obair gu sgiobalta, na dì-chuimhnich an tòiseachadh.

Source: www.habr.com

Cuir beachd ann