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.
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
| 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 |
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.
Single quotes are also better to use for reasons other than speed.
<?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') > 1 ? $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') > 1 ? $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(0 => array('pipe', 'r'),
1 => array('pipe', 'w'),
2 => 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(2, 4, 6, 8) as $key) {
$diff = $oout[$key] - $out[$key];
//$percent = $out[$key] / $oout[$key];
echo '
<td class="'.($diff > 0 ? 'good' : ($diff == 0 ? 'indifferent' : 'bad')).'">'.$diff.($key == 6 ? '%' : 's')/*.'<br/>'.(round($percent, 2) * 2).'%'*/.'</td>';
}
echo '
</tr>';
} else {
$oout = $out;
}
}
echo '
</table>
<h2>Source</h2>';
highlight_file(__FILE__);
?>