Замер скорости чтения XRecord

Автор Тема: Замер скорости чтения XRecord  (Прочитано 14764 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1189
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Re: Замер скорости чтения XRecord
« Ответ #15 : 26-01-2016, 00:13:57 »
А что, разве это не очевидно? Текущая реализация вынуждает писать тебя код проверки каждый раз, как ты будешь использовать эту функцию. Чем больше кода, тем больше вероятность появления ошибки. Кроме того, в каких-то фрагментах ты можешь вовсе забыть выполнить эту проверку. То же самое относится и к случаям, когда твою функцию будут использовать др. программисты или программы - им каждый раз нужно будет писать код проверки. Текущая реализация функции предполагает, что программист, использующий её, должен быть знаком и с её реализацией (т.е. должен знать о том, что ему нужно дополнительно выполнять ряд проверок). Это плохой, подверженный ошибкам подход в программировании

Да ты прав поставлю в тело функции. Проверка входных параметров вроде время так много не отнимает. Хотя и вызываю во всем проекте эту функцию 6 раз. Все же подход к грамотному программированию должен быть.
Спасибо ребята вы мне помогли!
Ярослав с Наташей на дне разработчика 21 января 2016 хвалили наш форум. Много пришло новых людей. В этом году 200 чел пришли на DevDay
Лично я рад что есть этот форум.

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1189
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Re: Замер скорости чтения XRecord
« Ответ #16 : 26-01-2016, 00:14:21 »
А что, разве это не очевидно? Текущая реализация вынуждает писать тебя код проверки каждый раз, как ты будешь использовать эту функцию. Чем больше кода, тем больше вероятность появления ошибки. Кроме того, в каких-то фрагментах ты можешь вовсе забыть выполнить эту проверку. То же самое относится и к случаям, когда твою функцию будут использовать др. программисты или программы - им каждый раз нужно будет писать код проверки. Текущая реализация функции предполагает, что программист, использующий её, должен быть знаком и с её реализацией (т.е. должен знать о том, что ему нужно дополнительно выполнять ряд проверок). Это плохой, подверженный ошибкам подход в программировании

Да ты прав поставлю в тело функции проверки. Проверка входных параметров вроде время так много не отнимает. Хотя и вызываю во всем проекте эту функцию 6 раз. Все же подход к грамотному программированию должен быть.
Спасибо ребята вы мне помогли!
Ярослав с Наташей на дне разработчика 21 января 2016 хвалили наш форум. Много пришло новых людей. В этом году 200 чел пришли на DevDay
Лично я рад что есть этот форум.

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1189
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Re: Замер скорости чтения XRecord
« Ответ #17 : 26-01-2016, 00:16:34 »
Чем не устроил вариант с эмуляцией?
Ну вот я и попробую с этой эмуляцией и посмотрю может еще быстрее работать будет.

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Замер скорости чтения XRecord
« Ответ #18 : 26-01-2016, 00:21:56 »
Ярослав с Наташей на дне разработчика 21 января 2016 хвалили наш форум.
Я на форуме до тех пор, пока здесь работает А.Н. Ривилис и отвечает на мои вопросы. :) Если ситуация изменится, то форум станет мне не интересным (как это уже случилось с caduser.ru и dwg.ru) и я перестану его посещать. Без А.Н. рейтинг форума резко упадёт, так что дружно ратуем за то, чтобы Автодеск и впредь продолжал оплачивать работу А.Н. Ривилиса на данном ресурсе.

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Re: Замер скорости чтения XRecord
« Ответ #19 : 26-01-2016, 00:47:10 »
У меня такой метод живет в библиотеке:
Код - C# [Выбрать]
  1.         /// <summary>
  2.         /// Получение данных из корневого словаря расширения объекта
  3.         /// </summary>
  4.         /// <param name="obj">Объект</param>
  5.         /// <param name="dataName">Название данных</param>
  6.         /// <returns>
  7.         /// Данные в виде объекта ResultBuffer или null при неудаче
  8.         /// </returns>
  9.         public static ResultBuffer ReadRootData(DBObject obj, string dataName)
  10.         {
  11.             ObjectId dbExtDictId = obj.ExtensionDictionary;
  12.             if (dbExtDictId.Verify())
  13.             {
  14. #pragma warning disable 618
  15.                 using (DBDictionary dbExtDict
  16.                     = dbExtDictId.Open(OpenMode.ForRead, false) as DBDictionary)
  17. #pragma warning restore 618
  18.                 {
  19.                     if (dbExtDict != null && dbExtDict.Contains(dataName))
  20.                     {
  21.                         ObjectId xRecId = dbExtDict.GetAt(dataName);
  22. #pragma warning disable 618
  23.                         using (Xrecord xRec = xRecId.Open
  24.                             (OpenMode.ForRead, false) as Xrecord)
  25. #pragma warning restore 618
  26.                         {
  27.                             if (xRec != null)
  28.                             {
  29.                                 return xRec.Data;
  30.                             }
  31.                         }
  32.                     }
  33.                 }
  34.             }
  35.             return null;
  36.         }
  37.  
  38.         public static bool Verify(this ObjectId id)
  39.         {
  40.             return
  41.                 !id.IsNull &&
  42.                 id.IsValid &&
  43.                 !id.IsErased &&
  44.                 !id.IsEffectivelyErased;
  45.         }
  46.  
  47.  
