การเปรียบเทียบประสิทธิภาพของไดรเวอร์เครือข่ายในเวอร์ชันในภาษาการเขียนโปรแกรม 10 ภาษา

กลุ่มนักวิจัยจากมหาวิทยาลัยในเยอรมนี การตีพิมพ์ ผลลัพธ์ การทดลองในระหว่างนั้นไดรเวอร์มาตรฐาน 10 เวอร์ชันสำหรับการ์ดเครือข่าย Intel Ixgbe (X10xx) 5 กิกะบิตได้รับการพัฒนาในภาษาการเขียนโปรแกรมที่แตกต่างกัน ไดรเวอร์ทำงานในพื้นที่ผู้ใช้และใช้งานใน C, Rust, Go, C#, Java, OCaml, Haskell, Swift, JavaScript และ Python เมื่อเขียนโค้ด จุดสนใจหลักคือการบรรลุประสิทธิภาพที่ดีที่สุดเท่าที่จะเป็นไปได้ โดยคำนึงถึงคุณลักษณะของแต่ละภาษา ตัวเลือกทั้งหมดมีฟังก์ชันการทำงานเหมือนกันและประกอบด้วยโค้ดประมาณ 1000 บรรทัด การพัฒนาโครงการ การแพร่กระจาย ภายใต้ใบอนุญาต BSD

ไดรเวอร์เวอร์ชัน Rust นั้นมีประสิทธิภาพใกล้เคียงกับไดรเวอร์อ้างอิงในภาษา C มาก ภายใต้โหลดที่มีการส่งบล็อก 32 แพ็กเก็ตพร้อมกันไดรเวอร์ Rust อยู่ข้างหลังเล็กน้อย แต่ในการทดสอบที่มีมากกว่า 32 แพ็กเก็ตต่อบล็อก ความเร็วแทบไม่แตกต่างจากไดรเวอร์ C และแสดงให้เห็นประสิทธิภาพที่ระดับการประมวลผล 28 ล้าน แพ็คเก็ตต่อวินาทีบนเซิร์ฟเวอร์ที่มี Xeon CPU E3-1230 v2 3.3 GHz

การเปรียบเทียบประสิทธิภาพของไดรเวอร์เครือข่ายในเวอร์ชันในภาษาการเขียนโปรแกรม 10 ภาษา

ช่องถัดไปในแง่ของประสิทธิภาพถูกครอบครองโดยไดรเวอร์ในภาษา Go และ C# ซึ่งแสดงผลลัพธ์ที่ค่อนข้างใกล้เคียงกัน (ไดรเวอร์ Go ชนะในการทดสอบด้วยบล็อกมากถึง 16 แพ็กเก็ต และเริ่มสูญเสียเล็กน้อยในการทดสอบที่มีมากกว่า 16 แพ็กเก็ต ในบล็อก) ด้วย 256 แพ็กเก็ตต่อบล็อก ประสิทธิภาพสูงสุดของไดรเวอร์ C# อยู่ที่ประมาณ 28 ล้านแพ็กเก็ตต่อวินาที และไดรเวอร์ Go อยู่ที่ประมาณ 25 ล้านแพ็กเก็ตต่อวินาที

ถัดมาซึ่งผลลัพธ์ค่อนข้างใกล้เคียงกันคือตัวขับเคลื่อนสำหรับ
Java, OCaml และ Haskell ซึ่งล้าหลังตัวเลือกที่พิจารณาก่อนหน้านี้อย่างเห็นได้ชัดและไม่สามารถเอาชนะแพ็กเก็ต 12 ล้านแพ็กเก็ตต่อวินาทีได้ ไดรเวอร์ Swift และ JavaScript แสดงความล่าช้ามากยิ่งขึ้น โดยสามารถประมวลผลสตรีมที่ระดับ 5 ล้านแพ็กเก็ตต่อวินาที

