Apa itu "overhead"?


149

Saya seorang mahasiswa di bidang Ilmu Komputer dan saya sering mendengar kata "overhead" ketika datang ke program dan semacamnya. Apa artinya ini sebenarnya?


27
berapa banyak "barang ekstra" yang perlu Anda lakukan untuk mendapatkan sesuatu. mis. Jika saya harus memuat proyek kelas 37 hanya untuk mencetak "Hello World", saya akan menganggap bahwa banyak overhead.
scunliffe

1
@ doug65536 Sebenarnya itu sebaliknya. =)
Yukio Fukuzawa

Jawaban:


177

Ini sumber daya yang diperlukan untuk mengatur operasi. Ini mungkin tampak tidak berhubungan, tetapi perlu.

Ini seperti ketika Anda perlu pergi ke suatu tempat, Anda mungkin perlu mobil. Tapi, akan banyak overhead untuk mendapatkan mobil untuk berkendara di jalan, jadi Anda mungkin ingin berjalan. Namun, biaya overhead akan sepadan jika Anda pergi ke seluruh negeri.

Dalam ilmu komputer, kadang-kadang kita menggunakan mobil untuk pergi ke jalan karena kita tidak memiliki cara yang lebih baik, atau tidak layak waktu kita untuk "belajar cara berjalan".


84
Analogi serupa akan terbang. Pesawat jauh lebih cepat daripada mobil, tetapi overhead bandara, keamanan, dll. Menjadikan mobil pilihan yang lebih baik untuk jarak yang lebih pendek.
FogleBird

