lucenenet-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Christopher Currens (JIRA)" <>
Subject [jira] [Resolved] (LUCENENET-495) Use of DateTime.Now causes huge amount of System.Globalization.DaylightTime object allocations
Date Mon, 18 Jun 2012 16:35:43 GMT


Christopher Currens resolved LUCENENET-495.

    Resolution: Fixed
> Use of DateTime.Now causes huge amount of System.Globalization.DaylightTime object allocations
> ----------------------------------------------------------------------------------------------
>                 Key: LUCENENET-495
>                 URL:
>             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:!default.jspa
For more information on JIRA, see:


View raw message