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
$
如果您得到类似的结果,则您的查询可能是花费最多时间的查询。