Laravel's collect()->join() method vs implode() | Benchmark
Laravel offers a convenience to join an array such as [one,two,three]
into a string like this: 'one, two and three'
, which takes a little extra code in PHP native, but is also quite faster in PHP native. This blog post was inspired by a tweet by @ecrmnn.
Laravel collect->join() code:
This will yield the string one, two and three
.
<?php
$array = ['one', 'two', 'three'];
$str = collect($array)->join(', ', ' and ');
Native php array_pop & implode()
This will also yield the string one, two and three
.
<?php
$array = ['one', 'two', 'three'];
$last = array_pop($array);
$str = implode(', ', $array).' and '.$last;
Benchmarks
In my benchmark on php 7.4 with 1,000,000 iterations:
- collect/join: 0.6556 seconds
- pop/implode : 0.0472 seconds
php 8.0 was similar.
When I re-ran the laravel benchmark with JUST collect($array)
, and did NOT join()
, it took 0.1113 seconds.
The collect approach comes out to 0.656 μs (micro seconds) per iteration.
Laravel Pros
-
collect()->join()
is quite readable & for some may be easier to maintain. - I think it's probably easier for a new coder or someone new to php to understand.
- Laravel Collections also provide other convenience methods, so you might use the same collection object for multiple things.
Laravel Cons
- It is about 14 times slower than the php native
array_pop/implode
approach. - Code portability. If you ever decide to stop using laravel, this will break.
- Laravel comes with many dependencies. But i doubt you'd use their collections unless you were using laravel already anyway. Also, you may be able to just install illuminate collections
Native Pros
- Built-in to php. No dependencies to install
- significantly faster
- saves energy
- some may find the native php approach more readable
Native Cons
- an extra line of code
- not as 'cool'
Conclusions
The actual amount of cpu time is negligible on modern hardware. I suspect the energy cost for your webhost probably won't be much bothered either.
Ultimately, whatever you like better is probably fine, if you think you're going to use laravel long term. If you have plans to kick laravel, i'd suggest the native approach. You could also throw the native approach into a function like fancy_implode
if you need it in multiple places.
Ranting
I personally prefer the native php implementation. I have feelings about it, and i have a hard time saying why i actually care. I think my main issue with collect/join is the direction a lot of software has gone in as time moves forward. We develop more and more layers of abstraction. We rely on fast hardware to run slow software. We get farther and farther from what the computer is actually doing.
I don't think abstraction is bad. I do value developer experience. I even sometimes write & use slow software myself because i like it. Just. Something about this bothers me & it's hard to explain why.