【发布时间】:2017-07-07 22:31:05
【问题描述】:
我需要在 bash 进程中多次执行数组搜索。我需要知道什么是最快速有效的方法。我知道该怎么做。问题的重点在于如何以最快的方式做到这一点。现在,我正在这样做:
#!/bin/bash
array_test=("text1" "text2" "text3" "text4" "text5")
text_to_search="text4"
START=$(date +%s.%N)
for item in "${array_test[@]}"; do
if [ ${item} = "${text_to_search}" ]; then
echo "found!!"
break
fi
done
END=$(date +%s.%N)
DIFF=$(echo "$END - $START" | bc)
echo $DIFF
通过这段代码,我们可以测量时间。
假设我们有 300 个或更多的数组。有更快的方法吗?我需要提高性能。谢谢。
编辑我正在使用 bash 4.2 。真正的数组有换行符:
array_test=(
"text1"
"text2"
"text3"
"text4"
"text5"
)
【问题讨论】:
-
10,000,000 个元素只需 30 秒!
-
你的数组可以保持排序吗?您的搜索可以按排序顺序执行吗?您是否尝试过关联数组来真正让 Bash 进行检索?
-
是的,数组按字母顺序排序,现在运行良好,但由于调试模式的原因,我计划对脚本中的每个函数进行搜索。我认为如果我这样做可能对性能不利。我会检查提案。谢谢。
-
您可以通过使用 C 风格的
for循环来迭代索引(假设数组不太稀疏)来获得不错的速度:for((i=0; i<=${#array[@]}; i++)); do item=${array[i]}; ...; done。这是因为 shell 在开始搜索之前不需要完全展开数组。 -
数组声明中的换行符不会改变数组的内容(与元素本身内部的换行符相反,这是完全不同的事情)。
标签: arrays bash performance search