Saya sedang melakukan beberapa transmisi data dari dsPIC ke PC dan saya sedang melakukan CRC 8-bit untuk setiap blok 512 byte untuk memastikan tidak ada kesalahan. Dengan diaktifkannya kode CRC saya mendapatkan sekitar 33KB / s, tanpa itu saya mendapatkan 67KB / s.
Apa beberapa alternatif algoritma deteksi kesalahan untuk memeriksa yang akan lebih cepat?
Jawaban:
Meskipun mungkin ada opsi yang lebih cepat daripada CRC, jika Anda menggunakannya maka Anda cenderung mengorbankan beberapa tingkat kemampuan deteksi kesalahan. Bergantung pada apa persyaratan deteksi kesalahan Anda, alternatifnya mungkin menggunakan kode CRC yang dioptimalkan untuk aplikasi Anda.
Untuk perbandingan CRC dengan opsi lain, lihat jawaban yang sangat bagus oleh Martin Thompson .
Salah satu opsi untuk membantu ini adalah pycrc yang merupakan alat (ditulis dalam python 1 ) yang dapat menghasilkan kode sumber C untuk puluhan kombinasi model dan algoritma CRC . Ini memungkinkan Anda untuk mengoptimalkan kecepatan dan ukuran untuk aplikasi Anda sendiri dengan memilih dan membandingkan berbagai kombinasi. 1: Membutuhkan Python 2.6 atau yang lebih baru.
Ini mendukung
crc-8
model , tetapi juga mendukungcrc-5
,crc-16
dan dicrc-32
antara yang lainnya. Adapun algoritma , mendukungbit-by-bit
,bit-by-bit-fast
dantable-driven
.Misalnya (mengunduh arsip):
Anda bahkan dapat melakukan hal-hal yang funky seperti menentukan menggunakan pencarian nibble ganda (dengan tabel pencarian 16 byte) daripada mencari byte tunggal, dengan tabel pencarian 256 byte.
Sebagai contoh (kloning repositori git):
Mengingat keterbatasan memori dan kecepatan Anda, opsi ini mungkin merupakan kompromi terbaik antara kecepatan dan ukuran kode. Satu-satunya cara untuk memastikannya adalah dengan membandingkannya.
The pycrc git repositori pada github , seperti yang pelacak isu , tetapi juga dapat didownload dari sourceforge .
sumber
Paritas satu bit sederhana (pada dasarnya XOR data berulang-ulang) adalah secepat yang bisa didapat. Anda kehilangan banyak kesalahan saat memeriksa CRC.
Dalam pseudocode:
sumber
Makalah yang sangat bagus membandingkan kinerja berbagai checksum dan CRC dalam konteks tertanam:
Efektivitas Checksum untuk Jaringan Tertanam
Beberapa kutipan dari kesimpulan (berdasarkan studi mereka tentang probabilitas kesalahan yang tidak terdeteksi):
Saat burst burst mendominasi
Di aplikasi lain
Jika biaya perhitungan sangat dibatasi
(seperti dalam kasus Anda), gunakan (dalam urutan efektivitas):
Kutipan lainnya:
dan
sumber
The Adler checksum harus cukup untuk memeriksa distorsi transmisi. Ini digunakan oleh pustaka kompresi Zlib, dan diadopsi oleh Java 3D Mobile Graphics Standard untuk memberikan pemeriksaan integritas data yang cepat namun efektif.
Dari halaman wikipedia :
sumber
Saya tidak mengetahui apa pun yang seefektif deteksi kesalahan sebagai CRC dan lebih cepat - jika ada, orang akan menggunakannya sebagai gantinya.
Anda dapat mencoba checksum sederhana, tetapi itu jauh lebih kecil kemungkinannya untuk mendeteksi kesalahan.
sumber
Logika checksum itu sendiri bagus dan orang dapat membantu dengan algoritma yang lebih cepat.
Jika Anda ingin meningkatkan kecepatan komponen Anda, Anda mungkin perlu melihat mengubah teknik keseluruhan Anda untuk memisahkan komponen transfer dari komponen validasi.
Jika Anda memiliki ini sebagai dua item independen (pada utas berbeda) maka Anda bisa mendapatkan kecepatan transfer penuh dan hanya mengirim ulang paket yang gagal.
Algoritma akan terlihat seperti:
Ini akan memungkinkan Anda trasmit pada kecepatan setinggi mungkin dan jika Anda bermain dengan ukuran paket Anda, Anda bisa menghitung tingkat kegagalan optimium VS memvalidasi / mengirim ulang tingkat.
sumber
Checksum tradisional
(kurangi # '+ aliran)
XOR seperti yang diberikan di atas akan bekerja juga
(kurangi aliran XOR # ')
Skema yang sedikit lebih rumit (lebih lambat) adalah pemeriksaan paritas standar untuk koneksi serial.
Pada level ini, Anda memperdagangkan kebenaran untuk kecepatan. Ini terkadang akan gagal.
Pada tingkat paling canggih berikutnya, Anda dapat menggunakan beberapa jenis barang crc / hash.
Desain lain adalah meningkatkan ukuran blok yang digunakan untuk aliran.
Anda harus memiliki perkiraan tingkat kesalahan aktual untuk menyesuaikan pemilihan algoritma dan parameter untuk ukuran blok.
sumber