"Optimalisasi prematur adalah akar dari semua kejahatan (atau setidaknya sebagian besar) dalam pemrograman." - Donald Knuth en.wikiquote.org/wiki/Donald_Knuth
chris
Jawaban:
68
Keduanya adalah pembungkus untuk fungsi dasar yang sama yaitu unlink()panggilan sistem.
Untuk menimbang perbedaan antara penggunaan pengguna lahan.
rm(1):
Lebih banyak pilihan.
Lebih banyak umpan balik.
Pemeriksaan kewarasan.
Sedikit lebih lambat untuk satu panggilan sebagai akibat dari hal di atas.
Dapat dipanggil dengan beberapa argumen sekaligus.
unlink(1):
Pengecekan kewarasan kurang.
Tidak dapat menghapus direktori.
Tidak dapat berulang.
Hanya dapat mengambil satu argumen pada satu waktu.
Sedikit lebih ramping untuk satu panggilan karena kesederhanaannya.
Lebih lambat jika dibandingkan dengan memberikan rm(1)banyak argumen.
Anda dapat menunjukkan perbedaannya dengan:
$ touch $(seq 1 100)
$ unlink $(seq 1 100)
unlink: extra operand `2'
$ touch $(seq 1 100)
$ time rm $(seq 1 100)
real 0m0.048s
user 0m0.004s
sys 0m0.008s
$ touch $(seq 1 100)
$ time for i in $(seq 1 100); do rm $i; done
real 0m0.207s
user 0m0.044s
sys 0m0.112s
$ touch $(seq 1 100)
$ time for i in $(seq 1 100); do unlink $i; done
real 0m0.167s
user 0m0.048s
sys 0m0.120s
Namun jika kita berbicara tentang panggilan yang tidak tercemar ke unlink(2)fungsi sistem , yang sekarang saya sadari mungkin bukan apa yang Anda perhitungkan.
Anda dapat melakukan sistem unlink()pada direktori dan file yang sama. Tetapi jika direktori tersebut adalah induk dari direktori dan file lain, maka tautan ke induk tersebut akan dihapus, tetapi anak-anak akan dibiarkan menggantung. Yang kurang ideal.
Sunting:
Maaf, diklarifikasi perbedaan antara unlink(1)dan unlink(2). Semantik masih akan berbeda antar platform.
Apakah itu berarti bahwa dalam sistem file unix menghapus direktori dan secara rekursif semua file di bawahnya akan selalu menjadi operasi yang sebanding dengan jumlah file / direktori yang dikandungnya? Kapan terjadi ketika saya memutuskan tautan direktori yang merupakan induk dari direktori / file lain? Tidak pernah terhapus dan saya kehilangan ruang ini selamanya?
Marcin
6
Secara teknis dimungkinkan meninggalkan direktori / file yatim di sebagian besar jika tidak semua sistem file. Memperbaiki ini umumnya berarti menjalankan alat perbaikan sistem file. Di Unix / Linux, alat-alat ini dikenal sebagai 'fsck' dan beberapa variasi spesifik untuk sistem file yang berbeda. Jika mereka memulihkan sesuatu, mereka biasanya akan meninggalkannya dalam direktori yang disebut 'hilang + ditemukan'
ConcernedOfTunbridgeWells
1
Benar. rm akan muncul kembali dari bawah pohon ke atas. Anda dapat menunjukkan bagaimana dengan: mkdir -p 1/2/3; touch 1/one 1/2/two 1/2/3/three; rm -ri 1. Jika Anda membatalkan tautan direktori induk, maka ruang yang dikonsumsi oleh anak-anak harus hilang sampai saat fsck menemukan perbedaan tersebut.
Dan Carley
1
Apa yang kau bicarakan? $ mkdir -p 1/2/3 $ unlink 1 unlink: tidak dapat membatalkan tautan `1 ': Apakah direktori Pengguna menyebabkan kebocoran" memori "yang membutuhkan fsck? Tidak sepertinya!
Thomas
1
Linux dan FreeBSD manual secara eksplisit menyatakan bahwa ia akan gagal ketika mencoba menjalankan pembatalan tautan () pada direktori.
Thomas
8
Pada tingkat spesifikasi POSIX, apa yang dilakukan rm ditentukan jauh lebih ketat daripada yang dilakukan tautannya .
Portabilitas hasil tampaknya lebih baik menggunakan rm, jika skrip Anda harus berjalan di OS.
Jawaban:
Keduanya adalah pembungkus untuk fungsi dasar yang sama yaitu
unlink()
panggilan sistem.Untuk menimbang perbedaan antara penggunaan pengguna lahan.
rm(1)
:unlink(1)
:rm(1)
banyak argumen.Anda dapat menunjukkan perbedaannya dengan:
Namun jika kita berbicara tentang panggilan yang tidak tercemar ke
unlink(2)
fungsi sistem , yang sekarang saya sadari mungkin bukan apa yang Anda perhitungkan.Anda dapat melakukan sistem
unlink()
pada direktori dan file yang sama. Tetapi jika direktori tersebut adalah induk dari direktori dan file lain, maka tautan ke induk tersebut akan dihapus, tetapi anak-anak akan dibiarkan menggantung. Yang kurang ideal.Sunting:
Maaf, diklarifikasi perbedaan antara
unlink(1)
danunlink(2)
. Semantik masih akan berbeda antar platform.sumber
mkdir -p 1/2/3; touch 1/one 1/2/two 1/2/3/three; rm -ri 1
. Jika Anda membatalkan tautan direktori induk, maka ruang yang dikonsumsi oleh anak-anak harus hilang sampai saat fsck menemukan perbedaan tersebut.Pada tingkat spesifikasi POSIX, apa yang dilakukan rm ditentukan jauh lebih ketat daripada yang dilakukan tautannya .
Portabilitas hasil tampaknya lebih baik menggunakan rm, jika skrip Anda harus berjalan di OS.
sumber
Bagian lambat dari penghapusan adalah kode sistem file dan hal-hal disk, bukan persiapan userspace dari pemutusan sistem ().
Yaitu: jika perbedaan kecepatan penting, maka Anda tidak boleh menyimpan data pada sistem file.
batalkan tautan hanya "cahaya" rm. rm memiliki lebih banyak fitur tetapi mereka melakukan hal yang sama.
sumber