Usa ka gamay pa bahin sa dili maayo nga pagsulay

Usa ka adlaw wala tuyoa nako nakit-an ang code nga gisulayan sa usa ka user nga mamonitor ang performance sa RAM sa iyang virtual machine. Dili nako ihatag kini nga code (adunay usa ka "footcloth" didto) ug ibilin ra nako ang labing hinungdanon. Busa, ang iring naa sa 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;
}

Yano ra - paggahin ug memorya ug pagsulat ug usa ka gigabyte niini. Ug unsa ang gipakita niini nga pagsulay?

$ ./memtest
4.06504 GB / s

Gibana-bana nga 4GB/s.

Unsa?!?!

Unsaon?!?!?

Kini mao ang Core i7 (bisan dili ang pinakabag-o), DDR4, ang processor hapit dili load - NGANONG?!?!

Ang tubag, sama sa kanunay, talagsaon nga ordinaryo.

Ang bag-ong operator (sama sa malloc function, sa paagi) wala gyud maggahin sa memorya. Uban niini nga tawag, ang allocator motan-aw sa lista sa mga libre nga mga lokasyon sa memory pool, ug kung wala, tawagan ang sbrk() aron madugangan ang bahin sa datos, ug unya mobalik sa programa ang usa ka pakisayran sa adres gikan sa bag-ong lokasyon. gigahin.

Ang problema mao nga ang gigahin nga lugar hingpit nga virtual. Walay tinuod nga panumduman nga mga panid ang gigahin.

Ug kung mahitabo ang una nga pag-access sa matag panid gikan sa gigahin nga bahin, ang MMU "nag-shoot" sa usa ka sayup sa panid, pagkahuman ang virtual nga panid nga gi-access gi-assign nga tinuod.

Busa, sa pagkatinuod, wala namo gisulayan ang performance sa bus ug RAM modules, apan ang performance sa MMU ug VMM sa operating system. Ug aron masulayan ang tinuud nga pasundayag sa RAM, kinahanglan ra naton nga unahon ang gigahin nga mga lugar kausa. Pananglitan sama niini:

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

Sa ato pa, gisugdan lang nato ang gigahin nga mga buffer nga adunay default nga kantidad (char 0).

Pagsusi:

$ ./memtest
28.5714 GB / s

Laing butang.

Moral sa istorya - kung kinahanglan nimo ang dagkong mga buffer aron molihok dayon, ayaw kalimti ang pagsugod niini.

Source: www.habr.com

Idugang sa usa ka comment