ทดสอบสมรรถภาพ SharpZibLib กับไฟล์ที่ serialize คลาสเป็น binary

ไฟล์เกมบางอันที่ serialize ทั้งคลาสเป็น binary ไว้ด้วยคอมโบ BinaryFormatter + CryptoStream (DES) เพื่อใส่พาสเวิร์ดมันก็ใช้ได้นะ แต่ออกมาใหญ่มาก

ทดสอบสมรรถภาพ SharpZibLib กับไฟล์ที่ serialize คลาสเป็น binary

วัตถุประสงค์

ไฟล์เกมบางอันที่ serialize ทั้งคลาสเป็น binary ไว้ด้วยคอมโบ BinaryFormatter + CryptoStream (DES) เพื่อใส่พาสเวิร์ดมันก็ใช้ได้นะ แต่ออกมาใหญ่มาก

ก็เลยเปลี่ยนมาใช้การ compress ใส่พาสดีกว่า มาเจอ SharpZibLib ที่ดูดี สามารถทำ Zip, GZip, Tar ได้ แล้วก็อ่าน LZW ได้

อุปกรณ์

icsharpcode/SharpZipLib
SharpZipLib - #ziplib is a Zip, GZip, Tar and BZip2 library written entirely in C# for the .NET platform.github.com

วิธีการทดลอง

หลังจากเรียนรู้วิธีใช้แล้วก็ได้เวลาทดสอบว่ามี compression เลเวลไหนให้ใช้บ้าง โค้ดที่ใช้ก็ประมาณนี้ครับ (Unity) เลเวลมีตั้งแต่ 0 ถึง 9 ลอง compress แล้วอ่านกลับมาด้วยว่าใช้เวลามากน้อยต่างกันแค่ไหน ไซส์ได้เท่าไหร่

ผลการทดลอง

BZip2 (+DES CryptoStream)

Compress Time Avg : 970 ms

Size : 690 KB → 137 KB

ไม่มี compression level ให้ใช้นะ แล้วก็ไม่มี password ด้วย เพราะงั้นเลยต้องยัดเข้า CryptoStream เองอีกรอบ

อภิปรายผลการทดลอง

  • จะเห็นว่าแค่ Zip Lv.1 ก็ช่วยได้มากแล้ว (ลดขนาดได้ตั้ง 72.75%) แต่ตั้งแต่ Lv.6 เป็นต้นไปเริ่มขาดทุนกับเวลาที่ใช้
  • BZip2 ไม่มี Lv. ให้ตั้ง และได้ขนาดเล็กที่สุด เวลาที่ใช้ มากกว่า Lv.7 ของ Zip
  • สำหรับ decompress time เท่าที่ลอง ไม่ว่าจะ compress ด้วย Lv. ไหนก็ใช้เวลาเท่าๆกัน
  • เปลี่ยน ZipInputStream เป็น GZipInputStream แล้วผลออกมาเหมือนๆเดิมก็เลยไม่ได้ทดลองต่อ

สรุปผลการทดลอง

ถ้าห่วงเรื่องเวลา compress ใช้ Zip compression Lv.5-6 ถ้าไม่ห่วงก็ใช้ BZip2 ครับ

สิ่งที่ได้จากการทดลอง

  • ได้รู้ว่าการ compress มีระดับต่างกันอย่างไร ใช้เวลาต่างกันอย่างไรบ้าง
  • ได้รับความรู้ใหม่ๆในเรื่องโปรแกรมมิ่ง
  • ได้ฝึกฝนทักษะการวิเคราะห์ของตนเองให้ดีขึ้น