A sethitik liyane babagan testing ala

Sawijining dina aku ora sengaja nemokake kode sing pangguna nyoba ngawasi kinerja RAM ing mesin virtual. Aku ora bakal menehi kode iki (ana "footcloth" ana) lan aku bakal ninggalake mung paling penting. Dadi, kucing ana ing 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;
}

Iku prasaja - nyedhiakke memori lan nulis siji gigabyte menyang. Lan apa sing dituduhake tes iki?

$ ./memtest
4.06504 GB / s

Kira-kira 4GB/s.

Apa?!?!

Carane?!?!?

Iki inti i7 (sanajan ora paling anyar), DDR4, prosesor meh ora dimuat - KENAPA?!?!

Jawaban, kaya biasane, ora biasa.

Operator anyar (kaya fungsi malloc, ing cara) ora bener nyedhiakke memori. Kanthi telpon iki, allocator katon ing dhaftar free lokasi ing blumbang memori, lan yen ora ana, nelpon sbrk () kanggo nambah babagan data, lan banjur bali menyang program referensi kanggo alamat saka lokasi anyar mung. diparengake.

Masalah iku wilayah diparengake tanggung virtual. Ora ana kaca memori nyata sing dialokasikan.

Lan nalika akses pisanan menyang saben kaca saka bagean sing diparengake iki, MMU "nembak" kesalahan kaca, sawise kaca virtual sing diakses ditugasake dadi nyata.

Mulane, nyatane, kita ora nguji kinerja modul bus lan RAM, nanging kinerja MMU lan VMM sistem operasi. Lan kanggo nyoba kinerja nyata saka RAM, kita mung kudu initialize wilayah diparengake sapisan. Contone kaya iki:

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

Yaiku, kita mung miwiti buffer sing diparengake kanthi nilai standar (char 0).

Priksa:

$ ./memtest
28.5714 GB / s

Liyane bab.

Moral saka crita - yen sampeyan butuh buffer gedhe supaya bisa cepet, aja lali miwiti.

Source: www.habr.com

Add a comment