Apa yang Anda optimalkan? [Tutup]


19

Secara umum, jenis optimasi apa yang biasanya Anda condongkan saat merancang perangkat lunak?

Apakah Anda tipe yang lebih memilih untuk mengoptimalkan desain Anda

  • Waktu pengembangan (yaitu, cepat untuk menulis dan / atau lebih mudah untuk mempertahankan)?
  • Waktu memproses
  • Ruang penyimpanan (baik RAM, DB, Disc, dll)

Tentu saja ini sangat subjektif untuk jenis masalah yang sedang dipecahkan, dan tenggat waktu yang terlibat, jadi saya ingin mendengar tentang alasan yang akan membuat Anda memilih satu bentuk pengoptimalan dari yang lain.


Ketiga hal di atas, tetapi saya ingin melempar secara umum (yang berkaitan dengan pemeliharaan). Ketika Anda meluangkan waktu untuk merancang struktur data yang sangat efisien yang dapat diterapkan secara luas untuk kebutuhan perangkat lunak Anda, misalnya, dan mengujinya secara menyeluruh, itu akan membantu Anda selama bertahun-tahun dan mencegah Anda dari harus menulis lebih banyak lagi struktur data yang secara sempit cocok untuk menyelesaikan masalah individu. masalah.

Jawaban:


40

Pemeliharaan

Kemudian membuat profil jika perlu dan mengoptimalkan kecepatan. Jarang sekali saya memiliki kebutuhan untuk penyimpanan - setidaknya tidak dalam 10 tahun terakhir. Sebelum itu saya lakukan.


8
+1, jika Anda mengoptimalkan untuk pemeliharaan sejak awal, maka akan lebih mudah untuk mengoptimalkan kecepatan atau penyimpanan nanti jika terbukti perlu.
Carson63000

Anda masih perlu setidaknya mempertimbangkan waktu pemrosesan dan penyimpanan sehingga Anda tidak memilih pendekatan yang sangat berlebihan.

@ Thorbjørn, jika Anda mengoptimalkan waktu pengembang Anda mungkin (kemungkinan besar) akan memilih algoritme yang lebih mudah dibaca / tulis dalam bahasa tertentu. Hanya nanti, dan hanya jika kinerja menjadi masalah, Anda berdua (seperti @Tim mengatakannya) mengambil profiler.
Jason Whitehorn

@ Jason, saya sangat tidak setuju. Anda harus terbiasa dengan karakteristik kinerja dari algoritma yang Anda pilih sehingga Anda memilih implementasi yang sesuai. Yaitu memilih ArrayList ketika Anda membutuhkannya terutama untuk mencari kode pos mungkin tidak skala dengan baik.

1
@ Thorbjørn, saya tidak setuju dengan Anda. Bahkan, saya pikir Anda benar karena perhatian harus diberikan pada algoritma yang ada. Namun, saya pikir di mana kami berbeda dalam pendapat adalah bahwa menurut pendapat saya ide algoritma mana yang dipilih adalah sesuatu yang dipelajari melalui pengalaman, dan diperbaiki hanya ketika masalah muncul dengan sendirinya. Anda benar dalam poin Anda, saya hanya tidak melihat perlunya mengoptimalkan untuk itu dengan mengorbankan kurang terbaca / lebih lama untuk mengimplementasikan kode.
Jason Whitehorn

27

Waktu pengembangan

Pemrosesan dan penyimpanan murah. Waktu Anda tidak.

Hanya untuk diperhatikan:

Ini tidak berarti melakukan pekerjaan yang buruk dalam menulis kode hanya untuk menyelesaikannya dengan cepat. Itu berarti menulis kode dengan cara yang memfasilitasi pengembangan cepat. Itu juga sepenuhnya tergantung pada kasus penggunaan Anda. Jika ini adalah situs web sederhana, dua atau tiga halaman dengan formulir kontak Anda mungkin tidak perlu menggunakan kerangka kerja PHP. Beberapa menyertakan dan skrip mailer akan mempercepat pengembangan. Jika rencananya adalah menciptakan platform yang fleksibel untuk menumbuhkan dan menambahkan fitur baru, ada baiknya meluangkan waktu untuk menaruhnya dengan benar dan kode sesuai karena itu akan mempercepat pengembangan di masa depan.

