Menggunakan API Kompresi
Banyak aplikasi perlu menggunakan kompresi dan dekompresi data tanpa kehilangan. API Kompresi menyederhanakan ini dengan mengekspos algoritma kompresi Windows melalui API publik. Setiap algoritma kompresi memiliki sekumpulan properti yang mengontrol perilakunya. API Kompresi mengekspos antarmuka yang memungkinkan pengembang untuk mengatur atau mengkueri nilai properti ini. Semua properti untuk algoritma kompresi yang didukung memiliki nilai default yang mewakili nilai yang umum digunakan dari properti ini. Jika properti diperlukan untuk pemadatan dan dekompresi, nilai default akan identik, memastikan nilai yang identik digunakan untuk pemadatan dan dekompresi.
Memilih algoritma pemadatan
Setelah pengembang memutuskan bahwa aplikasi perlu mengompresi atau mendekompresi data, langkah selanjutnya adalah memilih algoritma kompresi. Ini mungkin tergantung pada pengujian untuk menemukan kombinasi kecepatan, rasio kompresi, dan persyaratan memori dengan performa terbaik untuk aplikasi tertentu. Daftar berikut memberikan perbandingan relatif dari algoritma kompresi yang saat ini didukung oleh API Kompresi. Tidak setiap opsi tersedia untuk setiap algoritma kompresi, dan perbandingannya adalah perkiraan karena performa dapat bergantung pada data input.
XPRESS (COMPRESS_ALGORITHM_XPRESS)
- Sangat cepat dengan persyaratan sumber daya rendah
- Rasio kompresi sedang
- Kecepatan kompresi dan dekompresi tinggi
- Persyaratan memori rendah
- Mendukung opsi COMPRESS_INFORMATION_CLASS_LEVEL yang tersedia dalam enumerasi COMPRESS_INFORMATION_CLASS. Nilai defaultnya adalah (DWORD)0. Untuk beberapa data, nilai (DWORD)1 dapat meningkatkan rasio kompresi dengan kecepatan pemadatan yang sedikit lebih lambat.
XPRESS dengan pengodean Huffman (COMPRESS_ALGORITHM_XPRESS_HUFF)
- Rasio kompresi lebih tinggi dari COMPRESS_ALGORITHM_XPRESS
- Rasio kompresi sedang
- Kecepatan kompresi dan dekompresi sedang hingga tinggi
- Persyaratan memori rendah
- Mendukung opsi COMPRESS_INFORMATION_CLASS_LEVEL dalam enumerasi COMPRESS_INFORMATION_CLASS. Nilai defaultnya adalah (DWORD)0. Untuk beberapa data, nilai (DWORD)1 dapat meningkatkan rasio kompresi dengan kecepatan pemadatan yang sedikit lebih lambat.
MSZIP (COMPRESS_ALGORITHM_MSZIP)
- Menggunakan lebih banyak sumber daya daripada COMPRESS_ALGORITHM_XPRESS_HUFF
- Menghasilkan blok terkompresi yang mirip dengan RFC 1951.
- Rasio kompresi sedang hingga tinggi
- Kecepatan kompresi sedang dan kecepatan dekompresi tinggi
- Persyaratan memori sedang
LZMS (COMPRESS_ALGORITHM_LZMS)
- Algoritma yang baik jika ukuran data yang akan dikompresi lebih dari 2MB.
- Rasio kompresi tinggi
- Kecepatan kompresi rendah dan kecepatan dekompresi tinggi
- Persyaratan memori sedang hingga tinggi
- Mendukung opsi COMPRESS_INFORMATION_CLASS_BLOCK_SIZE dalam enumerasi COMPRESS_INFORMATION_CLASS. Ukuran minimum 1 MB disarankan untuk mendapatkan rasio kompresi yang lebih baik.
Memutuskan mode API Kompresi mana yang akan digunakan
Setelah pengembang memilih algoritma kompresi, keputusan berikutnya adalah salah satu dari dua mode API Kompresi yang akan digunakan: mode buffer atau mode blok. Mode buffer dikembangkan untuk kemudahan penggunaan dan direkomendasikan untuk sebagian besar kasus.
Mode buffer secara otomatis membagi buffer input menjadi blok ukuran yang sesuai untuk algoritma kompresi yang dipilih. Mode buffer secara otomatis memformat dan menyimpan ukuran buffer yang tidak dikompresi dalam buffer terkompresi. Ukuran buffer terkompresi tidak disimpan secara otomatis, dan aplikasi perlu menyimpan ini untuk dekompresi. Jangan sertakan bendera COMPRESS_RAW dalam parameter Algoritma saat Anda memanggil CreateCompressor dan CreateDecompressor untuk menggunakan mode buffer. Untuk contoh kode aplikasi mode buffer, lihat bagian Menggunakan API Kompresi dalam mode buffer.
Mode blok memungkinkan pengembang untuk mengontrol ukuran blok, tetapi memerlukan lebih banyak pekerjaan yang dilakukan oleh aplikasi. Saat menggunakan mode blok, aplikasi harus memecah data input menjadi potongan berukuran tepat saat mengompresi dan kemudian menyatukan kembali potongan-potongan saat mendekompresi. Mode blok gagal jika ukuran buffer input lebih besar dari ukuran blok internal algoritma kompresi. Ukuran blok internal adalah 32KB untuk MSZIP dan 1GB untuk algoritma kompresi XPRESS. Ukuran blok internal untuk LZMS dapat dikonfigurasi hingga 64GB dengan peningkatan penggunaan memori yang sesuai. Ukuran buffer terkompresi tidak disimpan secara otomatis, dan aplikasi juga perlu menyimpan ini untuk dekompresi. Nilai parameter UncompressedBufferSize dari Decompress harus sama persis dengan ukuran asli data yang tidak dikompresi dan bukan hanya ukuran buffer output. Ini berarti aplikasi Anda harus menyimpan ukuran asli yang tepat dari data yang tidak dikompresi, serta data terkompresi dan ukuran terkompresi, saat menggunakan mode blok. Sertakan bendera COMPRESS_RAW dalam parameter Algoritma saat Anda memanggil CreateCompressor dan CreateDecompressor untuk menggunakan mode blokir. Untuk contoh kode aplikasi mode blok, lihat bagian Menggunakan API Kompresi dalam mode blok.
Alokasi memori kustom
Aplikasi mode buffer dan blok memiliki opsi untuk menentukan rutinitas alokasi memori kustom saat mereka memanggil CreateCompressor dan CreateDecompressor. Parameter AllocationRoutines menentukan struktur COMPRESS_ALLOCATION_ROUTINES yang berisi rutinitas alokasi memori. Aplikasi kemudian dapat mengatur ukuran blok untuk kompresor menggunakan SetCompressorInformation. Lihat bagian Menggunakan API Kompresi dalam mode blok untuk contoh rutinitas alokasi yang disesuaikan sederhana.