Як каме бештар дар бораи санҷиши бад

Як рӯз ман тасодуфан бо коде дучор омадам, ки корбар кӯшиш мекард, ки иҷрои RAM-ро дар мошини виртуалии худ назорат кунад. Ман ин рамзро намедиҳам (дар он ҷо "пойафзол" ҳаст) ва ман танҳо чизи муҳимтаринро мегузорам. Пас, гурба дар студия аст!

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

Ин оддӣ аст - хотира ҷудо кунед ва ба он як гигабайт нависед. Ва ин санҷиш чиро нишон медиҳад?

$ ./memtest
4.06504 GB / s

Тақрибан 4 ГБ/с.

Чӣ?!?!

Чӣ хел?!?!?

Ин Core i7 (ҳарчанд навтарин нест), DDR4, протсессори қариб бор карда нашудааст - ЧАРО ?!?!

Ҷавоб, чун ҳамеша, ғайриоддӣ аст.

Оператори нав (ба мисли функсияи malloc) воқеан хотираро ҷудо намекунад. Бо ин занг, тақсимкунанда ба рӯйхати ҷойҳои ройгон дар ҳавзи хотира нигоҳ мекунад ва агар вуҷуд надошта бошад, sbrk() -ро барои зиёд кардани сегменти маълумот даъват мекунад ва сипас ба барнома истинод ба суроғаро аз макони нав бармегардонад. ҷудо карда шудааст.

Масъала дар он аст, ки майдони ҷудошуда комилан виртуалӣ аст. Саҳифаҳои хотираи воқеӣ ҷудо карда намешаванд.

Ва ҳангоме ки дастрасии аввалин ба ҳар як саҳифа аз ин сегменти ҷудошуда рух медиҳад, MMU хатои саҳифаро "парронад" ва пас аз он ба саҳифаи виртуалии дастрасшуда як хатои воқеӣ таъин карда мешавад.

Аз ин рӯ, дар асл, мо на иҷрои модулҳои автобус ва RAM, балки кори MMU ва VMM-и системаи пардозандаро санҷида истодаем. Ва барои санҷидани кори воқеии RAM, ба мо лозим аст, ки як маротиба минтақаҳои ҷудошударо оғоз кунем. Масалан, чунин:

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

Яъне, мо танҳо буферҳои ҷудошударо бо арзиши пешфарз оғоз мекунем (char 0).

Санҷиш:

$ ./memtest
28.5714 GB / s

Чизи дигар.

Ахлоқи ҳикоя - агар ба шумо барои зуд кор кардани буферҳои калон лозим бошад, оғоз кардани онҳоро фаромӯш накунед.

Манбаъ: will.com

Илова Эзоҳ