Dalam perbandingan langsung dengan waktu pemrosesan dan penyimpanan, saya condong ke arah waktu pengembangan yang lebih cepat. Apakah menggunakan fungsi collectionutils mengurangi metode pengumpulan koleksi tercepat dan paling efisien memori? Tidak! Tapi ini waktu pengembangan yang lebih cepat. Jika Anda mengalami hambatan kinerja atau memori, Anda dapat menyelesaikannya nanti. Mengoptimalkan sebelum Anda tahu apa yang perlu dioptimalkan adalah buang - buang waktu dan itulah yang saya anjurkan.


4
Hukum Moore berakhir sekitar dua tahun lalu. Mungkin sudah waktunya untuk mulai berpikir tentang konkurensi dan menggunakan core ekstra itu. Itulah satu-satunya cara Anda akan mendapatkan siklus jam murah di masa depan.
Robert Harvey

3
Agar benar, hukum Moore masih kuat dengan penggandaan jumlah transistor pada sebuah chip kira-kira setiap 2 tahun, yang memungkinkan penempatan beberapa core pada satu die. Apa yang telah berakhir adalah 'makan siang gratis' dari peningkatan jumlah siklus per detik.
Dominique McDonnell

1
"Pemrosesan dan penyimpanan murah." Cache CPU dan kecepatan bus tidak. Mereka adalah hambatan kinerja utama hari ini.
mojuba

3
Saya sepenuhnya setuju dengan ini. Mempertahankan kode yang dapat dibaca, menggunakan alat yang sesuai untuk tugas tersebut, dan mematuhi standar yang disetujui perusahaan Anda akan secara signifikan mengurangi waktu yang dihabiskan untuk mengetik kode di komputer, menghemat perusahaan Anda banyak uang. Waktu Anda lebih baik dihabiskan untuk rekayasa daripada mengetik.
Matt DiTrolio

1
@ Bill: Atau jika Anda melakukan embedded, di mana Anda mungkin memiliki batas keras yang secara signifikan akan meningkatkan biaya produk jika Anda melebihi mereka. Atau untuk perangkat lunak server, kadang-kadang - jika seseorang dapat meningkatkan pemrosesan di server Google sebesar 1%, itu akan menjadi sedikit penghematan.
David Thornley

12

Pengalaman pengguna.

Ini adalah satu-satunya nilai yang penting bagi pelanggan Anda.

Waktu pengembangan kurang penting. Saya dapat menulis aplikasi baris perintah berfitur lengkap jauh lebih cepat daripada GUI, tetapi jika Ny. Jane tidak dapat menemukan cara untuk mengeluarkan laporan yang dia inginkan, itu tidak berguna.

Perawatan kurang penting. Saya dapat memperbaiki jungkat-jungkit dengan sangat cepat, tetapi jika berada di tengah hutan, pengguna tidak dapat menemukannya.

Waktu pemrosesan kurang penting. Jika saya membuat mobil dengan kecepatan 0 hingga cahaya dalam 60 detik, pengguna tidak dapat menyetir.

Estetika kurang penting. Saya bisa melukis Mona Lisa, tetapi jika dia bersembunyi di balik dinding tidak ada yang bisa melihatnya.

Pengalaman Pengguna adalah satu-satunya nilai yang penting. Membuat aplikasi yang melakukan apa yang diinginkan pengguna dengan cara yang diharapkan pengguna adalah pencapaian tertinggi.


Maaf Joeri, saya agak terbawa dalam edit saya.
Malfist

Itu adalah wiki komunitas untuk sesuatu, bukan? ;)
Joeri Sebrechts

8

Hanya ada satu hal untuk dioptimalkan dan itu adalah:

Apa yang diinginkan pelanggan Anda

Apakah pelanggan Anda membutuhkan program secepat mungkin? Optimalkan untuk kecepatan.

Apakah pelanggan Anda membutuhkan keandalan absolut? Optimalkan untuk itu.

Apakah mereka membutuhkannya dikirim besok atau tidak akan berguna? Optimalkan untuk kecepatan pengembangan.

Berjalan di perangkat yang sangat terbatas sumber daya? Optimalkan untuk sumber daya tersebut.


Satu-satunya hasil adalah bahwa mereka sering tidak tahu apa yang mereka inginkan, atau memiliki harapan tentang apa yang mungkin atau bermanfaat.
Tim Williscroft

