Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 对字符串文字使用单引号比双引号快吗?_Bash - Fatal编程技术网

Bash 对字符串文字使用单引号比双引号快吗?

Bash 对字符串文字使用单引号比双引号快吗?,bash,Bash,这不是一个关于微观优化的问题。我感兴趣的是,对字符串文字使用单引号是否比使用双引号更快(因为不会发生变量扩展) 例如: echo 'This is a string' # should a faster echo "This is a string" 我曾经尝试过测量(使用一个大的循环和时间),但是没有得出一个真正的结论 有什么想法吗 编辑 我也很感兴趣为什么性能差异如此之小。。。有人会认为变量扩展需要某种形式的字符串解析,这应该会产生显著的区别。理论上是的(因为它不会寻找$var等的扩展)

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

例如:

echo 'This is a string' # should a faster
echo "This is a string"
我曾经尝试过测量(使用一个大的循环和时间),但是没有得出一个真正的结论

有什么想法吗

编辑

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

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

在现实中,怀疑你是否会看到差异。

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

事实上,怀疑你是否会看到不同。

我认为应该(只是一点点)快一点。做一个小实验——用10000美元的符号回音一个字符串。在第一种情况下(双引号),你将不得不转义,而在第二种情况下,你不需要转义。第一个字符串的长度是原来的两倍,因此处理它的速度会变慢。这是一个极端的例子,我怀疑你们会在现实生活中观察到任何地方的差异

编辑:响应您的编辑。我相信双qoute情况下的解析是使用确定自动机进行的,因此也是线性的。这只是猜测。您仍然可以想象变量解析是如何发生的——如果您看到非转义的$sign,那么您就有一个变量要跟随。

我认为它应该(稍微)快一点。做一个小实验——用10000美元的符号回音一个字符串。在第一种情况下(双引号),你将不得不转义,而在第二种情况下,你不需要转义。第一个字符串的长度是原来的两倍,因此处理它的速度会变慢。这是一个极端的例子,我怀疑你们会在现实生活中观察到任何地方的差异


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

我也对此很好奇,所以我在Intel i7-8700 Hackintosh上进行了一些测量。
结果如下:

单引号 双引号 无引号(实际上与双引号相同) 带变量串联的单引号 带变量串联的双引号 所以是的,使用单引号或双引号对性能有影响。如前所述,这是因为bash在尝试扩展字符串中的变量时进行了解析


至于为什么差异“如此之小”,我不完全确定,但bash本身就是一个解释器,所以在使用单引号时仍然会发生很多操作,我猜搜索字符串中“$”字符的测试对所有其他操作的性能没有太大影响。

我对此也很好奇,因此,我在英特尔i7-8700 Hackintosh上进行了一些测量。
结果如下:

单引号 双引号 无引号(实际上与双引号相同) 带变量串联的单引号 带变量串联的双引号 所以是的,使用单引号或双引号对性能有影响。如前所述,这是因为bash在尝试扩展字符串中的变量时进行了解析


至于差异为何“如此之小”,我不完全确定,但bash本身就是一个解释器,因此在使用单引号时仍会发生许多操作,我猜搜索字符串中“$”字符的测试对所有其他操作的性能没有太大影响。

不要这么认为。。。即使它有我相信你可以忽略它不要这样认为。。。即使有,我相信你可以忽略它。结果可能会有所不同。我发现单引号和无引号的情况几乎没有区别。@chepner也许你使用的shell比我的影响小?我正在zsh shell中运行
time-sh test.sh
。结果可能会有所不同。我发现单引号和无引号的情况几乎没有区别。@chepner也许你使用的shell比我的影响小?我正在zsh shell中运行
timesh test.sh
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