如何优化脚本速度?

如何优化脚本速度?

我必须在日志中找到警告,并且我正在使用 grep 和 awk(下面的代码)。但是,在 VM(Ubuntu 18.04)上第一次执行所有脚本大约需要 120 秒(24.5 GB 日志),然后我尝试使用 Ubuntu 控制台在 Win 10 上运行它,花了 20 秒(如果有人可以解释原因,请!)。然后,我对代码做了一些更改,执行速度大约需要 500 秒(我所做的一切都是更改grep -v ".tmp" folder/.grep -vF "~$" folder/.之后,我尝试改回来,但速度是相同的 ~ 500 秒。另外,我尝试使用 Cygwin 在 Win 10 上执行相同的脚本,结果约为 400 秒。有人可以解释为什么会发生吗?为什么在 Win 上执行速度会增加,并且为什么会根据情况(20 秒、400 秒、500 秒)而波动? (是的,我知道我的代码很糟糕,但我假设将来过滤器的数量会增加,恕我直言,将很难扩展脚本)。如果您有任何优化脚本的建议,我愿意提供任何建议或意见(这是我第一次使用bash脚本)

#!/bin/bash

start=`date +%s`
clear

rm /Users/me/Desktop/Errors/*

echo "Hello"

grep -nr "Error" . | gawk -F" " '$4 ~ /Error/' | grep -v "@Trash"| grep -v "Cien" | grep -Fv "~$" | grep "\\\\server" | grep -v "Folder1" | grep "Object is being used" > /Users/me/Desktop/Errors/OU_Other.txt

gr=`grep -c "Error" /Users/me/Desktop/Errors/OU_Other.txt`
echo "OU_Other done with $gr errors"


grep -nr "Error" . | gawk -F" " '$4 ~ /Error/' | grep -v "@Trash"| grep -v "Cien" | grep -Fv "~$" | grep "\\\\server" | grep  "Folder1" | 
grep "Object being is used" >  /Users/me/Desktop/Errors/OU_Cien.txt

gr=`grep -c "Error" /Users/me/Desktop/Errors/OU_Cien.txt`
echo "OU_Cien done with $gr errors"

grep -nr "Error" . | gawk -F" " '$4 ~ /Error/' | grep -v "@Trash"| grep -Fv "~$" | grep "\\\\server" | grep -v "Access is denied" | grep -v "Object is being used" | grep -v "Cannot enumerate" > /Users/me/Desktop/Errors/Other.txt

gr=`grep -c "Error" /Users/me/Desktop/Errors/Other.txt`
echo "Other done with $gr errors"


end=`date +%s`
runtime=$((end-start))
echo "Runtime: $runtime sec"

ls -l /Users/me/Desktop/Errors/

答案1

为了简要回答您对速度的担忧,

  • Windows 上的 Bash直接连接到 Windows 内核处理所有系统调用和不同的可执行格式。将其视为反向 Wine。由于它依赖较少的抽象层以及专门为 Linux 应用程序的性能而设计的内置系统,因此速度更快。

  • 另一方面,Cygwin 允许编译 POSIX(y) 软件以直接在 Windows 上以 .exe 形式运行。这是一个不同的目标,也是一个更繁重的目标,因为有时他们必须竭尽全力为在 Windows 内核中没有直接映射的各种外部系统调用提供 1:1 的兼容性。

  • 虚拟机模拟整个系统,并且通常比前两个选项慢,尤其是在 I/O 密集的情况下,尽管随着时间的推移,虚拟机在这方面变得越来越好。有关如何调整虚拟机的信息,请参阅虚拟机文档。 (例子

如果您关心速度,您应该强烈考虑直接在您的计算机上安装 Linux。您会注意到它的执行速度比您尝试过的任何选项都要快得多。

正如评论中已经指出的,一旦重写脚本,脚本的性能可能会全面显着提高,最好没有那么多不必要的连续grepawk调用。

相关内容