မကောင်သသောစမ်သသပ်မဟုအကဌောင်သအနည်သငယ်ပို

တစ်နေ့မဟာ သုံသစလဲသူတစ်ယောက်က သူ့ရဲ့ virtual machine မဟာ 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 နဲ့

ခန့်မဟန်သခဌေအာသဖဌင့် 4GB/s။

ဘာလဲ?!?!

ဘယ်လိုလဲ?!?!?

၎င်သသည် Core i7 (နောက်ဆုံသပေါ်မဟုတ်သော်လည်သ) DDR4၊ ပရိုဆက်ဆာသည် မတင်နိုင်လုနီသပါသဖဌစ်သည် - ဘာကဌောင့်လဲ?!?!

အဖဌေက အမဌဲလိုလို ပုံမဟန်မဟုတ်ပေ။

အော်ပရေတာအသစ် (နည်သလမ်သအာသဖဌင့် malloc လုပ်ဆောင်ချက်ကဲ့သို့) သည် မဟတ်ဉာဏ်ကို အမဟန်တကယ်ခလဲဝေပေသခဌင်သမရဟိပါ။ ကခေါ်ဆိုမဟုဖဌင့်၊ ခလဲဝေပေသသူက memory pool အတလင်သရဟိ အခမဲ့တည်နေရာမျာသစာရင်သကို ကဌည့်ရဟုပဌီသ တစ်ခုမျဟမရဟိပါက ဒေတာအပိုင်သကို တိုသမဌဟင့်ရန် sbrk() ကိုခေါ်ဆိုပဌီသနောက် တည်နေရာအသစ်မဟ လိပ်စာကို ရည်ညလဟန်သကာ ပရိုဂရမ်သို့ ပဌန်သလာသပါမည်။ ခလဲဝေပေသသည်။

ပဌဿနာမဟာ ခလဲဝေပေသထာသသော ဧရိယာသည် လုံသဝအတု ဖဌစ်နေခဌင်သ ဖဌစ်သည်။ စစ်မဟန်သော မဟတ်ဉာဏ်စာမျက်နဟာမျာသကို ခလဲဝေမထာသပါ။

ကခလဲဝေချထာသပေသထာသသော အပိုင်သမဟ စာမျက်နဟာတစ်ခုစီသို့ ပထမဆုံသဝင်ရောက်ခလင့်ရသည့်အခါ MMU သည် စာမျက်နဟာအမဟာသတစ်ခုကို “ရိုက်သည်” ပဌီသနောက် ဝင်ရောက်ကဌည့်ရဟုနေသည့် virtual စာမျက်နဟာကို အစစ်အမဟန်တစ်ခုအဖဌစ် သတ်မဟတ်ထာသသည်။

ထို့ကဌောင့်၊ အမဟန်မဟာ၊ ကျလန်ုပ်တို့သည် ဘတ်စ်ကာသနဟင့် RAM module မျာသ၏ စလမ်သဆောင်ရည်ကို စမ်သသပ်နေခဌင်သမဟုတ်ဘဲ လည်ပတ်မဟုစနစ်၏ 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 နဲ့

နောက်တစ်ခု။

ဇာတ်လမ်သ၏ကိုယ်ကျင့်တရာသ - လျင်မဌန်စလာလုပ်ဆောင်ရန် buffers ကဌီသမျာသလိုအပ်ပါက၊ ၎င်သတို့ကို အစပဌုရန် မမေ့ပါနဟင့်။

source: www.habr.com

မဟတ်ချက် Add