In a very tight loop I need to access tens of thousands of values in an array containing millions of elements. The key can be undefined: In that case it shall be legal to return NULL without any error message:
- Array key exists: return value of element.
- Array key does not exist: return null.
I do know multiple solutions:
if (isset($lookup_table[$key])) {
return $lookup_table[$key];
} else {
return;
}
or
@return $lookup_table[$key];
or
error_reporting(0);
$return = $lookup_table[$key];
error_reporting(E_ALL);
return $return;
All solutions are far from optimal:
- The first one requires 2 lookup in the B-TREE: One to check existence, another to retrieve value. That effectively doubles the runtime.
- The second one uses the error suppression operator, and thus creates a massive overhead on that line.
- The third one calls the error handler (that will check error_reporting setting and then display nothing) and thereby creates an overhead.
Did I miss a way to avoid error handling and yet work with a single Btree lookup?
To answer some questions:
The array caches the results of a complex calculation - to complex to be done in real time. Out of billions of possible values, only millions yield a valid result. The array looks like 1234567 => 23457, 1234999 => 74361, .... That is saved to a PHP file of several megabyte, and include_once-d at the beginning of the execution. Initial load time does not matter.
If the key is not found, it simply means that this specific value will not return a valid result. The trouble is to get this done 50k+ per second.
isset($lookup_table[$key])will returnfalseif$lookup_table[$key]isnull... isn't this the opposite of what you want? not sure what its performance is like, butarray_key_existswill returntrueif the key exists but its value isnull.