Sangat sedikit pengembang perangkat lunak ilmiah yang memahami prinsip-prinsip desain yang baik, jadi saya minta maaf jika jawaban ini agak bertele-tele. Dari perspektif rekayasa perangkat lunak, tujuan pengembang perangkat lunak ilmiah adalah untuk merancang solusi yang memuaskan serangkaian kendala yang sering saling bertentangan .
Berikut adalah beberapa contoh khas dari kendala ini, seperti yang mungkin diterapkan pada desain perpustakaan matriks jarang Anda:
- Selesai dalam satu bulan
- Berjalan dengan benar di laptop Anda dan beberapa workstation
- Berjalan dengan efisien
Para ilmuwan secara bertahap lebih memperhatikan beberapa persyaratan umum lainnya dari rekayasa perangkat lunak:
- Dokumentasi (Panduan pengguna, tutorial, komentar kode)
- Maintainability (kontrol versi, pengujian, desain modular)
- Dapat digunakan kembali (desain modular, "fleksibilitas")
Anda mungkin memerlukan lebih atau kurang satu dari persyaratan ini. Jika Anda mencoba untuk memenangkan hadiah Gordon Bell untuk kinerja, maka bahkan sebagian kecil dari persentase itu relevan, dan beberapa hakim akan mengevaluasi kualitas kode Anda (selama Anda dapat meyakinkan mereka itu benar). Jika Anda mencoba untuk membenarkan menjalankan kode ini pada sumber daya bersama seperti cluster atau superkomputer, sering kali Anda harus mempertahankan klaim tentang kinerja kode Anda, tetapi ini jarang sangat ketat. Jika Anda mencoba untuk mempublikasikan makalah dalam jurnal yang menggambarkan perolehan kinerja dari pendekatan Anda, maka Anda harus secara sah menjadi lebih cepat daripada pesaing Anda, dan 20% kinerja merupakan trade-off yang dengan senang hati saya akan buat untuk pemeliharaan dan penggunaan kembali yang lebih baik.
Kembali ke pertanyaan Anda, "desain yang bagus", diberikan waktu pengembangan yang cukup, seharusnya tidak pernah mengorbankan kinerja. Jika tujuannya adalah untuk membuat kode yang berjalan secepat mungkin, maka kode tersebut harus dirancang di sekitar kendala tersebut. Anda dapat menggunakan teknik seperti pembuatan kode, perakitan inline, atau memanfaatkan perpustakaan yang sangat disetel untuk membantu Anda memecahkan masalah Anda.
Tetapi bagaimana jika Anda tidak memiliki waktu pengembangan yang cukup? Apa yang cukup bagus? Yah, itu tergantung, dan tidak ada yang akan bisa memberi Anda jawaban yang baik untuk pertanyaan ini tanpa lebih banyak konteks.
FWIW: Jika Anda benar-benar tertarik untuk menulis kernel matriks jarang berkinerja tinggi, Anda harus membandingkan dengan instalasi PETSc yang dioptimalkan dan bekerja dengan tim mereka jika Anda mengalahkannya, mereka akan dengan senang hati memasukkan kernel yang sudah disetel ke perpustakaan.