If we want improve lookup performance in a SQL database, we place an index
on a column, or a group of columns. The same idea can be applied to a data
structure we keep in memory.

So if you know that you want to lookup entities by position and velocity,
you could have an indexing function like:

  (fn [index entity]
    (when (and (:position entity) (:velocity entity))
      (assoc-in index [:mobile (:id entity)] entity)))

And then you just need a way to run that index each time an entity is added
to your in-memory database. Naturally you'd also need a "unindex" function
as well.

I've written a game library called Ittyon that works along these lines.

- James


On 13 May 2016 at 00:31, JvJ <kfjwhee...@gmail.com> wrote:

> I'm intrigued, but I don't know exactly what you mean.
>
> On Thursday, 12 May 2016 16:25:05 UTC-7, James Reeves wrote:
>>
>> Have you considered defining specific indexes? For instance, if you know
>> ahead of time that you want to search for entities that have both position
>> and velocity, you could define an index that keys both of those values.
>>
>> - James
>>
>>
>>
>> On 12 May 2016 at 23:50, JvJ <kfjwh...@gmail.com> wrote:
>>
>>> Maybe this is a little off-topic, but on the general topic of
>>> performance, other than just numerical performance, what's the best way to
>>> get information/advice on how to improve it.
>>>
>>> I went about doing these tests (and other tests) because I'm trying to
>>> create a game scripting framework in clojure, which I want to build around
>>> an entity-component-system architecture.  Entities are maps of
>>> components, and system functions are defined to sort of "pattern match"
>>> against
>>> entities to see if they have the required components.  (i.e. an
>>> update-position function would add velocity to position, so it only applies
>>> to entities
>>> with both a position and a velocity component).
>>>
>>> The first step in this process is to find a way to store these so that
>>> it would be as fast as possible to iterate over "all entities with this set
>>> of components",
>>> while avoiding things like filter operations.
>>>
>>> I started off by making cross-map <https://github.com/JvJ/cross-map>,
>>> which cross-indexes any entries with keys of the form [r c], where r is a
>>> row and c is a column, and allows O(1) access
>>> of entire rows and columns.
>>>
>>> Still, though, the performance tests
>>> <https://github.com/JvJ/cross-map/blob/master/test/cross_map/perf.cljc>
>>> aren't what I expected they would be, and I'm wondering how to go about
>>> dealing with that.
>>>
>>> Again, this isn't strictly about numerical performance, but it's why I'm
>>> doing these kinds of tests in the first place.
>>>
>>> Thanks.
>>>
>>> On Thursday, 12 May 2016 15:23:07 UTC-7, raould wrote:
>>>>
>>>> On Thu, May 12, 2016 at 3:11 PM, Nicola Mometto <brob...@gmail.com>
>>>> wrote:
>>>> > Fair enough, but in this case types wouldn't really have helped: the
>>>> author did use `Double` type hints, mistakenly assuming that would make its
>>>> code use primitive types, which it does not since `Double` is boxed and not
>>>> primitive.
>>>> > Clojure already has compile time warnings about boxed math that
>>>> would've helped in this case if turned on, without any need for types: try
>>>> compiling OP's code after running `(set! *unchecked-math* :warn-on-boxed)`
>>>>
>>>> Thanks for the details re: double. Apologies for being annoyed/ing.
>>>>
>>>> Next up: something like `(set! *unchecked-laziness* :warn-on-lazy)? We
>>>> can relive the ignominious history of "$!" in Haskell.
>>>>
>>> --
>>> You received this message because you are subscribed to the Google
>>> Groups "Clojure" group.
>>> To post to this group, send email to clo...@googlegroups.com
>>> Note that posts from new members are moderated - please be patient with
>>> your first post.
>>> To unsubscribe from this group, send email to
>>> clojure+u...@googlegroups.com
>>> For more options, visit this group at
>>> http://groups.google.com/group/clojure?hl=en
>>> ---
>>> You received this message because you are subscribed to the Google
>>> Groups "Clojure" group.
>>> To unsubscribe from this group and stop receiving emails from it, send
>>> an email to clojure+u...@googlegroups.com.
>>> For more options, visit https://groups.google.com/d/optout.
>>>
>>
>>

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to