1
Dan ketika ditanyai serangkaian pertanyaan pilihan ganda itu, paling sering Anda hanya akan mendengar "ya" :-)
Jason Whitehorn

1
Saya tidak mengatakan itu mudah. Dan setidaknya jika Anda bertanya, ada kemungkinan Anda akan mendapatkan jawaban yang bermanfaat.
DJClayworth

5

waktu memproses

Waktu pengguna saya tidak murah. Apa yang terjadi berputar-putar.


Saya baru saja memutakhirkan aplikasi yang saya gunakan ini tahun lalu. Mereka telah sepenuhnya menulis ulang aplikasi itu, dan bocah itu lambat. Saya akhirnya harus membeli komputer baru untuk menjalankannya dengan cepat. Saya jamin itu tidak murah, tapi waktu saya lebih berharga.


Menarik mengambil waktu pemrosesan miring. Peduli membagikan jenis aplikasi apa yang Anda kembangkan? Saya tertarik.
Jason Whitehorn

1
Waktu pemrosesan sangat penting jika Anda menjalankan banyak komputer. Misalnya, jika itu pilihan antara menghabiskan 2 bulan ekstra untuk mengoptimalkan, atau memutakhirkan 10.000 PC ke perangkat keras yang lebih baru, dalam hal ini waktu pengembang tidak menang. Tapi tentu saja, itu kompromi. Jika Anda hanya menjalankan setengah lusin server, waktu pengembang kemungkinan menang dalam hal itu.
Dean Harding

1
@Jason, saya mudah sekarang, bekerja dengan Excel dan VBA dalam konglomerasi spreadsheet (yang telah saya kondensasi dengan cepat). Pengguna saya bekerja di kamar sebelah, dan mereka memberi tahu saya jika saya memiliki masalah. Perspektif saya berasal dari menggunakan komputer selama tiga puluh tahun, dan menonton aplikasi terus membengkak, memaksa upgrade terlalu kompensasi. Saya tahu bahwa pengembang dapat melakukan yang lebih baik, mereka hanya perlu membiasakan menulis kode yang efisien.

+10 untuk kode efisien. Itu terlalu sering diabaikan, terutama dalam pemrograman modular. Setiap modul berjalan pada kecepatan yang masuk akal, tetapi jumlah semuanya bisa sangat lambat.
Joris Meys

4

Saya cenderung condong ke arah membatasi konsumsi memori dan alokasi. Saya tahu ini sekolah tua, tetapi:

  • Sebagian besar kode non-sekali pakai yang saya tulis sangat paralel. Ini berarti bahwa alokasi memori yang berlebihan dan aktivitas pengumpulan sampah akan membuat serial banyak kode yang dapat diparalelkan. Ini juga berarti akan ada banyak pertengkaran untuk bus memori bersama.
  • Bahasa utama saya adalah D, yang belum memiliki dukungan 64-bit yang baik (meskipun ini sedang diperbaiki).
  • Saya bekerja dengan dataset yang cukup besar secara teratur.

+1 untuk bekerja mencegah bloatware. Program memori hogging adalah program yang buruk.

Program memory hogging dapat dijalankan pada sistem 64-bit, pada umumnya. Itulah yang kami lakukan ketika salah satu aplikasi kami mengalami masalah memori (ini menggunakan memori dalam jumlah besar secara sah). Poin pertama adalah penting ketika kinerja.
David Thornley

2

Saya akan mengatakan saya mengoptimalkan efisiensi, dengan efisiensi didefinisikan sebagai kompromi antara waktu pengembangan, pemeliharaan masa depan, pengalaman pengguna dan sumber daya yang dikonsumsi. Sebagai pengembang, Anda harus menyulap semua ini untuk menjaga keseimbangan.

Bagaimana Anda mencapai keseimbangan itu? Pertama, Anda perlu membuat beberapa konstanta, seperti apa tenggat waktu, perangkat keras apa yang akan dijalankan aplikasi Anda, dan orang seperti apa yang akan menggunakannya. Tanpa mengetahui ini, Anda tidak dapat menetapkan keseimbangan yang benar dan memprioritaskan di mana diperlukan.

Misalnya, jika Anda mengembangkan aplikasi server pada mesin yang kuat, Anda mungkin ingin menukar efisiensi kinerja untuk memastikan Anda mencapai tenggat waktu yang tidak dapat digerakkan. Namun, jika pengembang Anda merupakan aplikasi yang perlu merespons input pengguna dengan cepat (pikirkan permainan video) maka Anda perlu memprioritaskan input rutin Anda untuk memastikannya tidak lamban.


