2

这不是关于微优化的问题。如果对字符串文字使用单引号比使用双引号更快(因为不会发生变量扩展),我只是感兴趣。

例子:

echo 'This is a string' # should a faster
echo "This is a string"

我试图衡量这一点(使用大循环和时间),但无法得出真正的结论。

对此有什么想法吗?

编辑

我也很感兴趣为什么性能差异如此之小......有人会认为变量扩展需要某种类型的解析字符串,这应该会产生显着差异。

4

3 回答 3

5

我也对此很好奇,所以我在 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本身就是一个解释器,所以在使用单引号的时候还是会出现很多操作,我猜测试是在里面搜索一个“$”字符该字符串对所有其他操作旁边的性能没有太大影响。

于 2019-02-26T17:59:53.353 回答
2

理论上是的(因为它不会寻找$var等的扩展)。

实际上,怀疑您是否会看到差异。

于 2012-08-02T07:33:01.677 回答
1

我相信它应该(只是一点点)更快。做一个小实验 - 回显一个带有 10 000 $ 符号的字符串。在第一种情况下(双引号)你将不得不转义它们,而在第二种情况下你不需要。第一个字符串要长两倍,因此处理它会更慢。这是一个极端的例子,我怀疑你会在现实生活中的任何地方观察到差异。

编辑:响应您的编辑。我相信双 qoute 案例中的解析是使用确定的自动机进行的,因此再次是线性的。这只是猜测。你仍然可以想象变量解析是如何发生的——如果看到非转义的 $ 符号,那么你就有一个变量要遵循。

于 2012-08-02T07:35:37.743 回答