Holger - could you put a patch for this on JIRA please?

        Andy


On 28/01/13 06:10, Holger Knublauch wrote:
Hi Andy,

I have meanwhile collected more conclusive evidence of the difference
that a change to the now() function would make. I ran typical test
scenarios in our EVN tool, which creates thousands of SPARQL queries to
build up the UI. Average results over three runs are:

- Current code: 9 seconds
- Code with a constant xsd:dateTime: 8.5 seconds.

As I said this code creates thousands of QueryExecutions, so it
certainly is a bit extreme - yet I guess any SPARQL end point based on
Jena would have the same performance "bottleneck" if used extensively.

HTH
Holger


On 1/17/2013 9:24, Andy Seaborne wrote:
On 16/01/13 22:48, Holger Knublauch wrote:

On Jan 17, 2013, at 12:52 AM, Andy Seaborne wrote:

On 16/01/13 01:02, Holger Knublauch wrote:
Hi Andy,

I ran a profiler through a typical scenario with our software and
discovered that 10% of the clocked time was spent in the
initialization
of the xsd:dateTime literal needed by the afn:now() and NOW function.
Below is a snapshot from Yourkit profiler.



Unless this is a measurement error in the tool, I believe there
would be
a low-hanging fruit to optimize performance if the value would be
computed on demand only. I do understand that you need to get the time
stamp for the duration of the whole query, but I believe it would be
much faster to simply get the current time millis as a long, and from
this derive the actual XSD literal only if someone really calls this
SPARQL method.

Thanks
Holger


Holger,

This isn't clear to me - I can not see the code context for the call
to NodeFactory.nodeAsDateTime.

what is the SPARQL query being executed?

Any QueryExecution. The relevant call tree starts in the class Context:

     context.set(ARQConstants.sysCurrentTime,
NodeFactory.nowAsDateTime()) ;

My suggestion is to use a different constant such as
sysCurrentTimeMillis for a simple long and compute the sysCurrentTime
on demand only, on the first call of the now function.

Holger,

What I need is a comparison - have you run with such a change? Your
suggestion looks sensible IF it addresses the root cause.

What is the profile with a dummy value for
  context.set(ARQConstants.sysCurrentTime, NodeFactory.nowAsDateTime()) ;

because the report seems to show at least 889ms (0.9 seconds) per query.
My experience is that each query does not take almost 1 second
overhead in a warmed up JVM!

The profile shows 140ms in Integer.toString and 15ms in calcTimezone.

Have you run with such a change?
What is the profile with a dummy value for
  context.set(ARQConstants.sysCurrentTime, NodeFactory.nowAsDateTime()) ;

otherwise isn't it better to look at Integer.toString because that is
used elsewhere?

(note - locale processing in Java is sometimes expensive and delayed
and it is needed for string conversions)

And which version of Jena/ARQ is this?

    Andy


HTH
Holger



Is this the first query to run in the JVM?
Are you running a single query in a fresh JVM?
Is there a nested select?



    Andy



Reply via email to