Semua orang sepertinya mengatakan pipa bernama lebih cepat daripada soket IPC. Seberapa cepat mereka? Saya lebih suka menggunakan soket karena mereka dapat melakukan komunikasi dua arah dan sangat fleksibel tetapi akan lebih memilih kecepatan daripada fleksibilitas jika jumlahnya cukup banyak.
linux
performance
sockets
ipc
named-pipes
pengguna19745
sumber
sumber
pipe(2)
(ermkfifo(3)
,?) mungkin pemenangnya, tetapi Anda tidak akan tahu sampai Anda mencobanya.Jawaban:
Saya sarankan Anda mengambil jalan yang mudah terlebih dahulu, dengan hati-hati mengisolasi mekanisme IPC sehingga Anda dapat mengubah dari soket ke pipa, tetapi saya pasti akan menggunakan soket terlebih dahulu. Anda harus memastikan kinerja IPC menjadi masalah sebelum melakukan pengoptimalan terlebih dahulu.
Dan jika Anda mendapat masalah karena kecepatan IPC, saya pikir Anda harus mempertimbangkan untuk beralih ke memori bersama daripada menggunakan pipa.
Jika Anda ingin melakukan beberapa pengujian kecepatan transfer, Anda harus mencoba socat , yang merupakan program sangat serbaguna yang memungkinkan Anda membuat hampir semua jenis terowongan.
sumber
Hasil terbaik yang akan Anda dapatkan dengan solusi Memori Bersama .
Pipa bernama hanya 16% lebih baik dari soket TCP .
Hasil diperoleh dengan pembandingan IPC :
Tolok ukur pipa:
Tolok ukur FIFO (pipa bernama):
Tolok ukur Antrian Pesan:
Tolok ukur Memori Bersama:
Tolok ukur soket TCP:
Tolok ukur soket domain Unix:
Tolok ukur ZeroMQ:
sumber
Saya akan setuju dengan shodanex, sepertinya Anda terlalu dini mencoba mengoptimalkan sesuatu yang belum bermasalah. Kecuali Anda tahu soket akan menjadi hambatan, saya akan menggunakannya.
Banyak orang yang bersumpah dengan pipa bernama menemukan sedikit penghematan (tergantung pada seberapa baik segala sesuatu yang lain ditulis), tetapi berakhir dengan kode yang menghabiskan lebih banyak waktu memblokir untuk balasan IPC daripada melakukan pekerjaan yang berguna. Tentu, skema non-pemblokiran membantu ini, tetapi itu bisa rumit. Menghabiskan bertahun-tahun membawa kode lama ke zaman modern, saya dapat mengatakan, percepatan hampir nol dalam sebagian besar kasus yang pernah saya lihat.
Jika Anda benar-benar berpikir bahwa soket akan memperlambat Anda, keluarlah dari gerbang menggunakan memori bersama dengan hati-hati memperhatikan cara Anda menggunakan kunci. Sekali lagi, pada kenyataannya, Anda mungkin menemukan percepatan kecil, tetapi perhatikan bahwa Anda menyia-nyiakan sebagian darinya menunggu di kunci pengecualian bersama. Saya tidak akan menganjurkan perjalanan ke neraka futex (yah, tidak cukup lagi di tahun 2015, tergantung pengalaman Anda).
Pound untuk pound, soket (hampir) selalu merupakan cara terbaik untuk menggunakan ruang pengguna IPC di bawah kernel monolitik .. dan (biasanya) yang paling mudah untuk di-debug dan dipelihara.
sumber
Perlu diingat bahwa soket tidak selalu berarti IP (dan TCP atau UDP). Anda juga dapat menggunakan soket UNIX (PF_UNIX), yang menawarkan peningkatan kinerja yang nyata dibandingkan menghubungkan ke 127.0.0.1
sumber
Biasanya , angka mengatakan lebih dari sekadar perasaan, berikut beberapa datanya: Kinerja Soket Pipa vs Unix (opendmx.net) .
Penghitungan ini menunjukkan perbedaan kecepatan sekitar 12 hingga 15% lebih cepat untuk pipa.
sumber
Jika Anda tidak membutuhkan kecepatan, soket adalah cara termudah untuk digunakan!
Jika yang Anda lihat adalah kecepatan, solusi tercepat adalah Memori bersama, bukan pipa bernama.
sumber
Untuk komunikasi dua arah dengan pipa bernama:
Pipa bernama cukup mudah diimplementasikan.
Misalnya saya mengimplementasikan proyek di C dengan pipa bernama, berkat komunikasi berbasis input-output file standar (fopen, fprintf, fscanf ...) itu sangat mudah dan bersih (jika itu juga menjadi pertimbangan).
Saya bahkan mengkodekannya dengan java (saya membuat serial dan mengirim objek ke mereka!)
Pipa bernama memiliki satu kelemahan:
sumber
Satu masalah dengan soket adalah mereka tidak memiliki cara untuk membersihkan buffer. Ada sesuatu yang disebut algoritma Nagle yang mengumpulkan semua data dan membilasnya setelah 40ms. Jadi jika itu adalah responsivitas dan bukan bandwidth, Anda mungkin lebih baik menggunakan pipa.
Anda dapat menonaktifkan Nagle dengan opsi soket TCP_NODELAY tetapi kemudian pembacaan tidak akan pernah menerima dua pesan singkat dalam satu panggilan baca.
Jadi mengujinya, saya berakhir dengan semua ini dan mengimplementasikan antrian berbasis pemetaan memori dengan pthread mutex dan semaphore di memori bersama, menghindari banyak panggilan sistem kernel (tetapi hari ini mereka tidak terlalu lambat lagi).
sumber
Pipa dan soket yang diberi nama tidak setara secara fungsional; soket menyediakan lebih banyak fitur (mereka dua arah, sebagai permulaan).
Kami tidak dapat memberi tahu Anda mana yang akan berkinerja lebih baik, tetapi saya sangat curiga itu tidak masalah.
Soket domain Unix akan melakukan banyak hal seperti yang dilakukan soket tcp, tetapi hanya pada mesin lokal dan dengan (mungkin sedikit) overhead yang lebih rendah.
Jika soket Unix tidak cukup cepat dan Anda mentransfer banyak data, pertimbangkan untuk menggunakan memori bersama antara klien dan server Anda (yang BANYAK lebih rumit untuk disiapkan).
Unix dan NT keduanya memiliki "Pipa bernama" tetapi keduanya sama sekali berbeda dalam set fiturnya.
sumber
Anda dapat menggunakan solusi ringan seperti ZeroMQ [ zmq / 0mq ]. Sangat mudah digunakan dan secara dramatis lebih cepat daripada soket.
sumber
nanomsg
. Bagaimanapun, selamat datang & nikmati tempat hebat ini & jadilah Anggota yang Berkontribusi secara aktif.