เมื่อวานฉันโพสต์บทความเกี่ยวกับวิธีการเพิ่มประสิทธิภาพ .NET มีความคิดเห็นมากมาย ขอบคุณมากสำหรับความคิดเห็นของคุณ บางคนชี้ให้เห็นข้อผิดพลาดในบทความ ฉันอยากจะขอบคุณผู้ที่เขียนความคิดเห็นอย่างอดทน ได้รับประโยชน์มากมาย
บทความเมื่อวานมุ่งเน้นไปที่การปรับปรุงความเร็วเป็นหลักจากรายละเอียดบางอย่างในการเขียนโค้ด มันอาจจะยากจริงๆ ที่จะรู้สึกถึงการปรับปรุงประสิทธิภาพ แต่ในฐานะโปรแกรมเมอร์ การปรับปรุงคุณภาพของโค้ดของคุณอย่างต่อเนื่องคือเป้าหมายที่คุณกำลังติดตามอยู่ตลอดเวลา
ในความเป็นจริง ด้วยการพัฒนาฮาร์ดแวร์ ความเร็วของฮาร์ดแวร์จึงตอบสนองความต้องการของคนส่วนใหญ่ได้อย่างมาก บางคนถึงกับแนะนำว่าอัลกอริทึมในการพัฒนาซอฟต์แวร์ในปัจจุบันมีประสิทธิภาพน้อยลงเรื่อยๆ ฉันจำได้ว่าเคยดูวิดีโอโครงสร้างข้อมูลจาก MIT มาก่อน และศาสตราจารย์ที่สอนการบรรยายก็ถามคำถาม (ฉันจำไม่ได้ชัดเจน แต่เขาหมายถึงสิ่งนี้): เนื่องจากอัลกอริธึมไม่สำคัญอีกต่อไป ทำไมเราถึงยังอยู่ที่นี่ แล้วการวิจัยล่ะ? คำตอบที่เขาให้คือ "ความเร็ว" เราไล่ตามความเร็วเหมือนกับที่นักแข่งรถไล่ตามความเร็ว!
ในการพัฒนาระบบต่างๆ ในปัจจุบัน ความเร็วไม่ใช่สิ่งที่สำคัญที่สุด ส่วนอื่นๆ เช่น ความเสถียร ความปลอดภัย การนำกลับมาใช้ใหม่ ฯลฯ มักถูกให้ความสำคัญสูงสุด ในปัจจุบัน รูปแบบการออกแบบ สถาปัตยกรรมการพัฒนา ฯลฯ ไม่ได้ออกแบบมาเพื่อแก้ไขปัญหาด้านประสิทธิภาพเป็นหลัก ข้อมูลข้างต้นได้รับการพิจารณาโดยนักวิเคราะห์และสถาปนิก โปรแกรมเมอร์ขนาดเล็กเช่นเราสามารถเพิ่มประสิทธิภาพโปรแกรมได้เฉพาะในตำแหน่งเล็กๆ ในโค้ด คลาส วิธีการ และบรรทัดของโค้ดเท่านั้น ฉันคิดว่าเป็นการดีที่จะใส่ใจในรายละเอียดมากขึ้น
โอเค ไร้สาระ มาพูดถึงหัวข้อของวันนี้กันดีกว่า ค่าใช้จ่ายด้านประสิทธิภาพของระบบเครือข่ายจำนวนมากที่พัฒนาขึ้นในขณะนี้ส่วนใหญ่อยู่ที่การอ่านและการส่งข้อมูลที่เร็วขึ้นและการใช้แบนด์วิธเครือข่ายที่น้อยลงคือเป้าหมายที่เราดำเนินการ ฉันจะพูดถึงวิธีปรับปรุงประสิทธิภาพของ .net จากแง่มุมนี้
1. การเพจข้อมูลในชั้นข้อมูล สามารถทำได้ผ่าน ExcuteReader หรือ Stored Procedure ครับ มีหลายวิธีที่ผมจะไม่ลงรายละเอียดครับ (คุณสามารถอ่านที่ผมเขียนได้)
2. ลองใช้ ExcuteReader เพื่ออ่านข้อมูลใน Microsoft ครับ PetShop 4.0 สามารถเข้าถึงข้อมูลทั้งหมดได้โดยใช้ ExcuteReader เว้นแต่คุณจะมีข้อกำหนดพิเศษสำหรับการไม่เชื่อมต่อ (เช่น SmartClient เป็นต้น)
3. ในสถานการณ์ที่ไม่ได้เชื่อมต่อ การใช้ DataTable จะมีประสิทธิภาพดีกว่าการใช้ DataSet เว้นแต่ว่าคุณต้องการบันทึกตารางเชิงสัมพันธ์หลายตาราง
4. ใช้วิธี ImportRow ของ DataTable
ในบางกรณีจำเป็นต้องคัดลอกข้อมูลจำนวนมากจาก DataTable หนึ่งไปยังอีก DataTable โดยใช้วิธี ImportRow ของ DataTable ซึ่งสามารถปรับปรุงประสิทธิภาพได้อย่างมาก เมื่อปริมาณข้อมูลมีขนาดเล็ก ถึงมากกว่า 10,000 แถว สามารถปรับปรุงได้อย่างมีนัยสำคัญและสามารถเข้าถึงได้หลายครั้ง
5. ทำให้ข้อมูลเป็นอนุกรมเป็นไฟล์ไบนารีเพื่อการส่งข้อมูลที่ง่ายดาย
เมื่อเราประมวลผลวัตถุ DataSet และ DataTable เราสามารถทำให้วัตถุเหล่านั้นเป็นอนุกรมเป็นไฟล์ XML ได้ หากพวกมันจะถูกส่งผ่านเครือข่าย ไฟล์ XML จะทำให้เกิดปัญหาด้านทรัพยากร เช่น หน่วยความจำและแบนด์วิธเครือข่าย ในขณะนี้ เราสามารถซีเรียลไลซ์มันเป็นไฟล์ไบนารีได้ ดังนั้นไฟล์ที่สร้างขึ้นจะลดลงอย่างมาก โค้ดจะเป็นดังนี้:
FileStream fs = new fileStream(@"XMLData.bin",FileMode.Create);
BinaryFormatter bf = ใหม่ BinaryFormatter();
bf.ซีเรียลไลซ์(fs,XMLData);
fs.colse();
ไฟล์ไบนารี่ที่สร้างขึ้นในลักษณะนี้เรียกว่า XMLBinary หากคุณเปิดไฟล์โดยตรงด้วย WINHEX คุณจะเห็นแท็ก XML บางส่วนในนั้น หากข้อมูลมีขนาดใหญ่ ให้เพิ่มบรรทัดโค้ด:
XMLData.RemortingFormat = SerializationFormat.Binary;
ไฟล์ที่สร้างขึ้นในเวลานี้เรียกว่าไฟล์ TrueBinary เมื่อประมวลผลจำนวนมาก (มากกว่า 10,000 บรรทัด) ขนาดไฟล์ที่สร้างขึ้นจะเป็นเศษส่วนของ XMLBinary สคีมาจะถูกบันทึกโดยอัตโนมัติในระหว่างการซีเรียลไลซ์ ทำให้กระบวนการยกเลิกลำดับง่ายขึ้น ฉันยังไม่รู้ว่าประสิทธิภาพในการดีซีเรียลไลซ์จะลดลงเท่าใดเมื่อเปรียบเทียบกับการอ่าน XML โดยตรง
6. ใช้พูลการเชื่อมต่ออย่างเหมาะสม
การรวมการเชื่อมต่อมีบทบาทสำคัญในการปรับปรุงประสิทธิภาพ และจะเปิดไว้ตามค่าเริ่มต้น ขนาดพูลขั้นต่ำเริ่มต้นคือ 0 ซึ่งโดยทั่วไปจะถูกตั้งค่าเป็นค่าที่ค่อนข้างเล็ก เช่น 5 ขนาดพูลสูงสุดเริ่มต้นคือ 100 ซึ่งเพียงพอสำหรับเว็บไซต์ส่วนใหญ่ ให้เพิ่มขนาดให้เหมาะสม
7. พัฒนาโดยใช้ SQLCLR
หากคุณกำลังมุ่งเน้นที่การเปิดซีรีส์ SQL Server คุณควรศึกษา SQLCLR ซึ่งมีประสิทธิภาพมากและสามารถปรับปรุงประสิทธิภาพได้ในหลาย ๆ สถานการณ์ (โดยเฉพาะแอปพลิเคชันระดับองค์กรขนาดใหญ่)
8. เข้าถึง APP.Config/Web.Config ผ่านคลาสคงที่
เรามีข้อมูลการกำหนดค่าจำนวนมากใน APP.Config/Web.Config ซึ่งมีการเข้าถึงบ่อยมาก ในเวลานี้ เราสร้างคลาสแบบคงที่ แอตทริบิวต์ทั้งหมดเข้าถึงได้ผ่านคลาสแบบคงที่ ซึ่งสามารถปรับปรุงประสิทธิภาพได้ในระดับหนึ่ง คลาสคงที่กำหนดค่าอินสแตนซ์เพียงครั้งเดียว และ APP.Config/Web.Config จะสร้างการดำเนินการ IO จำนวนมาก
MyWebConfig คลาสคงที่สาธารณะ
-
MyWebConfig แบบคงที่ ()
-
ConnString=
ConfigurationManager.ConnectionStrings["การเชื่อมต่อ"]
การเชื่อมต่อสตริง;
-
สตริงสาธารณะ DbConnectionString
-
รับ
-
กลับ ConnString;
-
-
-
โอเค แค่นี้แหละสำหรับวันนี้ ผมอยากจะชี้ให้เห็นถึงข้อผิดพลาดและข้อบกพร่องต่างๆ คุณสามารถเสนอความคิดเห็นที่ดีขึ้นและก้าวหน้าไปด้วยกัน