"in" everywhere
Jonathan M Davis
jmdavisProg at gmx.com
Sat Oct 9 18:05:53 PDT 2010
On Saturday 09 October 2010 06:54:31 Stewart Gordon wrote:
> On 07/10/2010 15:22, Steven Schveighoffer wrote:
> <snip>
>
> > The problem is with generic code. Generic code that accepts some type
> > that defines the "in" operator. What can that generic code expect for
> > performance when using "in"? As a general rule, generic programming must
> > always assume the worst case, and if we have no rules for 'in', the
> > worst case is linear. Which means generic code may not use 'in' when it
> > would be a fast operation. Same thing with indexing. Try sorting a
> > 'random access' range which uses a linear search on opIndex, and see
> > what the performance is.
>
> <snip>
>
> Surely, what matters most for generic code is that in has consistent
> _semantics_, rather than the computational complexity?
>
> Stewart.
_Both_ matter.
Imagine, for instance, if we were to make Java's mistake of having List be an
interface which ArrayList and LinkedList implement and that List has a get()
function. Using ArrayList, get() has a complexity of O(1). Using LinkedList, it
has a complexity of O(n). Now, imagine code written with List rather than
ArrayList or LinkedList directly. If you use get(), then your code will vary
considerably in how efficient is. In small cases, this won't matter, but with
large lists, it could matter a lot. Your generic code which uses List _has_ to
worry about the computational complexity of get() or it could become very
inefficient. In this case, for most situations, that would mean using a foreach
loop or iterators directly, but using get() is likely a _bad_ idea. You need to
know the computational complexity of get() in order to use List efficiently.
To write efficient algorithms, you _must_ be able to rely on certain complexity
guarantees for the operations that you use. So, regardless of what those
complexity gurantees actually _are_, they need to be there.
- Jonathan M Davis
More information about the Digitalmars-d
mailing list