这不是关于微优化的问题。如果对字符串文字使用单引号比使用双引号更快(因为不会发生变量扩展),我只是感兴趣。
例子:
echo 'This is a string' # should a faster
echo "This is a string"
我试图衡量这一点(使用大循环和时间),但无法得出真正的结论。
对此有什么想法吗?
编辑
我也很感兴趣为什么性能差异如此之小......有人会认为变量扩展需要某种类型的解析字符串,这应该会产生显着差异。
这不是关于微优化的问题。如果对字符串文字使用单引号比使用双引号更快(因为不会发生变量扩展),我只是感兴趣。
例子:
echo 'This is a string' # should a faster
echo "This is a string"
我试图衡量这一点(使用大循环和时间),但无法得出真正的结论。
对此有什么想法吗?
编辑
我也很感兴趣为什么性能差异如此之小......有人会认为变量扩展需要某种类型的解析字符串,这应该会产生显着差异。
我也对此很好奇,所以我在 Intel i7-8700 Hackintosh 上进行了一些测量。
结果如下:
for i in {1..1000000}
do
echo 'abcdefghijklmnopqrstuvwxyz'
done
sh test.sh 7,40s user 0,80s system 97% cpu 8,403 total
for i in {1..1000000}
do
echo "abcdefghijklmnopqrstuvwxyz"
done
sh test.sh 9,96s user 0,87s system 97% cpu 11,050 total
for i in {1..1000000}
do
echo abcdefghijklmnopqrstuvwxyz
done
sh test.sh 9,97s user 0,88s system 98% cpu 11,068 total
for i in {1..1000000}
do
echo 'abc'$i'defghijklmnopqrstuvwxyz'
done
sh test.sh 9,53s user 0,91s system 97% cpu 10,707 total
for i in {1..1000000}
do
echo "abc${i}defghijklmnopqrstuvwxyz"
done
sh test.sh 11,78s user 0,94s system 97% cpu 13,028 total
所以是的,使用单引号或双引号会对性能产生影响。如前所述,这是因为 bash 在尝试扩展字符串中的变量时所做的解析。
至于为什么差别“这么小”,我也不是很确定,但是bash本身就是一个解释器,所以在使用单引号的时候还是会出现很多操作,我猜测试是在里面搜索一个“$”字符该字符串对所有其他操作旁边的性能没有太大影响。
理论上是的(因为它不会寻找$var
等的扩展)。
实际上,怀疑您是否会看到差异。
我相信它应该(只是一点点)更快。做一个小实验 - 回显一个带有 10 000 $ 符号的字符串。在第一种情况下(双引号)你将不得不转义它们,而在第二种情况下你不需要。第一个字符串要长两倍,因此处理它会更慢。这是一个极端的例子,我怀疑你会在现实生活中的任何地方观察到差异。
编辑:响应您的编辑。我相信双 qoute 案例中的解析是使用确定的自动机进行的,因此再次是线性的。这只是猜测。你仍然可以想象变量解析是如何发生的——如果看到非转义的 $ 符号,那么你就有一个变量要遵循。