为什么用不同的参数多次调用同一个函数会比较慢
Why calling the same function many times with different arguments is slower
我已经建立了一个简单的 bash 脚本,可以从数千个单词的列表中生成 4 个单词的随机密码。现在我不确定它是否真的安全或有效供我个人使用,如果您考虑任何改进,请告诉我。但这不是重点。检查一下 ->
所以当我 运行 它在我的笔记本电脑中时,输入和输出如下所示:
time sh genpass
astrology cringe tingling massager
real 0m0.319s
user 0m0.267s
sys 0m0.077s
第二次:
$ time sh genpass
prankish askew siren fritter
real 0m0.318s
user 0m0.266s
sys 0m0.077s
有时会很有趣。
无论如何,这是脚本:
# EDITABLES ###########################################
target="/path/to/my/wordList.txt"
# END EDITABLES #######################################
getWordList() {
case in
"verb") mawk '/ing$|ed$|en$/ {print }' $target ;;
"adjective") mawk '/y$|ish$/ {print }' $target ;;
"noun") mawk '!/ing$|ed$|en$|y$|ish$/ {print }' $target ;;
*) printf "%s" "'' is an invalid argument." && echo && exit 1
esac
}
pickRandomLineNumber() {
# Get the list in an array
declare -a list_a=("${!1}")
# How many items in the list
local length="${#list_a[@]}"
# Generate a random number between 1 and the number of items in the list
local number=$RANDOM
let "number %= $length"
# Print the word at random line
printf "%s\n" ${list_a[@]} | mawk -v line=$number 'NR==line {print}'
}
read -ra verbList <<< $( getWordList verb )
verb=$(pickRandomLineNumber verbList[@])
read -ra adjectiveList <<< $( getWordList adjective )
adjective=$(pickRandomLineNumber adjectiveList[@])
read -ra nounList <<< $( getWordList noun )
noun1=$(pickRandomLineNumber nounList[@])
noun2=$(pickRandomLineNumber nounList[@])
printf "%s %s %s %s\n" "${adjective}" "${noun1}" "${verb}" "${noun2}"
看到我必须在哪里为每种类型的单词创建一个数组了吗? 3 种类型,3 个数组。好吧,我考虑过在一个函数中获取该代码,所以我只需要调用该函数 4 次,每次为我的 4 个单词调用一次,并使用不同的参数。我真的以为它会更快。
代码更改如下:
# EDITABLES ###########################################
target="/path/to/my/wordList.txt"
# END EDITABLES #######################################
getWordList() {
case in
"verb") mawk '/ing$|ed$|en$/ {print }' $target ;;
"adjective") mawk '/y$|ish$/ {print }' $target ;;
"noun") mawk '!/ing$|ed$|en$|y$|ish$/ {print }' $target ;;
*) printf "%s" "'' is an invalid argument." && echo && exit 1
esac
}
pickRandomLineNumber() {
# Get the list in an array
declare -a list_a=("${!1}")
# How many items in the list
local length="${#list_a[@]}"
# Generate a random number between 1 and the number of items in the list
local number=$RANDOM
let "number %= $length"
# Print the word at random line
printf "%s\n" ${list_a[@]} | mawk -v line=$number 'NR==line {print}'
}
#### CHANGE ####
getWord() {
read -ra list <<< $( getWordList )
local word=$(pickRandomLineNumber list[@])
printf "%s" "${word}"
}
printf "%s %s %s %s\n" $(getWord adjective) $(getWord noun) $(getWord verb) $(getWord noun)
现在是 input/output:
$ time sh genpass
overstay clench napping palace
real 0m0.403s
user 0m0.304s
sys 0m0.090s
再一次:
$ time sh genpass
gainfully cameo extended nutshell
real 0m0.369s
user 0m0.304s
sys 0m0.090s
时间上的差异并不是什么大问题,尽管总的来说,我认为它肯定会更快。
那么你知道为什么第二个脚本比第一个慢吗?
你有更多的代码做更多的事情,所有这些都是不必要的。以下是如何做您想做的事情:
$ cat tst.awk
function grw(arr) { # Get Random Word
return arr[int(rand() * length(arr)) + 1]
}
{
if ( /(ing|ed|en)$/ ) verbs[++numVerbs] = [=10=]
else if ( /(y|ish)$/ ) adjectives[++numAdjectives] = [=10=]
else nouns[++numNouns] = [=10=]
}
END {
srand()
printf "%s %s %s %s\n", grw(adjectives), grw(nouns), grw(verbs), grw(nouns)
}
$ awk -f tst.awk words
overstay clench siren clench
$ awk -f tst.awk words
prankish nutshell tingling cameo
$ awk -f tst.awk words
astrology clench tingling palace
以上是 运行 针对此 "words" 文件创建的,该文件是根据您在问题中提供的示例输出创建的:
$ cat words
askew
astrology
cameo
clench
cringe
extended
fritter
gainfully
massager
napping
nutshell
overstay
palace
prankish
siren
tingling
我已经建立了一个简单的 bash 脚本,可以从数千个单词的列表中生成 4 个单词的随机密码。现在我不确定它是否真的安全或有效供我个人使用,如果您考虑任何改进,请告诉我。但这不是重点。检查一下 ->
所以当我 运行 它在我的笔记本电脑中时,输入和输出如下所示:
time sh genpass
astrology cringe tingling massager
real 0m0.319s
user 0m0.267s
sys 0m0.077s
第二次:
$ time sh genpass
prankish askew siren fritter
real 0m0.318s
user 0m0.266s
sys 0m0.077s
有时会很有趣。
无论如何,这是脚本:
# EDITABLES ###########################################
target="/path/to/my/wordList.txt"
# END EDITABLES #######################################
getWordList() {
case in
"verb") mawk '/ing$|ed$|en$/ {print }' $target ;;
"adjective") mawk '/y$|ish$/ {print }' $target ;;
"noun") mawk '!/ing$|ed$|en$|y$|ish$/ {print }' $target ;;
*) printf "%s" "'' is an invalid argument." && echo && exit 1
esac
}
pickRandomLineNumber() {
# Get the list in an array
declare -a list_a=("${!1}")
# How many items in the list
local length="${#list_a[@]}"
# Generate a random number between 1 and the number of items in the list
local number=$RANDOM
let "number %= $length"
# Print the word at random line
printf "%s\n" ${list_a[@]} | mawk -v line=$number 'NR==line {print}'
}
read -ra verbList <<< $( getWordList verb )
verb=$(pickRandomLineNumber verbList[@])
read -ra adjectiveList <<< $( getWordList adjective )
adjective=$(pickRandomLineNumber adjectiveList[@])
read -ra nounList <<< $( getWordList noun )
noun1=$(pickRandomLineNumber nounList[@])
noun2=$(pickRandomLineNumber nounList[@])
printf "%s %s %s %s\n" "${adjective}" "${noun1}" "${verb}" "${noun2}"
看到我必须在哪里为每种类型的单词创建一个数组了吗? 3 种类型,3 个数组。好吧,我考虑过在一个函数中获取该代码,所以我只需要调用该函数 4 次,每次为我的 4 个单词调用一次,并使用不同的参数。我真的以为它会更快。
代码更改如下:
# EDITABLES ###########################################
target="/path/to/my/wordList.txt"
# END EDITABLES #######################################
getWordList() {
case in
"verb") mawk '/ing$|ed$|en$/ {print }' $target ;;
"adjective") mawk '/y$|ish$/ {print }' $target ;;
"noun") mawk '!/ing$|ed$|en$|y$|ish$/ {print }' $target ;;
*) printf "%s" "'' is an invalid argument." && echo && exit 1
esac
}
pickRandomLineNumber() {
# Get the list in an array
declare -a list_a=("${!1}")
# How many items in the list
local length="${#list_a[@]}"
# Generate a random number between 1 and the number of items in the list
local number=$RANDOM
let "number %= $length"
# Print the word at random line
printf "%s\n" ${list_a[@]} | mawk -v line=$number 'NR==line {print}'
}
#### CHANGE ####
getWord() {
read -ra list <<< $( getWordList )
local word=$(pickRandomLineNumber list[@])
printf "%s" "${word}"
}
printf "%s %s %s %s\n" $(getWord adjective) $(getWord noun) $(getWord verb) $(getWord noun)
现在是 input/output:
$ time sh genpass
overstay clench napping palace
real 0m0.403s
user 0m0.304s
sys 0m0.090s
再一次:
$ time sh genpass
gainfully cameo extended nutshell
real 0m0.369s
user 0m0.304s
sys 0m0.090s
时间上的差异并不是什么大问题,尽管总的来说,我认为它肯定会更快。
那么你知道为什么第二个脚本比第一个慢吗?
你有更多的代码做更多的事情,所有这些都是不必要的。以下是如何做您想做的事情:
$ cat tst.awk
function grw(arr) { # Get Random Word
return arr[int(rand() * length(arr)) + 1]
}
{
if ( /(ing|ed|en)$/ ) verbs[++numVerbs] = [=10=]
else if ( /(y|ish)$/ ) adjectives[++numAdjectives] = [=10=]
else nouns[++numNouns] = [=10=]
}
END {
srand()
printf "%s %s %s %s\n", grw(adjectives), grw(nouns), grw(verbs), grw(nouns)
}
$ awk -f tst.awk words
overstay clench siren clench
$ awk -f tst.awk words
prankish nutshell tingling cameo
$ awk -f tst.awk words
astrology clench tingling palace
以上是 运行 针对此 "words" 文件创建的,该文件是根据您在问题中提供的示例输出创建的:
$ cat words
askew
astrology
cameo
clench
cringe
extended
fritter
gainfully
massager
napping
nutshell
overstay
palace
prankish
siren
tingling