-1
我在寫一個半實時的bash腳本,它的運行速度不夠快。據我所知,Bash引用了某種表格來查找你所提供命令的完整路徑。指定完整路徑是否會顯着加速在循環中運行的命令?加速Bash腳本
我在寫一個半實時的bash腳本,它的運行速度不夠快。據我所知,Bash引用了某種表格來查找你所提供命令的完整路徑。指定完整路徑是否會顯着加速在循環中運行的命令?加速Bash腳本
不太可能。 bash
shell實際上會緩存它找到的可執行文件,所以只有第一次搜索會很慢。
從bash
手冊頁:
如果名稱既不是殼函數,也不是一個內置的,並且不包含斜線,bash的搜索路徑的每個元素用於包含該名稱的可執行文件的目錄。 Bash使用散列表來記住可執行文件的完整路徑名(請參閱下面的SHELL BUILTIN COMMANDS下的散列)。只有在散列表中找不到該命令時,纔會執行PATH中目錄的完整搜索。
加快bash
腳本通常需要兩件事情的形式:
cut
sed
或),其中工作量小;和作爲第一個例子,提取字符串的第一個字符:
firstchar=$(echo $string | cut -c1-1)
是一個可怕的想法,因爲它必須產生進程做的工作。你可以像做同樣的事情在bash
迅速:
firstchar=${string:0:1}
沒有產卵子流程的相對鉅額成本。
第二點是確保您在運行子流程時爲工作選擇最佳工具。例如,不要使用多個grep
,cut
和sed
命令的大規模流水線,只能使用非常簡單的awk
單線程完成。
你可以自己試試看。運行你的腳本,看看它需要多長時間,然後用指定的路徑再試一次,看看它是否需要更少的時間。 – 2013-03-16 03:56:17
如果您正在尋找加快速度的方法,那麼不要猜測「這會有幫助嗎?」,請粘貼整個腳本,然後讓我們識別可能的熱點或您做錯的事情。 – 2013-03-16 03:57:04
在大多數shell腳本中,外部進程是最大的開銷。例如,如果你想要一個文件列表不使用'ls',使用'echo *',任何對'cat'的使用都可能沒有被使用,等等。你無法完全避免外部程序,但儘可能減少它們的使用(這也會減少PATH搜索)。 – cdarke 2013-03-16 11:05:04