2

Apa pun teknologi virtualisasi yang saya gunakan

Ingat hari-hari ketika sistem dengan lebih dari 512 MB RAM dianggap berdarah? Saya menghabiskan hari-hari saya menulis kode untuk sebelumnya.

Saya bekerja sebagian besar pada program tingkat rendah yang berjalan pada domain istimewa di lingkungan Xen. Langit-langit kami untuk domain istimewa adalah 512 MB, meninggalkan sisa RAM gratis bagi pelanggan kami untuk digunakan. Ini juga tipikal bagi kita untuk membatasi domain istimewa hanya pada satu inti CPU.

Jadi di sinilah saya, menulis kode yang akan berjalan pada server $ 6k yang benar-benar baru, dan setiap program harus bekerja (idealnya) dalam plafon yang dialokasikan 100kb, atau menghindari alokasi memori dinamis sepenuhnya.

Secara ringkas, saya mengoptimalkan untuk:

  • Jejak memori
  • Urutkan (di mana sebagian besar kode saya menghabiskan sebagian besar waktunya)

Saya juga harus sangat rajin dalam hal waktu yang dihabiskan menunggu kunci, menunggu I / O atau hanya menunggu secara umum. Sejumlah besar waktu saya digunakan untuk meningkatkan perpustakaan soket non-blocking yang ada dan mencari metode yang lebih praktis untuk pemrograman bebas kunci.

Setiap hari saya merasa agak ironis bahwa saya menulis kode seperti yang saya lakukan 15 tahun yang lalu, pada sistem yang dibeli bulan lalu, karena kemajuan teknologi.

Ini adalah tipikal bagi siapa saja yang bekerja pada platform tertanam juga, meskipun banyak dari mereka yang memiliki setidaknya 1GB. Seperti yang ditunjukkan Jason, itu juga khas ketika menulis program untuk dijalankan pada perangkat seluler. Daftar berjalan, Kios, klien tipis, bingkai foto, dll.

Saya mulai berpikir bahwa pembatasan perangkat keras benar-benar memisahkan programmer dari orang-orang yang dapat membuat sesuatu berfungsi tanpa peduli apa yang sebenarnya dikonsumsi. Saya khawatir (turunkan suara saya jika Anda harus) bahasa apa yang sepenuhnya tipe abstrak dan memeriksa memori ke kumpulan kolektif akal sehat yang (dulu) dibagi di antara programmer dari berbagai disiplin ilmu.


1
+1 untuk sudut cetak kaki memori. Saya tidak pernah mengkodekan terhadap batasan khusus yang Anda hadapi, tetapi hapus bagian pertama berbicara tentang Xen dan ganti dengan iPhone dan saya tahu persis dari mana Anda berasal :-)
Jason Whitehorn

2

Hasil penelitian

Sebagai seorang akademisi, saya pikir saya harus membagikan apa yang saya optimalkan. Perhatikan bahwa ini tidak sama dengan mengoptimalkan untuk waktu pengembangan yang lebih singkat. Seringkali itu berarti bahwa pekerjaan itu mungkin mendukung beberapa pertanyaan penelitian, tetapi tidak menjadi produk yang dapat dikirim dan dipoles. Ini mungkin dipandang sebagai masalah dengan kualitas, dan itu bisa menjelaskan mengapa banyak yang mengatakan bahwa ilmuwan komputer (akademik) tidak memiliki pengalaman "dunia nyata". (Misalnya, "Apakah mereka tidak tahu bagaimana mengembangkan produk yang bisa dikirimkan?" )

Ini garis yang bagus. Dalam hal dampak, Anda ingin karya Anda digunakan dan dikutip oleh orang lain, dan Joel's Iceberg Effect ikut bermain: sedikit polesan dan kilau bisa sangat bermanfaat. Tetapi jika Anda tidak membuat fondasi untuk proyek lain yang akan dibangun, Anda mungkin tidak dapat membenarkan waktu yang dihabiskan untuk membuat produk yang bisa dikirim.


1
  1. Rancangan
    • kopling rendah, modular
    • area fungsional yang ringkas, terdefinisi dengan baik
    • didokumentasikan dengan baik
    • terus menerus refactor untuk cruft
  2. Pemeliharaan
    • build dan debug yang dapat direproduksi
    • tes unit
    • tes regresi
    • kontrol sumber

