Christopher Currens created LUCENENET-495:
---------------------------------------------

             Summary: Use of DateTime.Now causes huge amount of 
System.Globalization.DaylightTime object allocations
                 Key: LUCENENET-495
                 URL: https://issues.apache.org/jira/browse/LUCENENET-495
             Project: Lucene.Net
          Issue Type: Bug
          Components: Lucene.Net Core
    Affects Versions: Lucene.Net 2.9.4, Lucene.Net 3.0.3
            Reporter: Christopher Currens
            Assignee: Christopher Currens
            Priority: Critical
             Fix For: Lucene.Net 3.0.3


This issue mostly just affects RAMDirectory.  However, RAMFile and 
RAMOutputStream are used in other (all?) directory implementations, including 
FSDirectory types.

In RAMOutputStream, the file last modified property for the RAMFile is updated 
when the stream is flushed.  It's calculated using {{DateTime.Now.Ticks / 
TimeSpan.TicksPerMillisecond}}.  I've read before that Microsoft has regretted 
making DateTime.Now a property instead of a method, and after seeing what it's 
doing, I'm starting to understand why.  DateTime.Now is returning local time.  
In order for it to calculate that, it has to get the utf offset for the 
machine, which requires the creation of a _class_, 
System.Globalization.DaylightTime.  This is bad for performance.

Using code to write 10,000 small documents to an index (4kb sizes), it created 
1,570,157 of these DaylightTime classes, a total of 62MB of extra 
memory...clearly RAMOutputStream.Flush() is called a lot.

A fix I'd like to propose is to change the RAMFile from storing the 
LastModified date to UTC instead of local.  DateTime.UtcNow doesn't create any 
additional objects and is very fast.  For this small benchmark, the performance 
increase is 31%.

I've set it to convert to local-time, when {{RAMDirectory.LastModified(string 
name)}} is called to make sure it has the same behavior (tests fail otherwise). 
 Are there any other side-effects to making this change?

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: 
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to