Pembangun SumatraPDF Meninggalkan std::function untuk Penyelesaian Callback Tersuai 16-Bait

Pasukan Editorial BigGo
Pembangun SumatraPDF Meninggalkan std::function untuk Penyelesaian Callback Tersuai 16-Bait

Pembangun di sebalik SumatraPDF , sebuah pemapar PDF Windows yang popular, telah berkongsi perjalanan mereka meninggalkan fungsi perpustakaan standard C++ ke arah pelaksanaan callback tersuai. Selepas 16 tahun bekerja pada pangkalan kod, mereka telah menggantikan kebanyakan penggunaan std::function dengan penyelesaian mereka sendiri yang mengutamakan kesederhanaan dan kebolehnyahpepijat berbanding ciri-ciri canggih.

Keputusan ini berpunca daripada cabaran nyahpepijat praktikal dan bukannya kebimbangan teori. Apabila kerosakan berlaku dalam pengeluaran, nama-nama yang dijana secara automatik daripada fungsi lambda menjadikannya hampir mustahil untuk mengesan masalah kembali ke lokasi kod yang spesifik. Mimpi ngeri nyahpepijat dunia sebenar ini mendorong pembangun untuk mencari alternatif yang memberikan laporan kerosakan yang lebih jelas.

Faedah Prestasi dan Memori Mendorong Pelaksanaan Tersuai

Penyelesaian tersuai memberikan penambahbaikan ketara dalam kedua-dua penggunaan memori dan kelajuan kompilasi. Sementara std::function menggunakan 64 bait pada sistem MSVC 64-bit, struktur Func0 dan Func1 yang baharu hanya menggunakan 16 bait setiap satu. Pengurangan empat kali ganda dalam jejak memori ini menjadi signifikan dalam aplikasi dengan banyak callback.

Selain daripada kecekapan masa jalan, pendekatan yang dipermudahkan secara dramatik mengurangkan masa kompilasi. Sifat templat berat std::function mencipta kembung kod yang besar, kerana pengkompil menjana definisi kelas baharu untuk setiap kombinasi jenis yang unik. Pelaksanaan tersuai mengelakkan kerumitan ini sepenuhnya.

Walau bagaimanapun, komuniti telah membangkitkan kebimbangan yang sah mengenai pertukaran prestasi tertentu. Penyelesaian tersuai memerlukan peruntukan heap untuk data pengguna, sementara std::function boleh mengoptimumkan penutupan kecil dengan menyimpannya secara sebaris. Ini bermakna kelebihan memori tidak sentiasa jelas, dan lokaliti cache mungkin terjejas dalam beberapa senario.

Perbandingan Penggunaan Memori:

  • std::function: 64 bait ( MSVC 64-bit )
  • Custom Func0/Func1 tersuai: 16 bait setiap satu
  • Pengurangan memori: jejak kaki 75% lebih kecil

Komuniti Membahaskan Pertukaran Antara Kesederhanaan dan Standard

Komuniti pembangun kekal terbahagi sama ada pendekatan ini mewakili amalan kejuruteraan yang baik. Pengkritik berhujah bahawa mengelakkan penyelesaian perpustakaan standard mencipta beban penyelenggaraan yang tidak perlu dan mengehadkan kebolehpindahan kod. Mereka menunjukkan bahawa alternatif seperti std::bind atau objek fungsi bernama boleh menangani kebimbangan nyahpepijat tanpa meninggalkan corak yang telah ditetapkan.

Penyokong menghargai pendekatan pragmatik, terutamanya memandangkan reputasi SumatraPDF kerana ringan dan pantas. Saiz aplikasi 10 MB berbeza ketara dengan kembung perisian moden biasa, dan setiap pengoptimuman menyumbang kepada pencapaian ini.

Kod saya, peraturan saya, kegembiraan saya. Tetapi secara falsafah, jika anda pernah tertanya-tanya mengapa kebanyakan perisian hari ini tidak dapat bermula serta-merta dan menghantar 100 MB bahan untuk menunjukkan tetingkap: ia adalah kerana kebanyakan pengaturcara tidak meletakkan sebarang pemikiran atau usaha untuk memastikan perkara kekal kecil dan pantas.

Perbincangan menyerlahkan ketegangan yang lebih luas dalam pembangunan C++ moden antara memanfaatkan ciri perpustakaan standard yang berkuasa dan mengekalkan kod yang boleh difahami dan dinyahpepijat dengan berkesan oleh pembangun individu. Walaupun penyelesaian tersuai mengorbankan fleksibiliti dan beberapa kemudahan C++ moden, ia memenuhi keperluan khusus yang paling penting untuk projek tertentu ini.

Pertukaran vs std::function:

  • Kelebihan: Jejak memori yang lebih kecil, kompilasi yang lebih pantas, kebolehbacaan laporan kerosakan yang lebih baik, pelaksanaan yang lebih mudah
  • Kelemahan: Terhad kepada tandatangan fungsi tertentu, memerlukan pengurusan memori manual, kekurangan pengoptimuman fungsi kecil, memerlukan lebih banyak kod boilerplate

Kesimpulan

Kajian kes ini menunjukkan bagaimana kekangan dunia sebenar boleh mendorong pembangun berpengalaman ke arah penyelesaian yang kelihatan mundur. Pendekatan SumatraPDF tidak akan sesuai untuk setiap projek, tetapi ia menawarkan wawasan berharga untuk pembangun yang mengutamakan kebolehnyahpepijat, kelajuan kompilasi, dan kecekapan memori berbanding kelengkapan ciri. Respons komuniti menunjukkan bahawa tiada jawapan universal yang betul - penyelesaian terbaik bergantung sepenuhnya pada keperluan dan kekangan khusus anda.

Rujukan: Simplest C++ callback, from SumatraPDF