I don't agree code with multiple indices is necessary hard
to read, and using an intermediate reference is clearer.
Something like:
$data {$host} {$user} {$process} += $time_used;
is in my opinion far more clear than:
$host_ref = $data {$host};
$user_host_ref = $host_ref -> {$user};
$proc_user_host_ref = $user_host_ref -> {$process};
$proc_user_host_ref += $time_used;
The former clearly shows you are collecting data, per host,
per user and per process. The latter is just a mess, and you
quickly run out of sensible variable names.
If you have cases where $var {key1} {key2} {key3}
becomes unclear, you either have to redesign your datastructure,
or need to find better key or variable names.
That using a reference to an inner structure is a win in your
benchmark is clear, as you don't have to redo some calculations.
But you cannot do that always - you can only do that if you access
the same keys repeatedly. Often, the keys used are variable,
and will differ from iteration to iteration.
Abigail