January 03, 2012
Hello everyone,

I would like to know whether

        if (symbol in symbols)
                return symbols[symbol];

is any less efficient than

        auto tmp = symbol in symbols;
        if (tmp !is null)
                return *tmp;

Without optimisation, it looks like the first example searches for `symbol' twice.

Thanks,
Matej

January 03, 2012
On 01/03/2012 02:52 AM, Matej Nanut wrote:

> I would like to know whether
>
>          if (symbol in symbols)
>                  return symbols[symbol];
>
> is any less efficient than
>
>          auto tmp = symbol in symbols;
>          if (tmp !is null)
>                  return *tmp;
>
> Without optimisation, it looks like the first example
> searches for `symbol' twice.

Although the symbol is looked up twice, the cost may be negligible. Being hash tables, AAs have constant time lookup. Algorithmically, looking up twice is the same as looking up once in hash tables.

When we assume that the looked-up object is going to be used in a non-trivial operation, then it doesn't matter.

Having said that, I would use the second version too :D perhaps shorter as

    if (tmp) {
        // use *tmp
    }

Ali