gnucash master: Bug 722903 - Poor performance of account hierarchy, budgets, reconcile window, ...

John Ralls jralls at code.gnucash.org
Mon Feb 17 13:43:58 EST 2014


Updated	 via  https://github.com/Gnucash/gnucash/commit/df3d55ca (commit)
	from  https://github.com/Gnucash/gnucash/commit/db982ff6 (commit)



commit df3d55ca552b5a2a8a0b6aced4226d8e1897d2f4
Author: John Ralls <jralls at ceridwen.us>
Date:   Mon Feb 17 10:41:29 2014 -0800

    Bug 722903 - Poor performance of account hierarchy, budgets, reconcile window,...
    
    Profiling showed the principal contributor to be g_time_zone_new, because
    it opens the timezone file on every call. Cache the local timezone to
    avoid 99% of these calls.

diff --git a/src/libqof/qof/gnc-date.c b/src/libqof/qof/gnc-date.c
index b928819..cd879fa 100644
--- a/src/libqof/qof/gnc-date.c
+++ b/src/libqof/qof/gnc-date.c
@@ -103,8 +103,12 @@ static QofLogModule log_module = QOF_MOD_ENGINE;
 static GTimeZone*
 gnc_g_time_zone_new_local (void)
 {
+    static GTimeZone* tz = NULL;
+    if (tz)
+	return tz;
 #ifndef G_OS_WIN32
-    return g_time_zone_new_local();
+    tz = g_time_zone_new_local();
+    return tz;
 #else
     TIME_ZONE_INFORMATION tzinfo;
     gint64 dst = GetTimeZoneInformation (&tzinfo);
@@ -112,9 +116,8 @@ gnc_g_time_zone_new_local (void)
     gint hours = -bias / 60; // 60 minutes per hour
     gint minutes = (bias < 0 ? -bias : bias) % 60;
     gchar *tzstr = g_strdup_printf ("%+03d:%02d", hours, minutes);
-    GTimeZone *tz = g_time_zone_new(tzstr);
-    g_free (tzstr);
-    return tz;
+    tz = g_time_zone_new(tzstr);
+    g_free (tzstr);    return tz;
 #endif
 }
 
@@ -178,9 +181,6 @@ gnc_g_time_zone_adjust_for_dst (GTimeZone* tz, GDateTime *date)
 static GDateTime*
 gnc_g_date_time_new_local (gint year, gint month, gint day, gint hour, gint minute, gdouble seconds)
 {
-#ifndef G_OS_WIN32
-    return g_date_time_new_local (year, month, day, hour, minute, seconds);
-#else
     GTimeZone *tz = gnc_g_time_zone_new_local();
     GDateTime *gdt = g_date_time_new (tz, year, month, day,
 				      hour, minute, seconds);
@@ -196,9 +196,7 @@ gnc_g_date_time_new_local (gint year, gint month, gint day, gint hour, gint minu
  */
     seconds += 5e-10;
     gdt =  g_date_time_new (tz, year, month, day, hour, minute, seconds);
-    g_time_zone_unref (tz);
     return gdt;
-#endif
 }
 
 static GDateTime*
@@ -211,61 +209,50 @@ gnc_g_date_time_adjust_for_dst (GDateTime *gdt, GTimeZone *tz)
     tz = gnc_g_time_zone_adjust_for_dst (tz, ngdt);
     gdt = g_date_time_to_timezone (ngdt, tz);
     g_date_time_unref (ngdt);
-    g_time_zone_unref (tz);
     return gdt;
 }
 
 GDateTime*
 gnc_g_date_time_new_from_unix_local (time64 time)
 {
-#ifndef G_OS_WIN32
-    return g_date_time_new_from_unix_local (time);
-#else
     GTimeZone *tz = gnc_g_time_zone_new_local ();
     GDateTime *gdt = g_date_time_new_from_unix_utc (time);
-    if (!gdt)
-      return gdt;
-    return gnc_g_date_time_adjust_for_dst (gdt, tz);
-#endif
+    if (gdt)
+	gdt = gnc_g_date_time_adjust_for_dst (gdt, tz);
+    return gdt;
 }
 
 static GDateTime*
 gnc_g_date_time_new_from_timeval_local (const GTimeVal* tv)
 {
-#ifndef G_OS_WIN32
-    return g_date_time_new_from_timeval_local (tv);
-#else
     GTimeZone *tz = gnc_g_time_zone_new_local ();
     GDateTime *gdt = g_date_time_new_from_timeval_utc (tv);
-    if (!gdt)
-	return gdt;
-    return gnc_g_date_time_adjust_for_dst (gdt, tz);
-#endif
+    if (gdt)
+	gdt = gnc_g_date_time_adjust_for_dst (gdt, tz);
+    return gdt;
 }
 
 static GDateTime*
 gnc_g_date_time_new_now_local (void)
 {
-#ifndef G_OS_WIN32
-    return g_date_time_new_now_local ();
-#else
     GTimeZone *tz = gnc_g_time_zone_new_local ();
-    GDateTime *gdt = g_date_time_new_now_local ();
-    if (!gdt)
-	return gdt;
-    return gnc_g_date_time_adjust_for_dst (gdt, tz);
-#endif
+    GDateTime *gdt = g_date_time_new_now_utc ();
+    if (gdt)
+	gdt = gnc_g_date_time_adjust_for_dst (gdt, tz);
+    return gdt;
+
 }
 
 static GDateTime*
 gnc_g_date_time_to_local (GDateTime* gdt)
 {
-#ifndef G_OS_WIN32
-    return g_date_time_to_local (gdt);
-#else
-    GTimeZone *tz = gnc_g_time_zone_new_local ();
-    return gnc_g_date_time_adjust_for_dst (g_date_time_to_utc (gdt), tz);
-#endif
+    GTimeZone *tz = NULL;
+    if (gdt)
+    {
+	tz = gnc_g_time_zone_new_local ();
+	gdt = gnc_g_date_time_adjust_for_dst (g_date_time_to_utc (gdt), tz);
+    }
+    return gdt;
 }
 
 typedef struct
@@ -1488,7 +1475,6 @@ gnc_iso8601_to_timespec_gmt(const char *str)
 	second += 5e-10;
 	gdt = g_date_time_new (tz, year, month, day, hour, minute, second);
         secs = g_date_time_to_unix (gdt);
-	g_time_zone_unref (tz);
     }
     else /* No zone info, assume UTC */
     {



Summary of changes:
 src/libqof/qof/gnc-date.c | 64 ++++++++++++++++++-----------------------------
 1 file changed, 25 insertions(+), 39 deletions(-)



More information about the gnucash-changes mailing list