PHP ternary operator: fast or not?

藏色散人
Release: 2023-04-04 21:36:01
Original
4785 people have browsed it

People love optimization. They are easy to understand and easy to apply…. But a while ago, while looking at Twig's pull requests, I read an interesting discussion about the performance of the ternary operator in PHP.

PHP ternary operator: fast or not?

Do you know which of the following snippets is the fastest (of course, they do exactly the same thing)?

// snippet 1
$tmp = isset($context['test']) ? $context['test'] : '';

// snippet 2
if (isset($context['test'])) {
    $tmp = $context['test'];
} else {
    $tmp = '';
}
Copy after login

The correct answer is:

Depending on the situation. Most of the time, their speeds are the same and you don't need to care. But if $context['test'] contains a lot of data, snippet 2 is much faster than snippet 1.

Here is the code I used to test different scenarios:

$context = array('test' => true);

// optionally fill-in the test value with lots of data
for ($i = 0; $i < 100000; $i++) {
    $context[&#39;test&#39;][$i] = $i;
}
// you can also just create a big string
// $context = str_repeat(&#39; &#39;, 1000000);

// benchmark
$time = microtime(true);
for ($i = 0; $i < 100; $i++) {
    // the snippet of code to benchmark
    $tmp = isset($context[&#39;test&#39;]) ? $context[&#39;test&#39;] : &#39;&#39;;
}
printf("TIME: %0.2d\n", (microtime(true) - $time) * 1000);
Copy after login

Note, the absolute performance numbers here are meaningless. We just want to compare the speed between different clips.

On my laptop, snippet 1 takes over 2 seconds to run, while snippet 2 takes about 0.05ms. That's a big difference! But if the variable being tested doesn't carry a lot of data, the speed is almost the same.

So, why is the ternary operator slow in some cases? Why does it rely on the value stored in the test variable?

The answer is very simple:

The ternary operator always copies the value, while the if statement does not copy the value. Why? Because PHP uses a technique called copy-on-write: when you assign a value to a variable, PHP doesn't actually create a copy of the variable's contents until it's modified.

When you write a statement like $tmp = $context['test'], almost nothing happens: the $tmp variable just becomes a reference to the $context['test'] variable; that's why It's very fast. But as soon as you want to modify the variable, PHP needs to copy the original one:

$tmp = $context[&#39;test&#39;];

// the copy happens now
$tmp[] = true;

// copy also happens if the original variable changes
// $context[&#39;test&#39;][] = true;
Copy after login

To sum up, the speed of the ternary operator is directly related to the time it takes to copy the result of the statement, even if it is not strictly required. Copying an array of 100,000 elements takes time.

If you are using PHP 5.3, there is an easier way to express our statement using the new ?:construct::

$tmp = $context[&#39;test&#39;] ?: &#39;&#39;;
Copy after login

But in terms of performance, this new Constructs have the same disadvantages as standard constructs, even though PHP may be able to optimize the case where variables are present.

The above is the detailed content of PHP ternary operator: fast or not?. For more information, please follow other related articles on the PHP Chinese website!

Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template