Stay away from *any* math or function calls in predicates. Sequences are not arrays, and position predicates are not array indexes. Consider something like this:
let $list := 1 to 100 for $i in 1 to 10 return $list[xdmp:sleep(1000), 1 + xdmp:random(99)] How long will that take to run? You might consider using subsequence() instead. -- Mike On 7 Dec 2011, at 18:37 , seme...@hotmail.com wrote: > I have found a situation where the number of times an expression is evaluated > is greatly multiplied when the variables are declared in the prolog versus > using the "let" keyword. There's something going on here that I just can't > figure out. > > I know the code is a little strange, but it is the simplest example that I > could come up with that would definitely show the differences: > > Using declare: > > declare variable $set := (1,2,3,4,5,6,7,8,9,10); > declare variable $set-length := fn:count($set); > > let $value := > for $s at $i in 1 to 100000 > return $set[$set[$i + $set-length div 2]] > > return $value > > Total time: 16 sec > Number of times "$set-length div 2" is evaluated: 9999990 > > ---------------------------------------------------------------------------------- > > Using let: > > let $set := (1,2,3,4,5,6,7,8,9,10) > let $set-length := fn:count($set) > > let $value := > for $s at $i in 1 to 100000 > return $set[$set[$i + $set-length div 2]] > > return $value > > Total time: 0.4 sec > Number of times "$set-length div 2" is evaluated: 100000 > > ---------------------------------------------------------------------------------- > > And check this out, using declare but moving the index expression out to a > let: > > declare variable $set := (1,2,3,4,5,6,7,8,9,10); > declare variable $set-length := fn:count($set); > > let $value := > for $s at $i in 1 to 100000 > let $index := $i + $set-length div 2 > return $set[$set[$index]] > > return $value > > Total time: 0.37 sec > Number of times "$set-length div 2" is evaluated: 100000 > > ---------------------------------------------------------------------------------- > > So what's going on here? I'm using MarkLogic 5 > > -Ryan > _______________________________________________ > General mailing list > General@developer.marklogic.com > http://developer.marklogic.com/mailman/listinfo/general _______________________________________________ General mailing list General@developer.marklogic.com http://developer.marklogic.com/mailman/listinfo/general