我正在尝试在 Cygwin 的 Windows 上运行 shell 脚本。我遇到的问题是它在以下代码部分中运行非常缓慢。通过一些谷歌搜索,我相信这是由于脚本中有大量的 fork() 调用,并且由于 Windows 必须使用 Cygwins 对此进行仿真,所以它只会慢到爬行。
一个典型的场景是在 Linux 中,脚本将在 < 10 秒内完成(取决于文件大小),但在 Cygin 上的 Windows 中,对于相同的文件,它需要将近 10 分钟.....
所以问题是,我怎样才能删除其中的一些分支并且仍然让脚本返回相同的输出。我并不期待奇迹,但我想将这 10 分钟的等待时间缩短一点。
谢谢。
check_for_customization(){
filename="$1"
extended_class_file="$2"
grep "extends" "$filename" | grep "class" | grep -v -e '^\s*<!--' | while read line; do
classname="$(echo $line | perl -pe 's{^.*class\s*([^\s]+).*}{$1}')"
extended_classname="$(echo $line | perl -pe 's{^.*extends\s*([^\s]+).*}{$1}')"
case "$classname" in
*"$extended_classname"*) echo "$filename"; echo "$extended_classname |$classname | $filename" >> "$extended_class_file";;
esac
done
}
更新:稍微更改了正则表达式并使用了更多 perl:
check_for_customization(){
filename="$1"
extended_class_file="$2"
grep "^\(class\|\(.*\s\)*class\)\s.*\sextends\s\S*\(.*$\)" "$filename" | grep -v -e '^\s*<!--' | perl -pe 's{^.*class\s*([^\s]+).*extends\s*([^\s]+).*}{$1 $2}' | while read classname extended_classname; do
case "$classname" in
*"$extended_classname"*) echo "$filename"; echo "$extended_classname | $classname | $filename" >> "$extended_class_file";;
esac
done
}
因此,使用上面的代码,运行时间从大约 8 分钟减少到 2.5 分钟。相当的进步。
如果有人可以建议任何其他更改,我将不胜感激。