提高屏幕亮度脚本的执行速度

提高屏幕亮度脚本的执行速度
xrandr --output LVDS-1 --brightness $(bc -l <<<"$(sed 's/Brightness: //' <<<$(xrandr --prop --verbose | grep Brightness)) $(if [ "$1" = "+" ];then echo +;else echo -;fi) 0.1")

目前,我已将此代码设置为 Arch 系统上 XFCE 中的键盘快捷键,并且它可以很好地将亮度向上或向下调整 0.1 个等级。唯一的问题是,它的速度足够慢,需要一秒钟左右的时间才能执行,并且多次按下会更糟糕,并且可能会降低整个计算机的速度。

您将如何改进代码? (我对 shell 脚本相当陌生,所以我也部分要求它查看我编写的冷代码代码的优化过程。)

编辑:好的,所以我遵循了drewbenn的分析建议并得到了这个:
time xrandr -q --verbose > /dev/null
real 0m1.746s
user 0m0.007s
sys 0m0.000s

那么,查询就是最大的问题。我对其进行了更改,以便它将当前的亮度级别存储在某个文件中,并且快捷键将运行以下代码:

#!/bin/bash
val=$(cat ~/.bright_key_folder/lvl)
if ( [ "$1" == "+" ] && [[ $(bc -l ~/.bright_key_folder/lvl
    xrandr --输出 LVDS-1 --亮度 $(cat ~/.bright_key_folder/lvl)
elif ( [ "$1" == "-" ] && [[ $(bc -l 0") == 1 ]] )
然后
    bc -l ~/.bright_key_folder/lvl
    xrandr --输出 LVDS-1 --亮度 $(cat ~/.bright_key_folder/lvl)

然后在启动时它将亮度和文件值都重置为 1。

答案1

好吧,一方面,您正在运行三个独立的外部程序,而一个程序就足够了。awk例如,您可以执行所有解析和算术:

xrandr --output LVDS-1 --brightness $(xrandr --prop --verbose | 
    awk "/Brightness:/{print \$2 $1 0.1; exit}")

awk 脚本中的exit保证它不需要解析 的整个输出xrandr --prop --verbose并在第一次匹配 后退出Brightness:。然后,由于awk命令用双引号引起来,因此$1被扩展为给定脚本的参数,而 则\$2引用第二个字段,awk因为它被转义了。

您还可以尝试使用更快的 shell。如果您的默认设置是bash,请尝试使用 运行脚本dash

答案2

如果代码是已经在工作了但运行速度太慢,下一步就是开始profiling。在编写 shell 脚本时,您可以使用time(尝试help time查看其帮助页面)来查看每个命令运行需要多长时间。

我认为bc应该很快;sed对抗一条线也应该很快;并且grep应该很快,所以我决定尝试xrandr在我的系统上分析这两个命令。我只是想要一些快速估计,所以我尝试单独执行命令(而不是将它们包装在脚本中以运行它们数十次以获得平均值):

$ time xrandr --prop --verbose >/dev/null

real    0m0.428s
user    0m0.004s
sys     0m0.004s
$ time xrandr --output LVDS1 --brightness 0.9

real    0m0.117s
user    0m0.000s
sys     0m0.008s
$ 

如果您得到类似的结果,则您的查询可能是花费最多时间的查询。

相关内容