前言
- 先前為了準備資料搬移腳本、準備 log 功能時,建立了不少空檔案。一般情況下,會用
touch
來建立空檔案,但是有時也會用echo >> ${file}
redirect file 來建立空檔案。 - 好奇查了一下,紀錄兩者的差異
說明
基本的差別
在手動建立檔案時,速度幾乎沒有差別、小到人眼無法感知差異。
而兩者主要的差別在於,echo
是 built-in command,而 touch
是外部指令。
用 type
指令比較:
|
|
大量檔案建立
如果是要一口氣建立幾十萬個檔案,這時速度就很明顯了。
根據 [1] 的測試的結果
用 echo
,需要 10
秒:
|
|
用 touch
則需要 10
分鐘、也就是 600
秒:
|
|
看起來似乎快上 60 倍!
我自己用 server 測試,創建 10000 個檔案,需要 33
秒
|
|
而用 echo >
redirect 的方式,只需要 0.9
秒:
|
|
大概也快了 35 倍!
原因
因為 touch
是外部指令,每次執行都需要 fork 一個新的 process;
而 echo
是 built-in command,不需要 fork 新的 process,所以速度會快非常多。
等於前面提到的迴圈,每一次都會需要額外的時間來 call touch
,當檔案數量多時,就會慢上不少。
如果單用 touch 的話
可是如果可以重複使用同一個 touch
process,不用另外啟動,反而會更快:
|
|
這樣只需要 0.5
秒,甚至比 for loop 裡面的 echo
快上一點點!
結論
- 如果只是建立少量檔案,兩者差異不大
- 如果是大量檔案、且使用 for loop,
echo
的速度會快很多 - 如果是大量檔案、且使用
xargs
,touch
也可以快很多