Sorry, the runtime complexity in Calfpath would be generally O(n^2) because 
iterating routes and under every route iterating each character in the URI 
template in the worst case.


Shantanu

On Monday, 7 January 2019 12:43:44 UTC+5:30, Shantanu Kumar wrote:
>
>
>
> On Monday, 7 January 2019 01:03:16 UTC+5:30, Paul deGrandis wrote:
>>
>> Hi Shantanu,
>>
>> Interesting project and congrats on the release!
>>
>> I think Alan was asking more about the runtime and space complexities.  
>> What is the core approach used in Calfpath?  What is the runtime and space 
>> complexity?  What are the ideal operational conditions and under what 
>> conditions does it suffer?  What were the trade-offs made in the approach?
>>
>> I'm curious to know the answers myself.  Thanks!
>>
>
>
> Hi Paul,
>
> Thanks for expanding Alan's question. I think, the short answer about 
> runtime and space complexity would be O(n) and O(n) in Calfpath. Please 
> read on for more details. The top performing implementations in Calfpath 
> cannot support a very large number of routes (subject to Java method size 
> limit.)
>
> At the grass root level, the URI matching code (hand coded in Java, not 
> using any regex) is common across all Calfpath routing. It pre-compiles a 
> URI pattern, e.g. "/foo/:id/bar" into a vector of tokens ["/foo" :id 
> "/bar"] and later the URI-matching function iterates over the tokens.
>
> There are three implementations of routing supported in Calfpath, each of 
> which returns `nil` as soon as it realises a match is not likely:
>
> 1. Macros: There are macros (in calfpath.core ns) for matching URI, method 
> etc. that expand in-line. The URI, method etc are literals that are 
> pre-compiled for efficient matching. Obviously, this approach leads to 
> in-lined code that runs the risk of exceeding the Java method size (in 
> bytecodes) limit for a large number of routes. However, given that the vast 
> majority of applications have < 50 routes in number, it is not a concern 
> for many.
>
> 2. Walking precompiled routes: This is an implementation (in 
> calfpath.route ns) of data driven, potentially nested, routes (vector of 
> maps). The routes are pre-compiled to a substrate form, still as vector of 
> maps, that a function iterates over recursively where nested. This is a 
> simple, iterative implementation that can also handle a large number of 
> routes. It is also the slowest among the three routing implementations.
>
> 3. Loop-unrolled expression tree: This is also an implementation (in 
> calfpath.route ns) of data driven, potentially nested, routes (vector of 
> maps). The routes are pre-compiled to a substrate form like in the second 
> implementation. Then, a function assembles an expression tree using all the 
> routes info, wraps it in a function form and calls `eval` to turn the 
> expression tree into a function. The result is an in-lined function that 
> performs close to the first macro-based implementation, and runs the same 
> risk of exceeding Java method size limit for a large number of routes. This 
> technique also makes optional (enabled by default) use of deep 
> expression-tree building, where pre-compiling URI matching and method 
> matching also emit expressions in addition to matcher functions.
>
> In general, the optimisations in Calfpath rely more on JIT's instruction 
> caching than data-cache coherence, and the fact that web-routing is such a 
> repeatedly executed code that it's OK to inline most of the routing code 
> together. Hope this explains Calfpath's approach. Please let me know if you 
> have any other questions.
>
>
> Shantanu
>  
>
>>
>> Cheers,
>> Paul
>>
>>

-- 
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