protect
ถ้าเอาบทความไปเผยแพร่แล้วไม่ให้เครดิต ดำเนินคดีด้วย พรบ. คอมพิวเตอร์ฉบับใหม่ ขั้นสูงสุดและไม่ยอมความครับ
วันจันทร์ที่ 28 กันยายน พ.ศ. 2558
type conversion แบบ explicit และ implicit ตอนที่ 3
ในตอนที่ 2 ผมแสดงให้เห็นการ convert Type ถ้าเลือก Type ไม่เหมาะสม ตัวแปรที่เก็บค่าอาจจะมีความผิดพลาดได้ และผมได้ทิ้งคำถามว่าถ้างั้นเราใช้ Type ที่เก็บค่าได้มากๆ เลยดีไหมจะทำให้ไม่มีการผิดพลาดในการเก็บข้อมูล
เพื่อพิสูจน์ความคิดนี้เรามาลองดูตัวอย่าง code นี้น่ะครับ
const int _count = 1000000;
long bytes1 = GC.GetTotalMemory(true);
int[] array = new int[_count];
array[1] = int.MaxValue;
long bytes2 = GC.GetTotalMemory(true);
long difference = bytes2 - bytes1;
double per = (double)difference / _count;
Console.WriteLine("Program used: {0:0.0} MB",
(double)difference / (1024 * 1024));
Console.WriteLine("Each decimal element required: {0:0.0}
bytes", per);
ในตัวอย่าง โปรแกรมมีการถาม GC (Garbage Collector - ผมจะอธิบายอย่างละเอียดในบทความถัดๆ ไปครับ) ว่า ณ ตอนนี้โปรแกรมมีการใช้หน่วยความจำไปเท่าไร ด้วยคำสั่ง
long bytes1 = GC.GetTotalMemory(true);
จากนั้นโปรแกรมจะทำการจองหน่วยความจำ โดยทำการสร้าง Array ที่เก็บข้อมูลชนิด integer จำนวน 1,000,000 dataและให้ array ตำแหน่งที่ 1 เก็บค่ามากที่สุดของ Type ชนิด integer.
int[] array = new int[_count];
array[1] = int.MaxValue;
จากนั้นโปรแกรม ถาม GC อีกครั้งว่าโปรแกรมมีการใช้หน่วยความจำไปเท่าไร
long bytes2 = GC.GetTotalMemory(true);
ดังนั้นโปแกรมก็จะรู้ว่าการจองหน่วยความจำ array เพื่อเก็บข้อมูลชนิด integer จำนวน 1,000,000 ใช้หน่วยความจำไปเท่าไรด้วยคำสั่ง
long difference = bytes2 - bytes1;
และจาก code โปรแกรมยังบอกหน่วยความจำที่ใช้แต่ล่ะ array ด้วยคำสั่ง
double per = (double)difference / _count;
จากนั้นโปรแกรมก็พิพม์ผลออกทางหน้าจอ
Console.WriteLine("Program used: {0:0.0} MB",
(double)difference / (1024 * 1024));
Console.WriteLine("Each decimal element required: {0:0.0}
bytes", per);
สำหรับ Console.WriteLine("Program used: {0:0.0} MB",(double)difference / (1024 * 1024)); สามารถเขียนได้อีกแบบ คือ
Console.WriteLine("Program used: " + ((double)difference / (1024 * 1024)).ToString("0.0") + " MB");
เนื่องจาก GC.Collector จะ ให้ค่ามีหน่วยเป็น byte
ถ้าหารด้วย 1024 เราก็จะได้หน่วยที่เป็น KB
ถ้าหารด้วย 1024*1024 เราก็จะได้หน่วยที่เป็น MB
ที่นี้เรามาดูผลการรันน่ะครับ
จะเห็นว่าโปรแกรมใช้หน่วยความจำไป 3.8M เราแต่ล่ะ block ของ array จะใช้หน่วยความจำ 4 byte
ที่นี้เราลองมาเปลี่ยน code เป็นดังนี้
const int _count = 1000000;
long bytes1 = GC.GetTotalMemory(true);
decimal[] array = new decimal[_count];
array[1] = int.MaxValue;
long bytes2 = GC.GetTotalMemory(true);
long difference = bytes2 - bytes1;
double per = (double)difference / _count;
Console.WriteLine("Program used: {0:0.0} MB",
(double)difference / (1024 * 1024));
Console.WriteLine("Each decimal element required: {0:0.0}
ytes",per);
ในตัวอย่าง code ที่สองเปลี่ยนแค่ array ที่เก็บ Type ชนิด integer ไปเก็บ Type ที่เป็น decimal
ลองดูผลการรันโปรแกรม
จะเห็นว่ามีการใช้หน่วยความจำไปถึง 15.3 MB ทั้งๆ ที่เก็บข้อมูลเหมือนๆ กับตัวอย่าง code แรก
จากผลการทดลองนี้เราก็สรุปได้ว่า การใช้ตัวแปรที่เก็บข้อมูลได้เยอะโปรแกรมก็จะต้องการหน่วยความจำมากขึ้นดังนั้นเมื่อเราเขียนโปรแกรมเราจึงควรเลือกใช้ Type ให้เหมาะสม โดยเฉพาะตัวแปรของ library ที่พัฒนาเพื่อให้คนอื่นนำไปใช้
พบกันใหม่ในบทความหน้าครับ
TuChay
สมัครสมาชิก:
ส่งความคิดเห็น (Atom)
ไม่มีความคิดเห็น:
แสดงความคิดเห็น