跟踪Swift编译时间

通常,您需要向财务部门证明如何为您提供新的笔记本电脑会提高生产率。 使用此脚本,您可以确切地向他们显示等待Xcode花费时间的时间。

#!/bin/bash
让我们开始一个新的BASH脚本。 在脚本的整个生命周期中,它应大约运行swiftc (Swift编译器)运行的时间,并应与Xcode项目完全脱钩。 当我们在这里时,让我们获得其他一些有趣的统计信息,例如最长的构建时间和我们编译代码的次数。

首先,我们需要声明我们的变量。 让我们在脚本顶部编写该代码,以便在需要时可以轻松地对其进行编辑:

  INTERVAL = 5#采样率,以秒为单位 
COMPILE_TIME = 0#总编译时间
ALL_TIMES =()#所有编译时间的数组
PREV_TIME = 0#临时存储

在这个阶段,我正在想象该脚本没有自然的退出点-它会一直运行,直到您从终端用^C (control + c)杀死它为止。 我们应该截获(也就是“捕获”)此中断信号,处理我们收集的数据,打印它,然后退出脚本:

  #当用户键入^ C时, 
#运行函数ctrl_c而不是退出
陷阱ctrl_c INT

函数ctrl_c(){
  #找到最长的构建时间 
最大= 0
对于$ {ALL_TIMES [@]}中的v; 做
如果(($ v> $ max)); 然后max = $ v; fi;
完成
  #很好地格式化我们的数据 
TIME_SPENT_S = $(日期-u -r $ max +%T)
TIME_SPENT = $(日期-u -r $ COMPILE_TIME +%T)
  #打印! 
echo -en“ \ n”
echo -en“最长的构建时间:$ TIME_SPENT_S \ n”
echo -en“构建数量:$ {#ALL_TIMES [@]} \ n”
echo -en“花费的总时间:$ TIME_SPENT \ n”
  #用户请求停止脚本,因此请遵守 
出口0
}

现在剩下的就是创建一个无限循环,检查Xcode是否正在构建。 指令ps -A列出当前正在运行的所有进程。 因此,有理由认为,如果swiftc出现在列表中,则swiftc正在运行。 让我们尝试grep -ing列表以测试该理论,然后再将其添加到脚本中。 在您喜欢的Xcode项目中按⌘+ B并在Terminal中测试命令:

  $ ps -A |  grep swiftc 
84735 ?? 0:00.04 /Applications/Xcode9.2.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swiftc -incremental-模块名称
84745 ttys028 0:00.00 grep swiftc

第一条超长行是swiftc命令,可以在进一步检查后看到。 但是还有另一个与swiftc相匹配的进程正在运行swiftc本身。 我们需要将其过滤掉,因此让我们为“ grep”添加反grep并重试:

  $ ps -A |  grep -v grep |  grep swiftc 
84735 ?? 0:00.04 /Applications/Xcode9.2.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swiftc -incremental-模块名称

完善。 现在,我们可以简单地计算该命令的输出行数-如果行数大于零,则swiftc在某处运行。 我们还将使用sed从输出中删除所有空格:

  $ ps -A |  grep -v grep |  grep -i swiftc |  wc -l |  sed -e's / // g' 
1个

(如果您的构建现在已经完成,则在最后一行为0 )。

回到脚本中,将输出分配给无限循环内的新变量SWIFTC_TASKS 。 然后,我们可以添加表示SWIFTC_TASKS大于0逻辑,将我们的COMPILE_TIME增加采样间隔,并使用PREV_TIME来增加当前运行的构建的时间。 我们还将打印新的COMPILE_TIME值,不带换行符:

 如果[“ $ SWIFTC_TASKS” -gt 0]#-gt大于 
然后
  #增加总编译时间 
COMPILE_TIME = $(((COMPILE_TIME + INTERVAL))
  #增加此特定构建的时间 
PREV_TIME = $((PREV_TIME + INTERVAL))
  #打印正在运行的编译时间,不带换行符 
echo -en“($ COMPILE_TIME)”
...

如果SWIFTC_TASKS不大于零,我们要打印一个不带换行符(因此我们知道脚本是正确的示例)。 如果我们的PREV_TIME大于零,则说明构建刚刚结束,因此将其添加到ALL_TIMES数组中并重置PREV_TIME

 其他 
#打印破折号,不带换行符
echo -en“-”

如果[“ $ PREV_TIME” -gt 0]
然后
#将此构建的编译时间添加到数组中
ALL_TIMES + =($ PREV_TIME)

#重置当前的构建时间计数器
PREV_TIME = 0
科幻
科幻

最后,仍然在我们的循环中,我们想等待INTERVAL之后再进行采样:

 睡眠$ INTERVAL 

在那里,您拥有了! 脚本运行每隔INTERVAL秒,您应该会在屏幕上看到一些打印内容,如本文开头的屏幕快照所示。

在脚本编写方面,可能性是无穷无尽的-我一直在寻找BASH可以改善工作方式的新方法,既可以减少常见任务的重复性,又可以通过诸如此类的全新任务来增加价值。 因此请记住:

强大的力量伴随着巨大的责任……打造伟大的事物!