Это как пример, как без транзакции читать словарь. Тут ExtensionDictionary, а не NOD. Но принцип тот же.

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1189
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Re: Замер скорости чтения XRecord
« Ответ #20 : 26-01-2016, 01:32:37 »
Это как пример, как без транзакции читать словарь[/quo
Спасибо испробую этот метод!
 

Оффлайн Привалов Дмитрий

  • ADN Club
  • *****
  • Сообщений: 546
  • Карма: 119
Re: Замер скорости чтения XRecord
« Ответ #21 : 26-01-2016, 08:30:25 »
На первый взгляд быстро, но когда нужно прочесть 1000 таких записей получается, что пользователь должен ждать уже 8 сек.
Ключевое слово здесь (когда нужно прочесть 1000 таких записей). Когда есть циклы, особенно вложенные смотри в первую очередь  на циклы!

Твоя функция создана универсальной для чтения одиночной записи , а не 1000 записей подряд.
скорее всего незачем вызывать 1000 раз подряд:
- блокировку документа,
- открытие закрытие транзакции
- получение NamedObjectsDictionary
это и нужно оптимизировать в первую очередь.

Не знаю до конца твоей задачи,  сколько database, DBDictionary и Xrecord. Откуда беруться database. Для одной database примерно так.
Код - C# [Выбрать]
  1. private void ReadAllData()
  2. {
  3.             Document document = Cad.DocumentManager.MdiActiveDocument;
  4.             DocumentLock documentLock = document.LockDocument();
  5.             Database db = HostApplicationServices.WorkingDatabase;
  6.             Transaction tr = database.TransactionManager.StartTransaction();
  7.             DBDictionary namedObjectsDictionary = (DBDictionary)tr.GetObject(db.NamedObjectsDictionaryId, OpenMode.ForRead, false);
  8.             foreach (string dictName in dictNameArray)
  9.             {
  10.                if (namedObjectsDictionary.Contains(dictName))
  11.                {
  12.                   DBDictionary CurrDict = (DBDictionary)tr.GetObject(namedObjectsDictionary.GetAt(dictName), OpenMode.ForRead, false);
  13.                   foreach (string keyRec in keyNameArray)
  14.                   {
  15.                      string retS = acadnet_xrecord_Get_String(dictName, keyRec, tr, CurrDict);
  16.                   }
  17.                }
  18.                
  19.             }
  20.             transaction.Commit();
  21.             transaction.Dispose();
  22.             documentLock.Dispose();
  23. }
  24.  
  25. private string acadnet_xrecord_Get_String(string dictName, string keyRec, Transaction tr, DBDictionary CurrDict)
  26. {
  27.             string retS = "";
  28.             if (CurrDict.Contains(keyRec))
  29.             {
  30.                Xrecord xrec = (Xrecord)tr.GetObject(CurrDict.GetAt(keyRec), OpenMode.ForRead, false);
  31.                retS = xrec.Data.AsArray()[0].Value.ToString();
  32.             }
  33.             return retS;        
  34. }


using Transaction, проверки try  или !=null допилить не долго ;-)