Saeutik deui ngeunaan tés goréng

Hiji poé kuring ngahaja datang di sakuliah kode nu pamaké ieu nyobian ngawas kinerja RAM dina mesin virtual na. Kuring moal masihan kode ieu (aya "footcloth" aya) jeung kuring bakal ninggalkeun ngan paling penting. Janten, ucing aya di 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;
}

Ieu basajan - allocate memori jeung nulis hiji gigabyte kana eta. Sareng naon anu nunjukkeun tés ieu?

$ ./memtest
4.06504 GB / s

Kurang leuwih 4GB/s.

Naon?!?!

Kumaha?!?!?

Ieu Core i7 (sanajan teu newest), DDR4, processor ampir teu dieusian - NAHA?!?!

Jawabanana, sapertos biasa, luar biasa biasa.

Operator anyar (sapertos fungsi malloc, ku jalan kitu) henteu leres-leres nyayogikeun mémori. Kalawan panggero ieu, allocator katingal dina daptar bebas lokasi di kolam renang memori, jeung lamun aya euweuh, nelepon sbrk () pikeun kanaékan bagéan data, lajeng mulang ka program hiji rujukan ka alamat ti lokasi anyar ngan. dialokasikeun.

Masalahna nyaéta yén daérah anu dialokasikeun sacara virtual. Taya kaca mémori nyata disadiakeun.

Sareng nalika aksés munggaran ka unggal halaman tina bagean anu dialokasikeun ieu, MMU "némbak" kasalahan halaman, saatos halaman maya anu diakses ditugaskeun anu nyata.

Ku alatan éta, dina kanyataanana, urang teu nguji kinerja beus na modul RAM, tapi kinerja MMU na VMM tina sistem operasi. Sarta guna nguji kinerja nyata RAM, urang ngan perlu initialize wewengkon disadiakeun sakali. Contona saperti kieu:

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

Hartina, urang ngan saukur initialize buffers disadiakeun kalawan nilai standar (char 0).

Kami cek:

$ ./memtest
28.5714 GB / s

Lain hal.

Moral carita - upami anjeun peryogi panyangga ageung pikeun damel gancang, tong hilap ngamimitianana.

sumber: www.habr.com

Tambahkeun komentar