What is this?

This is a test to show what the difference in overall speed of using single quotes and concatenation vs. using double quotes and interpolation for strings in PHP.

Changelog

Why?

There is a lot of speculation and opinion about which of the two is better. Many experienced people know that single quotes are generally faster but there is little proof and testing to be found. This page (and script) attempt to show conclusively that single quotes are faster.

Testing Methodology

The following is the output of a script which tests the speed of different styles and types of strings in PHP. The times quoted were found using the time command on Linux. The script used it shown on the bottom of this page.

The relevant times are the left two columns which show the real user and system time spent processing the requests as seen by the time command.

The right two columns are also from time's output but are for information only as they can be affected by system load other than the PHP script. These tests were made on a live linux server which is running various websites so the right two columns are, as said earlier, informational only.

The tests were run in both a straight loop and in a loop with eval. This was done in order to attempt to test both use of the same "compiled" source over and over which simulates a normal loop on a literal in the source and basically tests the speed of the runtime; and a loop over the same strings run via eval() to simulate multiple script runs, each with its own compliation.

It is worth noting that the non-eval() tests better simulate multiple script runs on a system which uses an opcode cache.

The output is fairly simplistic. A positive number and green background denotes a speed increase when using single quotes (') over double quotes ("). A negative number and red background denote a speed decrease when using single quotes over double quotes. A zero and a gray background denote no speed gain or loss.

Click here to skip to the conclusion

Test run on PHP v5.1.6-pl4-gentoo

String User System CPU Total
Double quoted literal "some string" 2.73s 0.08s 18% 15.245
Single quoted literal 'some string' 2.73s 0.41s 31% 9.952
0s -0.33s -13% 5.293s
Double quoted literal with $ "some $ string $" 11.58s 0.59s 32% 37.567
Single quoted literal with $ 'some $ string $' 2.68s 0.06s 40% 6.803
8.9s 0.53s -8% 30.764s
Double quoted literal with escaped $ "some \$ string \$" 2.71s 0.96s 51% 7.124
Single quoted literal with escaped $ 'some \$ string \$' 2.73s 0.08s 52% 5.324
-0.02s 0.88s -1% 1.8s
Double quoted, inlined vars "some $v1 string $v2" 11.79s 0.18s 47% 25.035
Single quoted, concatenated vars 'some '.$v1.' string '.$v2 5.39s 0.04s 45% 12.030
6.4s 0.14s 2% 13.005s
Double quoted, inlined vars "some $v1 string $v2" 12.42s 0.06s 49% 25.254
Double quoted, inlined vars with braces "some ${v1} string ${v2}" 12.32s 0.06s 47% 25.863
0.1s 0s 2% -0.609s
Double quoted, inlined vars with braces "some ${v1} string ${v2}" 12.23s 0.06s 47% 25.879
Double quoted, inlined vars with outer braces "some {$v1} string {$v2}" 12.21s 0.06s 50% 24.170
0.02s 0s -3% 1.709s
Double quoted, inlined array "some $a[v1] string $a[v2]" 15.12s 0.35s 76% 20.325
Single quoted, concatenated array 'some '.$a['v1'].' string '.$a['v2'] 7.61s 0.03s 78% 9.742
7.51s 0.32s -2% 10.583s
Double quoted, inlined array "some $a[v1] string $a[v2]" 14.33s 0.48s 77% 19.011
Double quoted, inlined array with braces "some ${a['v1']} string ${a['v2']}" 14.34s 0.14s 81% 17.843
-0.01s 0.34s -4% 1.168s
Double quoted, inlined array with braces "some ${a['v1']} string ${a['v2']}" 14.95s 0.21s 80% 18.944
Double quoted, inlined array with outer braces "some {$a['v1']} string {$a['v2']}" 15.63s 0.13s 82% 19.212
-0.68s 0.08s -2% -0.268s
Sprintf, string replacement sprintf('some %s string %s', $v1, $v2) 24.82s 0.21s 82% 30.413
Single quoted, concatenated vars 'some '.$v1.' string '.$v2 5.52s 0.08s 78% 7.104
19.3s 0.13s 4% 23.309s
HEREDOC, literal <<<END
some string
END
8.35s 0.03s 81% 10.239
Single quoted, literal '
some string
'
2.68s 0.02s 84% 3.191
5.67s 0.01s -3% 7.048s
HEREDOC, inlined vars <<<END
some $v1 string $v2
END
13.53s 0.11s 80% 16.959
Single quoted, concatenated vars '
some '.$v1.' string '.$v2.'
'
6.55s 0.04s 83% 7.924
6.98s 0.07s -3% 9.035s
5 var interpolations, double quoted " some $v1 some $v1 some $v1 some $v1 some $v1 string" 5.93s 0.08s 80% 7.450
5 var concatenations, single quoted ' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' string' 4.38s 0.08s 80% 5.541
1.55s 0s 0% 1.909s
10 var interpolations, double quoted " some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 string" 11.72s 0.08s 76% 15.393
10 var concatenations, single quoted ' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' string' 8.91s 0.08s 72% 12.458
2.81s 0s 4% 2.935s
15 var interpolations, double quoted " some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 string" 17.14s 0.10s 74% 23.267
15 var concatenations, single quoted ' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' string' 13.99s 0.08s 73% 19.160
3.15s 0.02s 1% 4.107s
20 var interpolations, double quoted " some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 string" 22.42s 0.16s 68% 32.848
20 var concatenations, single quoted ' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' string' 20.07s 0.22s 56% 36.184
2.35s -0.06s 12% -3.336s
25 var interpolations, double quoted " some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 string" 28.89s 0.17s 66% 43.782
25 var concatenations, single quoted ' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' string' 26.33s 0.25s 60% 44.040
2.56s -0.08s 6% -0.258s
30 var interpolations, double quoted " some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 string" 33.39s 0.14s 67% 49.422
30 var concatenations, single quoted ' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' string' 32.69s 0.16s 61% 53.799
0.7s -0.02s 6% -4.377s
35 var interpolations, double quoted " some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 string" 40.57s 0.22s 65% 1:02.63
35 var concatenations, single quoted ' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' string' 39.45s 0.20s 57% 1:08.51
1.12s 0.02s 8% 0s
40 var interpolations, double quoted " some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 string" 48.34s 0.22s 67% 1:12.41
40 var concatenations, single quoted ' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' string' 45.94s 0.32s 68% 1:07.66
2.4s -0.1s -1% 0s
45 var interpolations, double quoted " some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 string" 53.25s 0.22s 64% 1:22.84
45 var concatenations, single quoted ' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' string' 53.21s 0.53s 62% 1:26.56
0.04s -0.31s 2% 0s
50 var interpolations, double quoted " some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 string" 54.68s 0.23s 61% 1:29.66
50 var concatenations, single quoted ' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' string' 60.00s 0.32s 65% 1:31.99
-5.32s -0.09s -4% 0s
55 var interpolations, double quoted " some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 string" 60.54s 0.36s 73% 1:22.32
55 var concatenations, single quoted ' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' string' 67.72s 0.41s 81% 1:23.35
-7.18s -0.05s -8% 0s
60 var interpolations, double quoted " some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 string" 66.46s 0.52s 81% 1:22.18
60 var concatenations, single quoted ' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' string' 77.24s 0.42s 80% 1:36.82
-10.78s 0.1s 1% 0s
5 var %s, sprintf sprintf(' some %s some %s some %s some %s some %s string', $v1, $v1, $v1, $v1, $v1) 4.84s 0.10s 67% 7.270
5 var concatenations, single quoted ' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' string' 4.53s 0.04s 87% 5.246
0.31s 0.06s -20% 2.024s
10 var %s, sprintf sprintf(' some %s some %s some %s some %s some %s some %s some %s some %s some %s some %s string', $v1, $v1, $v1, $v1, $v1, $v1, $v1, $v1, $v1, $v1) 10.20s 0.66s 58% 18.712
10 var concatenations, single quoted ' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' string' 8.10s 0.08s 81% 10.021
2.1s 0.58s -23% 8.691s
15 var %s, sprintf sprintf(' some %s some %s some %s some %s some %s some %s some %s some %s some %s some %s some %s some %s some %s some %s some %s string', $v1, $v1, $v1, $v1, $v1, $v1, $v1, $v1, $v1, $v1, $v1, $v1, $v1, $v1, $v1) 14.62s 0.25s 34% 43.231
15 var concatenations, single quoted ' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' string' 13.17s 0.14s 80% 16.544
1.45s 0.11s -46% 26.687s
20 var %s, sprintf sprintf(' some %s some %s some %s some %s some %s some %s some %s some %s some %s some %s some %s some %s some %s some %s some %s some %s some %s some %s some %s some %s string', $v1, $v1, $v1, $v1, $v1, $v1, $v1, $v1, $v1, $v1, $v1, $v1, $v1, $v1, $v1, $v1, $v1, $v1, $v1, $v1) 16.52s 0.19s 77% 21.659
20 var concatenations, single quoted ' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' string' 19.74s 0.28s 80% 24.958
-3.22s -0.09s -3% -3.299s
25 var %s, sprintf sprintf(' some %s some %s some %s some %s some %s some %s some %s some %s some %s some %s some %s some %s some %s some %s some %s some %s some %s some %s some %s some %s some %s some %s some %s some %s some %s string', $v1, $v1, $v1, $v1, $v1, $v1, $v1, $v1, $v1, $v1, $v1, $v1, $v1, $v1, $v1, $v1, $v1, $v1, $v1, $v1, $v1, $v1, $v1, $v1, $v1) 20.90s 0.18s 80% 26.254
25 var concatenations, single quoted ' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' string' 27.05s 0.11s 79% 34.110
-6.15s 0.07s 1% -7.856s
Double quoted literal, via eval "some string" 57.33s 0.34s 78% 1:13.57
Single quoted literal, via eval 'some string' 59.14s 0.46s 69% 1:25.69
-1.81s -0.12s 9% 0s
Double quoted literal with $, via eval "some $ string $" 91.27s 0.50s 64% 2:23.10
Single quoted literal with $, via eval 'some $ string $' 58.44s 0.32s 60% 1:37.11
32.83s 0.18s 4% 1s
Double quoted literal with escaped $, via eval "some \$ string \$" 59.52s 0.37s 56% 1:45.96
Single quoted literal with escaped $, via eval 'some \$ string \$' 58.23s 0.50s 59% 1:38.93
1.29s -0.13s -3% 0s
Double quoted, inlined vars, via eval "some $v1 string $v2" 105.14s 0.65s 58% 2:59.47
Single quoted, concatenated vars, via eval 'some '.$v1.' string '.$v2 90.97s 0.62s 54% 2:46.54
14.17s 0.03s 4% 0s
Double quoted, inlined vars, via eval "some $v1 string $v2" 99.98s 1.08s 58% 2:51.39
Double quoted, inlined vars with braces, via eval "some ${v1} string ${v2}" 110.41s 1.42s 52% 3:33.68
-10.43s -0.34s 6% -1s
Double quoted, inlined vars with braces, via eval "some ${v1} string ${v2}" 117.89s 9.62s 48% 4:21.67
Double quoted, inlined vars with outer braces, via eval "some {$v1} string {$v2}" 108.61s 1.44s 50% 3:39.18
9.28s 8.18s -2% 1s
Double quoted, inlined array, via eval "some $a[v1] string $a[v2]" 118.50s 0.95s 62% 3:11.79
Single quoted, concatenated array, via eval 'some '.$a['v1'].' string '.$a['v2'] 117.95s 1.26s 73% 2:42.35
0.55s -0.31s -11% 1s
Double quoted, inlined array, via eval "some $a[v1] string $a[v2]" 122.48s 0.77s 60% 3:23.52
Double quoted, inlined array with braces, via eval "some ${a['v1']} string ${a['v2']}" 130.50s 0.71s 66% 3:17.28
-8.02s 0.06s -6% 0s
Double quoted, inlined array with braces, via eval "some ${a['v1']} string ${a['v2']}" 125.58s 0.79s 61% 3:24.23
Double quoted, inlined array with outer braces, via eval "some {$a['v1']} string {$a['v2']}" 136.92s 0.75s 74% 3:05.33
-11.34s 0.04s -13% 0s
Sprintf, string replacement, via eval sprintf('some %s string %s', $v1, $v2) 126.40s 0.69s 59% 3:32.77
Single quoted, concatenated vars, via eval 'some '.$v1.' string '.$v2 91.35s 0.54s 67% 2:16.43
35.05s 0.15s -8% 1s
HEREDOC, literal, via eval <<<END
some string
END
80.55s 0.44s 64% 2:05.50
Single quoted, literal, via eval '
some string
'
58.16s 0.35s 67% 1:27.08
22.39s 0.09s -3% 1s
HEREDOC, inlined vars, via eval <<<END
some $v1 string $v2
END
105.85s 0.59s 78% 2:15.44
Single quoted, concatenated vars, via eval '
some '.$v1.' string '.$v2.'
'
98.59s 1.24s 72% 2:17.74
7.26s -0.65s 6% 0s
5 var interpolations, double quoted, via eval " some $v1 some $v1 some $v1 some $v1 some $v1 string" 20.86s 0.15s 96% 21.670
5 var concatenations, single quoted, via eval ' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' string' 18.92s 0.11s 74% 25.456
1.94s 0.04s 22% -3.786s
10 var interpolations, double quoted, via eval " some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 string" 34.53s 0.25s 56% 1:01.65
10 var concatenations, single quoted, via eval ' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' string' 32.84s 0.46s 78% 42.666
1.69s -0.21s -22% -41.666s
15 var interpolations, double quoted, via eval " some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 string" 51.98s 3.11s 58% 1:34.84
15 var concatenations, single quoted, via eval ' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' string' 46.40s 0.68s 57% 1:21.58
5.58s 2.43s 1% 0s
20 var interpolations, double quoted, via eval " some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 string" 61.45s 0.68s 65% 1:34.87
20 var concatenations, single quoted, via eval ' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' string' 62.84s 0.43s 55% 1:53.28
-1.39s 0.25s 10% 0s
25 var interpolations, double quoted, via eval " some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 string" 75.32s 1.48s 62% 2:02.20
25 var concatenations, single quoted, via eval ' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' string' 75.65s 0.69s 69% 1:50.52
-0.33s 0.79s -7% 1s
30 var interpolations, double quoted, via eval " some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 string" 88.55s 1.83s 41% 3:39.52
30 var concatenations, single quoted, via eval ' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' string' 91.91s 1.03s 73% 2:05.59
-3.36s 0.8s -32% 1s
35 var interpolations, double quoted, via eval " some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 string" 110.07s 9.22s 70% 2:48.57
35 var concatenations, single quoted, via eval ' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' string' 112.10s 2.70s 68% 2:47.60
-2.03s 6.52s 2% 0s
40 var interpolations, double quoted, via eval " some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 string" 108.39s 0.60s 96% 1:52.66
40 var concatenations, single quoted, via eval ' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' string' 120.84s 0.64s 97% 2:05.17
-12.45s -0.04s -1% -1s
45 var interpolations, double quoted, via eval " some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 string" 127.82s 1.11s 96% 2:14.22
45 var concatenations, single quoted, via eval ' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' string' 138.15s 0.69s 95% 2:25.03
-10.33s 0.42s 1% 0s
50 var interpolations, double quoted, via eval " some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 string" 137.67s 0.73s 87% 2:38.88
50 var concatenations, single quoted, via eval ' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' string' 157.43s 0.64s 97% 2:42.23
-19.76s 0.09s -10% 0s
55 var interpolations, double quoted, via eval " some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 string" 145.68s 0.58s 96% 2:32.19
55 var concatenations, single quoted, via eval ' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' string' 173.23s 0.70s 97% 2:58.90
-27.55s -0.12s -1% 0s
60 var interpolations, double quoted, via eval " some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 some $v1 string" 165.30s 0.73s 96% 2:52.83
60 var concatenations, single quoted, via eval ' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' string' 183.32s 0.82s 96% 3:11.57
-18.02s -0.09s 0% -1s
5 var %s, sprintf, via eval sprintf(' some %s some %s some %s some %s some %s string', $v1, $v1, $v1, $v1, $v1) 18.22s 0.15s 97% 18.818
5 var concatenations, single quoted, via eval ' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' string' 18.87s 0.13s 96% 19.627
-0.65s 0.02s 1% -0.809s
10 var %s, sprintf, via eval sprintf(' some %s some %s some %s some %s some %s some %s some %s some %s some %s some %s string', $v1, $v1, $v1, $v1, $v1, $v1, $v1, $v1, $v1, $v1) 29.21s 0.19s 96% 30.396
10 var concatenations, single quoted, via eval ' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' string' 31.75s 0.12s 97% 32.636
-2.54s 0.07s -1% -2.24s
15 var %s, sprintf, via eval sprintf(' some %s some %s some %s some %s some %s some %s some %s some %s some %s some %s some %s some %s some %s some %s some %s string', $v1, $v1, $v1, $v1, $v1, $v1, $v1, $v1, $v1, $v1, $v1, $v1, $v1, $v1, $v1) 36.74s 0.20s 97% 38.065
15 var concatenations, single quoted, via eval ' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' string' 44.75s 0.28s 97% 46.157
-8.01s -0.08s 0% -8.092s
20 var %s, sprintf, via eval sprintf(' some %s some %s some %s some %s some %s some %s some %s some %s some %s some %s some %s some %s some %s some %s some %s some %s some %s some %s some %s some %s string', $v1, $v1, $v1, $v1, $v1, $v1, $v1, $v1, $v1, $v1, $v1, $v1, $v1, $v1, $v1, $v1, $v1, $v1, $v1, $v1) 46.36s 0.35s 97% 48.084
20 var concatenations, single quoted, via eval ' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' string' 61.17s 0.34s 94% 1:04.77
-14.81s 0.01s 3% 47.084s
25 var %s, sprintf, via eval sprintf(' some %s some %s some %s some %s some %s some %s some %s some %s some %s some %s some %s some %s some %s some %s some %s some %s some %s some %s some %s some %s some %s some %s some %s some %s some %s string', $v1, $v1, $v1, $v1, $v1, $v1, $v1, $v1, $v1, $v1, $v1, $v1, $v1, $v1, $v1, $v1, $v1, $v1, $v1, $v1, $v1, $v1, $v1, $v1, $v1) 56.58s 0.29s 97% 58.499
25 var concatenations, single quoted, via eval ' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' some '.$v1.' string' 76.88s 0.74s 94% 1:22.39
-20.3s -0.45s 3% 57.499s

Conclusion

As you can see, in tests where variables are interpolated into the string single quotes with concatenation ('some '.$v1.' string '.$v2) is always faster than double quotes with interpolation ("some $v1 string $v"). In tests where the string is a straight literal both are about the same speed.

Using curly braces around variables in double quotes makes no discernable difference to speed in the first set of tests. In the eval() tests using curly braces is definately slower.

HEREDOC is about the same speed as double quotes when it includes variables, but is slower than both double and single quotes when it is only a literal. Don't use HEREDOC at all if you can avoid it.

sprintf() is slower than anything else when doing simple string interpolation. It's about 3x slower than single quotes whereas double quotes is about 2x slower than single quotes. Don't use sprintf() when doing simple string replacement (sorry, C programmers).

Outer braces ({$var}) are slightly faster than inner braces (${var}) when using simple variables but slower when using complicated variables (such as arrays).

When putting many variables' values into a string using double quotes rather than single quotes is faster somewhere between 20 and 50 interpolations, depending on whether you use an opcode cache and the complexity of the variables.

When putting many variables' values into a string using sprintf rather than single quotes the win is much larger and shows up before 5 interpolations when not using an opcoce cache and around 20 when using one. Of course this is only for this many inerpolations in a single string. When you only have a few interpolations single quotes are still much faster.

Of course, this test was made over 1,000,000 iterations of each test string and the differences are in seconds but the difference is up to a 50% speedup. This can be a significant performance gain with a script which has lots of string processing or on a high volume site.

Other Reasons to Use Single Quotes

Single quotes are also better to use for reasons other than speed.

Source

<?php

$iterations 
10000000;
$tests = array(
               
'Double quoted literal' => '"some string"',
               
'Single quoted literal' => '\'some string\'',

               
'Double quoted literal with $' => '"some $ string $"',
               
'Single quoted literal with $' => '\'some $ string $\'',

               
'Double quoted literal with escaped $' => '"some \\$ string \\$"',
               
'Single quoted literal with escaped $' => '\'some \\$ string \\$\'',

               
'Double quoted, inlined vars' => '"some $v1 string $v2"',
               
'Single quoted, concatenated vars' => '\'some \'.$v1.\' string \'.$v2',

               
' Double quoted, inlined vars' => '"some $v1 string $v2"',
               
'Double quoted, inlined vars with braces' => '"some ${v1} string ${v2}"',
               
//' Single quoted, concatenated vars' => '\'some \'.$v1.\' string \'.$v2',

               
' Double quoted, inlined vars with braces' => '"some ${v1} string ${v2}"',
               
'Double quoted, inlined vars with outer braces' => '"some {$v1} string {$v2}"',

               
'Double quoted, inlined array' => '"some $a[v1] string $a[v2]"',
               
' Single quoted, concatenated array' => '\'some \'.$a[\'v1\'].\' string \'.$a[\'v2\']',

               
' Double quoted, inlined array' => '"some $a[v1] string $a[v2]"',
               
'Double quoted, inlined array with braces' => '"some ${a[\'v1\']} string ${a[\'v2\']}"',
               
//'  Single quoted, concatenated array' => '\'some \'.$a[\'v1\'].\' string \'.$a[\'v2\']',

               
' Double quoted, inlined array with braces' => '"some ${a[\'v1\']} string ${a[\'v2\']}"',
               
'Double quoted, inlined array with outer braces' => '"some {$a[\'v1\']} string {$a[\'v2\']}"',

               
'Sprintf, string replacement' => 'sprintf(\'some %s string %s\', $v1, $v2)',
               
'  Single quoted, concatenated vars' => '\'some \'.$v1.\' string \'.$v2',

               
'HEREDOC, literal' => '<<<END
some string
END'
,
               
' Single quoted, literal' => '\'
some string 
\''
,

               
'HEREDOC, inlined vars' => '<<<END
some $v1 string $v2
END'
,
               
'   Single quoted, concatenated vars' => '\'
some \'.$v1.\' string \'.$v2.\'
\''
,
               );

for (
$i 5$i <= 60$i += 5) {
    
$tests[$i.' var interpolations, double quoted'] = '"'.str_repeat(' some $v1'$i).' string"';
    
$tests[$i.' var concatenations, single quoted'] = str_repeat('\' some \'.$v1.'$i).'\' string\'';
}
for (
$i 5$i 30$i += 5) {
    
$tests[$i.' var %s, sprintf'] = 'sprintf(\''.str_repeat(' some %s'$i).' string\''.str_repeat(', $v1'$i).')';
    
$tests[' '.$i.' var concatenations, single quoted'] = str_repeat('\' some \'.$v1.'$i).'\' string\'';
}

echo 
'
<style type="text/css">
th {
  text-align: left;
}
.good {
  background-color: green;
}
.indifferent {
  background-color: gray;
}
.bad {
  background-color: red;
}
</style>
<h3>Test run on PHP v'
.phpversion().'</h3>
<table cellspacing="0" cellpadding="5">
  <tr>
    <th></th>
    <th>String</th>
    <th>User</th>
    <th>System</th>
    <th>CPU</th>
    <th>Total</th>
  </tr>'
;
$double true;

$realTests = array();
$realTestsEval = array();
foreach (
$tests as $title => $string) {
    
$realTests[$title] = array('string'  => $string,
                               
'code' => '<?php'.(strstr($title'vars') ? '
$v1 = \'var 1\';
$v2 = \'var 2, a much longer var\';' 
'').(strstr($title'array') ? '
$a = array(\'v1\' => \'var 1\', \'v2\' => \'var 2, a much longer var\');' 
'').'
for ($i = 0; $i < '
.(substr_count($string'v1') > $iterations 10 $iterations).'; ++$i) {
    $var = '
.$string.';
}
?>'
);
    
$realTestsEval[$title.', via eval'] = array('string'  => $string,
                               
'code' => '<?php'.(strstr($title'vars') ? '
$v1 = \'var 1\';
$v2 = \'var 2, a much longer var\';' 
'').(strstr($title'array') ? '
$a = array(\'v1\' => \'var 1\', \'v2\' => \'var 2, a much longer var\');' 
'').'
$str = \'
$var = '
.str_replace(array('\'''<<<'), array('\\\'''<<\'.\'<'), $string).';
\';
for ($i = 0; $i < '
.(substr_count($string'v1') > $iterations 10 $iterations).'; ++$i) {
    eval($str);
}
?>'
);
}

foreach (
array_merge($realTests$realTestsEval) as $title => $test) {
    
//Please excuse any strangeness in here. It took way too much fooling around to capture the (stderr) output of 'test'

    
echo '
  <tr>
    <th>'
.htmlentities($title).'</th>
    <td>'
.nl2br(htmlentities($test['string'])).'</td>';
    
$f tempnam('/tmp''stringTest');
    
$h fopen($f'w');
    
fwrite($h$test['code']);
    
fclose($h);

    
$s tempnam('/tmp''stringTestSh');
    
$h fopen($s'w');
    
fwrite($h'time php '.$f);
    
fclose($h);
    
$e tempnam('/tmp''stringTestErr');
    
$process proc_open('zsh '.$s,
                         array(
=> array('pipe''r'),
                               
=> array('pipe''w'),
                               
=> array('file'$e'w')),
                         
$pipes);
    
fwrite($pipes[1], '<?php
'
.$test.'
?>'
);
    
fclose($pipes[1]);
    
//echo stream_get_contents($pipes[0]);
    
fclose($pipes[0]);
    
proc_close($process);
    
$out preg_split('/\s+/'file_get_contents($e));
    echo 
'
    <td>'
.$out[2].'</td>
    <td>'
.$out[4].'</td>
    <td>'
.$out[6].'</td>
    <td>'
.$out[8].'</td>
  </tr>'
;
    
unlink($e);
    
unlink($f);
    
unlink($s);
    
$double = !$double;
    if (
$double) {
        echo 
'
  <tr>
    <th></th>
    <td></td>'
;
        foreach (array(
2468) as $key) {
            
$diff $oout[$key] - $out[$key];
            
//$percent = $out[$key] / $oout[$key];
            
echo '
    <td class="'
.($diff 'good' : ($diff == 'indifferent' 'bad')).'">'.$diff.($key == '%' 's')/*.'<br/>'.(round($percent, 2) * 2).'%'*/.'</td>';
        }
        echo 
'
  </tr>'
;
    } else {
        
$oout $out;
    }
}

echo 
'
</table>
<h2>Source</h2>'
;

highlight_file(__FILE__);

?>