... setelah itu segalanya

... akhirnya, optimalkan kinerja ;-)


1

Kualitas / Pengujian

Mengoptimalkan kualitas, seperti memastikan ada waktu dalam jadwal pengembangan untuk pengujian, baik pengujian unit maupun pengujian setelah fitur / fase.


1

Itu tergantung pada kebutuhan program Anda.

Sebagian besar dari apa yang saya lakukan sangat dibatasi oleh kemampuan pemrosesan dan memori, tetapi tidak mengalami banyak perubahan, jika ada, yang signifikan pada tahun rata-rata.

Di masa lalu saya pernah bekerja pada proyek-proyek di mana kode sering diubah sehingga pemeliharaan menjadi lebih penting dalam kasus-kasus itu.

Saya juga bekerja pada sistem di masa lalu di mana jumlah data adalah masalah yang paling signifikan, bahkan pada disk untuk penyimpanan, tetapi lebih umum ukurannya menjadi masalah ketika Anda harus memindahkan data secara keseluruhan, atau lebih lambat tautan.


1

Keanggunan .

Jika kode Anda dirancang dengan baik, itu akan memiliki beberapa efek:

  1. Akan lebih mudah untuk mempertahankan (memotong biaya untuk pelanggan)
  2. Akan lebih mudah untuk mengoptimalkan (untuk JIT atau kompiler penuh)
  3. Akan lebih mudah untuk mengganti (ketika Anda memikirkan solusi yang lebih baik)


0

Karena saya melakukan instalasi pada berbagai jenis sistem, mulai dari mainframe IBM hingga PC, saya pertama-tama mengoptimalkan kompatibilitas, lalu ukuran, lalu kecepatan.


0

Tergantung

Jika Anda bekerja pada sistem pemrosesan video tertanam waktu nyata maka Anda mengoptimalkan kecepatan pemrosesan. Jika Anda menggunakan pengolah kata, Anda mengoptimalkan waktu pengembangan.

Namun, dalam semua kasus, kode Anda harus berfungsi dan harus dipelihara.


0

Ekspresifitas maksud saya.

Saya ingin seseorang membaca kode saya agar dapat dengan mudah melihat operasi apa yang saya coba lakukan pada domain. Demikian pula saya mencoba meminimalkan sampah non-semantik (kawat gigi, kata kunci 'fungsi' di js, dll) untuk mempermudah pemindaian.

Tentu saja Anda harus menyeimbangkannya dengan rawatan. Saya suka menulis fungsi yang mengembalikan fungsi dan segala macam teknik canggih dan mereka MELAKUKAN lebih lanjut tujuan saya, tetapi jika manfaatnya sedikit saya akan berbuat kesalahan di sisi menempel pada teknik yang programmer jr solid akan terbiasa dengan.


-6

Mereka semua

Waktu memproses

Komputer saat ini cepat, tetapi jauh dari cukup. Ada banyak banyak situasi di mana kinerja sangat penting - jika Anda melakukan streaming server media.

Penyimpanan

Pelanggan Anda mungkin memiliki disk besar, katakanlah, 1 TB. Yang bisa diambil oleh 1000 film HD, jika Anda ingin menjadikannya layanan yang jauh dari cukup, bukan?

Waktu pengembangan

Yah saya tidak yakin apakah ini dianggap sebagai "optimasi", yang saya lakukan adalah saya menggunakan Java daripada C ++, dan pengembangannya menjadi 10 kali lebih cepat. Saya merasa seperti saya mengatakan apa yang saya pikirkan langsung ke komputer, sangat lurus maju dan benar-benar batu!

BTW Saya percaya untuk mempercepat pengembangan proses pengembangan Anda, Anda harus memilih java, jangan pernah mencoba sampah seperti python ... yang mengklaim mereka dapat mempersingkat waktu DEV Anda.


Anda mungkin menemukan bacaan ini menarik: paulgraham.com/avg.html - ini membahas kekuatan bahasa pemrograman.

3
Dengan waktu dan anggaran terbatas, Anda tidak dapat menghabiskan waktu untuk semuanya - harus ada prioritas.
JBRWilkinson

@JRBWilkinson Yah, harus kasus per kasus
tactoth
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.