When thinking about performance, there are three key things that you could do that work wonders on your performance. In this entry we are going to explore them.

Loops
A loop is a fundamental construct in all major computer languages and for a good reason too. You wouldn’t be able to do much without it. It’s uses are varied including:
- Core part of Divide and Conquer algorithms
- Unpacking results from database
- Acting on multiple inputs
- etc
Their prominent place in our world is not carte blanche to spate our code with it, regulation is key! The reason for that lies in how running time relates to loops.
Without going into details, it suffices to say that a simple loop takes n time to complete, a loop nested within it would take n^2 time by the time you get to another loop the time is now n^3. At this level of complexity it would be impossible to run the program in any kind of production system.
As such we need to find ways to either eliminate loops, make them run in a serial fashion or use recursive methods.
Here is an example, suppose we have an array of names.
$names = ['Rachel', 'Ben','Justin','Gloria'];
We would like to attach information about say gender and nickname to the data.
The most obvious way of doing it would be
foreach($names as $name){
$name['gender']= determineGender($name);
}
foreach($names as $name){
$name['nickname']= determineNickname($name);
}
This code is not too bad and in fact could potentially work if data set remains small, however we can make it much faster by simply combining the two operations as such
foreach($names as $name){
$name['gender']= determineGender($name);
$name['nickname']= determineNickname($name);
}
Minimize calls to external systems
Modern applications requires an entire host of supporting services to make them work. The most common include:
- Databases
- Search engines
- File systems
What may seem blazingly fast may not work so well when your system needs to scale.
In the example below we think of a situation where we retrieve names and then display them alongside with people of a related gender.
$names = DB::findByName("Julia");
foreach($names as $name){
$names['gender']=determineGender($name);
$names['related']=Db::findByGender($namesWithGender['gender']);
}
In the above case we are calling the database each time the loop runs. For large loops this process would become more expensive.
Instead of that mess, we instead need to make all our database calls first and then bring in the extra information.
$names = DB::findByName("Julia");
$femaleNames = Db::findByGender('female');
$maleNames = Db::findByGender('male');
foreach($names as $name){
$names['gender'] = determineGender($name);
if($names['gender']=='male'){
$names['related']=$maleNames;
}
else{
$names['related']=$femaleNames;
}
}
While a tad more complex, the above code greatly minimizes outside calls.
Cache cache cache
Never do the same work more than once! If it can be cached, let it be cached.
Even light tasks can be cached for incredible performance. When your App’s popularity skyrockets you will be thanking the code gods for the blessing of caches.
Some candidates for caching include:
- Database results
- Computation results
- HTML rendered
Using an external service has to be balanced with the cost of calling the said service. Sound judgment and good engineering taste will help you determine the best cause of action.
Should you decide to cache, I highly recommend the popular service memcached.
Have you ever had performance issues on your own application? How did you deal with it? Tell us in the comment section below.