s / drive / go / (Jika Anda perlu mengemudi di suatu tempat Anda biasanya tidak memutuskan untuk berjalan ...
RCIX

1
@ inf3rno Ironinya? Bagaimana kita sampai ke mobil kita? Kita berjalan. Dan kita benar-benar bisa berjalan ... ke mobil kita. Kita tidak bisa berjalan ke tujuan kita, meskipun lebih dekat dari mobil kita.
corsiKa

Jika saya mengatakan saya menulis kode java overhead rendah, bagaimana Anda menafsirkannya dalam hal definisi "sumber daya yang diperlukan untuk mengatur operasi". Kode saya tidak memerlukan banyak pengaturan?
berkomitmen dan

Nah, Anda harus menyalakan komputer atau server, Anda harus memuat sistem operasi dan semua driver, Anda harus menjalankan proses Java, Anda harus menghidupkan JVM, Anda harus memuat semua kelas Anda, Anda harus harus menyinkronkan buffer IO ke konsol agar Anda dapat melakukan "hello world" Anda. Tapi tolong, ceritakan lebih lanjut tentang coding overhead rendah.
corsiKa

40

Arti kata bisa sangat berbeda dengan konteks. Secara umum, sumber dayanya (paling sering memori dan waktu CPU) yang digunakan, yang tidak berkontribusi langsung ke hasil yang diinginkan, tetapi diperlukan oleh teknologi atau metode yang digunakan. Contoh:

  • Overhead protokol : frame Ethernet, paket IP dan segmen TCP semua memiliki header, koneksi TCP memerlukan paket jabat tangan. Dengan demikian, Anda tidak dapat menggunakan seluruh bandwidth yang perangkat keras mampu untuk data aktual Anda. Anda dapat mengurangi overhead dengan menggunakan ukuran paket yang lebih besar dan UDP memiliki header yang lebih kecil dan tidak ada jabat tangan.
  • Struktur data memori overhead : Daftar tertaut memerlukan setidaknya satu pointer untuk setiap elemen yang dikandungnya. Jika elemen berukuran sama dengan pointer, ini berarti 50% memori overhead, sedangkan array berpotensi memiliki overhead 0%.
  • Metode panggilan overhead : Program yang dirancang dengan baik dipecah menjadi banyak metode pendek. Tetapi setiap panggilan metode memerlukan pengaturan frame stack, menyalin parameter dan alamat kembali. Ini mewakili overhead CPU dibandingkan dengan program yang melakukan semuanya dalam satu fungsi monolitik. Tentu saja, rawatan tambahan membuatnya sangat berharga, tetapi dalam beberapa kasus, pemanggilan metode yang berlebihan dapat memiliki dampak kinerja yang signifikan.

Kedengarannya seperti kata itu memiliki arti yang sama dalam semua contoh (diperlukan untuk menjalankan tugas, tetapi tidak selalu terkait dengan melakukannya secara langsung)
RCIX

Ulang struktur data memori overhead: Dengan sebagian besar pengalokasi memori, ini bahkan lebih buruk dari itu. Setiap nilai yang dikembalikan oleh mallocmemiliki overhead 8 byte karena pengalokasi (dengan asumsi mesin 32-bit klasik) yang terdiri dari ukuran blok ditambah nilai penjaga. Dan itu bahkan sebelum Anda berpikir tentang perincian alokasi. Karenanya, daftar bilangan bulat 4-byte sederhana yang terhubung akan memiliki overhead 75%; array jauh lebih baik (kecuali Anda perlu penyisipan cepat di tengah) karena mereka dapat memiliki overhead sekali (atau kurang, jika array tidak dialokasikan secara dinamis).
Donal Fellows

19

Anda lelah dan tidak bisa melakukan pekerjaan lagi. Kamu makan makanan. Energi yang dihabiskan untuk mencari makanan, mendapatkannya dan benar-benar memakannya mengkonsumsi energi dan di atas kepala!

Overhead adalah sesuatu yang sia-sia untuk menyelesaikan suatu tugas. Tujuannya adalah membuat overhead sangat kecil.

Dalam ilmu komputer katakanlah Anda ingin mencetak nomor, itulah tugas Anda. Tetapi menyimpan nomor, pengaturan tampilan untuk mencetaknya dan memanggil rutinitas untuk mencetaknya, kemudian mengakses nomor dari variabel semua overhead.


17

Wikipedia telah kami liput :

Dalam ilmu komputer, overhead umumnya dianggap sebagai kombinasi waktu komputasi kelebihan atau tidak langsung, memori, bandwidth, atau sumber daya lain yang diperlukan untuk mencapai tujuan tertentu. Ini adalah kasus khusus overhead teknik.


4
Tetapi jika tidak, Anda akan memperbaiki WikiPedia, dan kemudian membuat posting yang sama di sini.
SamGoody

11

Overhead biasanya mengacu pada jumlah sumber daya tambahan (memori, prosesor, waktu, dll.) Yang digunakan oleh algoritma pemrograman yang berbeda.

Misalnya, overhead memasukkan ke dalam Binary Tree yang seimbang bisa jauh lebih besar daripada memasukkan yang sama ke dalam Daftar Tertaut sederhana (insert akan memakan waktu lebih lama, menggunakan lebih banyak kekuatan pemrosesan untuk menyeimbangkan Pohon, yang menghasilkan waktu operasi yang lebih lama dipersepsikan oleh pengguna).


5

Untuk overhead programmer mengacu pada sumber daya sistem yang dikonsumsi oleh kode Anda saat dijalankan pada platform pemberian pada set input data tertentu. Biasanya istilah ini digunakan dalam konteks membandingkan berbagai implementasi atau kemungkinan implementasi.

Sebagai contoh, kita dapat mengatakan bahwa pendekatan tertentu mungkin menimbulkan overhead CPU yang cukup besar sementara yang lain mungkin mengeluarkan lebih banyak memori dan yang lain mungkin tertimbang untuk overhead jaringan (dan memerlukan ketergantungan eksternal, misalnya).

Mari kita berikan contoh spesifik: Hitung rata-rata (rata-rata aritmatika) dari satu set angka.

Pendekatan yang jelas adalah untuk mengulang input, menjaga total berjalan dan menghitung. Ketika nomor terakhir ditemui (ditandai oleh "end of file" EOF, atau nilai sentinel, atau beberapa GUI buttom, apa pun) maka kita cukup membagi total dengan jumlah input dan kita selesai.

Pendekatan ini hampir tidak menimbulkan overhead dalam hal CPU, memori atau sumber daya lainnya. (Ini tugas sepele).

Pendekatan lain yang mungkin adalah "mencelupkan" input ke dalam daftar. beralih ke daftar untuk menghitung jumlah, kemudian membaginya dengan jumlah item yang valid dari daftar.

Sebagai perbandingan, pendekatan ini mungkin menimbulkan jumlah memori yang sewenang-wenang.

Dalam implementasi buruk tertentu kita mungkin melakukan operasi penjumlahan menggunakan rekursi tetapi tanpa eliminasi ekor. Sekarang, selain overhead memori untuk daftar kami, kami juga memperkenalkan stack overhead (yang merupakan jenis memori yang berbeda dan seringkali merupakan sumber daya yang lebih terbatas daripada bentuk memori lainnya).

Namun pendekatan lain (mungkin lebih masuk akal) akan memposting semua input ke beberapa tabel SQL dalam RDBMS. Kemudian cukup memanggil fungsi SQL SUM pada kolom tabel itu. Ini menggeser overhead memori lokal kami ke beberapa server lain, dan menimbulkan overhead jaringan dan ketergantungan eksternal pada eksekusi kami. (Perhatikan bahwa server jauh mungkin atau mungkin tidak memiliki overhead memori tertentu yang terkait dengan tugas ini --- mungkin mendorong semua nilai segera keluar ke penyimpanan, misalnya).

Secara hipotesis mungkin mempertimbangkan implementasi atas beberapa jenis cluster (mungkin untuk membuat rata-rata triliunan nilai layak). Dalam hal ini, setiap pengkodean dan distribusi nilai yang diperlukan (memetakannya ke node) dan pengumpulan / pengumpulan hasil (pengurangan) akan dihitung sebagai overhead.

Kita juga dapat berbicara tentang overhead yang ditimbulkan oleh faktor-faktor di luar kode programmer sendiri. Sebagai contoh kompilasi beberapa kode untuk prosesor 32 atau 64 bit mungkin memerlukan overhead yang lebih besar daripada yang akan dilihat untuk arsitektur 8-bit atau 16-bit yang lama. Ini mungkin melibatkan overhead memori yang lebih besar (masalah pelurusan) atau overhead CPU (di mana CPU dipaksa untuk menyesuaikan pemesanan bit atau menggunakan instruksi yang tidak selaras, dll) atau keduanya.

Perhatikan bahwa ruang disk yang diambil oleh kode Anda dan pustaka, dll. Biasanya tidak disebut sebagai "overhead" tetapi lebih disebut "footprint." Juga memori dasar yang dikonsumsi oleh program Anda (tanpa memperhatikan kumpulan data apa pun yang sedang diproses) disebut juga "footprint" -nya.


3

Overhead hanyalah konsumsi waktu yang lebih banyak dalam pelaksanaan program. Contoh; ketika kita memanggil suatu fungsi dan kontrolnya dilewati di mana ia didefinisikan dan kemudian tubuhnya dieksekusi, ini berarti bahwa kita membuat CPU kita untuk menjalankan melalui proses panjang (pertama melewati kontrol ke tempat lain di memori dan kemudian mengeksekusi di sana dan kemudian melewati kontrol kembali ke posisi sebelumnya), akibatnya butuh banyak waktu kinerja, karenanya Overhead. Tujuan kami adalah untuk mengurangi overhead ini dengan menggunakan inline selama definisi fungsi dan waktu panggilan, yang menyalin konten fungsi pada pemanggilan fungsi sehingga kami tidak meneruskan kontrol ke beberapa lokasi lain, tetapi melanjutkan program kami dalam satu baris, maka inline .


2

Anda bisa menggunakan kamus. Definisinya sama. Tetapi untuk menghemat waktu Anda, Overhead adalah pekerjaan yang diperlukan untuk melakukan pekerjaan yang produktif. Sebagai contoh, suatu algoritma berjalan dan melakukan pekerjaan yang bermanfaat, tetapi membutuhkan memori untuk melakukan tugasnya. Alokasi memori ini membutuhkan waktu, dan tidak terkait langsung dengan pekerjaan yang sedang dilakukan, oleh karena itu adalah biaya overhead.


1

Anda dapat memeriksa Wikipedia . Tetapi terutama ketika lebih banyak tindakan atau sumber daya digunakan. Seperti jika Anda terbiasa dengan .NET di sana Anda dapat memiliki tipe nilai dan tipe referensi. Tipe referensi memiliki overhead memori karena mereka membutuhkan lebih banyak memori daripada tipe nilai.


1

Contoh nyata overhead adalah perbedaan antara panggilan prosedur "lokal" dan panggilan prosedur "jarak jauh".

Misalnya, dengan RPC klasik (dan banyak kerangka kerja jarak jauh lainnya, seperti EJB), panggilan fungsi atau metode terlihat sama dengan seorang koder apakah itu panggilan lokal, dalam memori, atau panggilan jaringan yang didistribusikan.

Sebagai contoh:

service.function(param1, param2);

Apakah itu metode normal, atau metode jarak jauh? Dari apa yang Anda lihat di sini, Anda tidak bisa mengatakannya.

Tetapi Anda dapat membayangkan bahwa perbedaan waktu eksekusi antara kedua panggilan itu dramatis.

Jadi, sementara implementasi inti akan "biayanya sama", "overhead" yang terlibat sangat berbeda.


1

Pikirkan overhead sebagai waktu yang diperlukan untuk mengelola utas dan berkoordinasi di antara mereka. Merupakan beban jika utas tidak memiliki cukup tugas untuk dilakukan. Dalam kasus seperti itu, biaya overhead datang dari waktu yang dihemat melalui penggunaan threading dan kode membutuhkan lebih banyak waktu daripada yang berurutan.


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.