Еще оптимизационное

Submitted by 0xd34df00d on Fri, 04/18/2008 - 12:54

Сейчас заметил, что LeechCraft запускается секунд 7-9 на моем Core2Duo, что с оптимизациями (-O2), что без. Начал выяснять. Оказалось, работа с QSettings в XMLSettingsManager ведется, мягко говоря, не очень оптимально: они пересоздаются при каждом изменении свойства. В итоге, простенький diff, и время старта уменьшено на порядок: 0.9 секунды.

  1. % svn diff plugininterface/basesettingsmanager.h -r 574:575
  2. Index: plugininterface/basesettingsmanager.h
  3. ===================================================================
  4. --- plugininterface/basesettingsmanager.h (revision 574)
  5. +++ plugininterface/basesettingsmanager.h (revision 575)
  6. @@ -20,6 +20,7 @@
  7.  
  8. QMap<QByteArray, QPair<QObject*, QByteArray> > Properties2Object_;
  9. bool Initializing_;
  10. + QSettings *Settings_;
  11. public:
  12. /*! @brief Initalizes the settings manager.
  13. *
  14. @@ -30,15 +31,12 @@
  15. */
  16. void Init ()
  17. {
  18. - QSettings *settings = BeginSettings ();
  19. - QStringList properties = settings->childKeys ();
  20. + Settings_ = BeginSettings ();
  21. + QStringList properties = Settings_->childKeys ();
  22. Initializing_ = true;
  23. for (int i = 0; i < properties.size (); ++i)
  24. - setProperty (PROP2CHAR (properties.at (i)), settings->value (properties.at (i), QVariant ()));
  25. + setProperty (PROP2CHAR (properties.at (i)), Settings_->value (properties.at (i), QVariant ()));
  26. Initializing_ = false;
  27. - EndSettings (settings);
  28. - delete settings;
  29. - settings = 0;
  30. }
  31.  
  32. /*! @brief Prepares the settings manager for deletion.
  33. @@ -51,10 +49,11 @@
  34. void Release ()
  35. {
  36. QList<QByteArray> dProperties = dynamicPropertyNames ();
  37. - QSettings *settings = BeginSettings ();
  38. for (int i = 0; i < dProperties.size (); ++i)
  39. - settings->setValue (dProperties.at (i), property (dProperties.at (i).constData ()));
  40. - EndSettings (settings);
  41. + Settings_->setValue (dProperties.at (i), property (dProperties.at (i).constData ()));
  42. + EndSettings (Settings_);
  43. + delete Settings_;
  44. + Settings_ = 0;
  45. }
  46.  
  47. /*! @brief Subscribes object to property changes.
  48. @@ -107,11 +106,7 @@
  49. QDynamicPropertyChangeEvent *event = dynamic_cast<QDynamicPropertyChangeEvent*> (e);
  50.  
  51. QByteArray name = event->propertyName ();
  52. - QSettings *settings = BeginSettings ();
  53. - settings->setValue (name, property (name));
  54. - EndSettings (settings);
  55. - delete settings;
  56. - settings = 0;
  57. + Settings_->setValue (name, property (name));
  58.  
  59. if (Properties2Object_.contains (name))
  60. {

Базы данных два метра занимают, из них полтора — Aggregator'овские фиды.