การจัดอันดับสูงสุดเสร็จสิ้นโดยไดรเวอร์ Python ซึ่งสามารถประมวลผลได้เพียง 0.14 ล้านแพ็กเก็ตต่อวินาที การใช้งาน Python ใช้เพื่อประเมินความเร็วของล่ามที่ไม่มี JIT และไม่มีการเพิ่มประสิทธิภาพเฉพาะ (โค้ดถูกดำเนินการโดยใช้ CPython 3.7 และเข้ากันไม่ได้กับ PyPy แต่มีข้อสังเกตว่าการปรับโครงสร้างการจัดเก็บข้อมูลให้เหมาะสมสามารถปรับปรุงประสิทธิภาพได้ประมาณ 10 เท่า ).

นอกจากนี้ ยังมีการทดสอบเวลาแฝงเพื่อแสดงประสิทธิภาพของการบัฟเฟอร์และผลกระทบของตัวรวบรวมขยะ การทดสอบวัดเวลาแฝงหลังจากที่แต่ละแพ็กเก็ตถูกส่งต่อโดยไดรเวอร์ เปรียบเทียบกับเวลาที่แน่นอนที่ถูกส่ง ผู้นำยังคงเป็นไดรเวอร์ C และ Rust ซึ่งผลลัพธ์แทบจะแยกไม่ออกจากกระแส 1 ล้านแพ็กเก็ตต่อวินาที (ประมาณ 20 µs) นักขับ Go ทำงานได้ดี โดยตามหลังผู้นำเพียงเล็กน้อยและยังคงอยู่ที่ระดับ 20 µs ไดรเวอร์ C# แสดงความล่าช้าประมาณ 50 µs
ความล่าช้าที่ยาวที่สุดแสดงโดยไดรเวอร์ JavaScript และ Java (เวลาแฝงมากกว่า 300 µs)

การเปรียบเทียบประสิทธิภาพของไดรเวอร์เครือข่ายในเวอร์ชันในภาษาการเขียนโปรแกรม 10 ภาษา

การศึกษานี้ดำเนินการเพื่อประเมินความเป็นไปได้ในการพัฒนาไดรเวอร์และส่วนประกอบระบบปฏิบัติการในภาษาระดับที่สูงกว่า C ปัจจุบัน ปัญหาหน่วยความจำ 39 จาก 40 รายการใน Linux เกี่ยวข้องกับไดรเวอร์ ดังนั้นปัญหาในการใช้ภาษาที่ปลอดภัยยิ่งขึ้นและการย้ายไดรเวอร์ออกจากเคอร์เนลไปยังพื้นที่ผู้ใช้ ยังคงมีความเกี่ยวข้อง และผู้ผลิตกำลังทดลองอย่างจริงจังในทิศทางนี้ (เช่น Google ได้พัฒนา TCP stack สำหรับระบบปฏิบัติการ สีแดงม่วง ในภาษา Go บริษัท CloudFlare สร้าง การใช้โปรโตคอล QUIC ใน Rust นั้น Apple ได้ย้ายสแต็ก TCP บนอุปกรณ์มือถือไปยังพื้นที่ผู้ใช้)

ในระหว่างการทำงาน สรุปได้ว่าภาษา Rust เป็นตัวเลือกที่ดีที่สุดสำหรับการพัฒนาไดรเวอร์ ความสามารถของ Rust ขจัดปัญหาที่เกี่ยวข้องกับการจัดการหน่วยความจำระดับต่ำโดยสูญเสียประสิทธิภาพประมาณ 2% ถึง 10% เมื่อเทียบกับไดรเวอร์ C Go และ C# ยังถือว่าเหมาะสำหรับการสร้างส่วนประกอบของระบบในสถานการณ์ที่ยอมรับความหน่วงต่ำกว่ามิลลิวินาทีที่เกิดจากการรวบรวมขยะได้

ที่มา: opennet.ru

เพิ่มความคิดเห็น