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

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

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

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

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

  • ADN
  • *
  • Сообщений: 1189
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Скажите, замерял ли кто когда скорость работы функции чтения данных из XRecord
                             Данные железа:  ЦП Core i5, 4X1,9 ГГц,   ОЗУ 6Г Win 8.1 64bit
                                             Софт: AutoCAd 2012
объем чтения из записи XRecord: 7Кбайт
                                время чтения: 8 мс
На первый взгляд быстро, но когда нужно прочесть 1000 таких записей получается, что пользователь должен ждать уже 8 сек.
Скорее должно помочь, если снизить объем записи Xrecord. 7К очень уж много я там храню лишней информации.
 Или оператор  Try.. Catch тормозов добавляет.

Вот код функции для анализа:

Код - vb.net [Выбрать]
  1.  
  2.     Public Shared Function acadnet_xrecord_Get_String(ByVal dictName As String, _
  3.                                                       ByVal keyRec As String, _
  4.                                                       ByVal doc As CAD_APS.Document, _
  5.                                                       ByVal db As CAD_DBS.Database) As String
  6.  
  7.         Dim retS As String = vbNullString
  8.         Using doc.LockDocument
  9.             Using tr As CAD_DBS.Transaction = db.TransactionManager.StartTransaction
  10.                 Dim dicts As CAD_DBS.DBDictionary = tr.GetObject(db.NamedObjectsDictionaryId, CAD_DBS.OpenMode.ForRead, False)
  11.                 If dicts.Contains(dictName) Then
  12.                     Dim CurrDict As CAD_DBS.DBDictionary = tr.GetObject(dicts.GetAt(dictName), CAD_DBS.OpenMode.ForRead, False)
  13.                     If CurrDict.Contains(keyRec) Then
  14.                         Try
  15.                             Dim xrec As CAD_DBS.Xrecord = tr.GetObject(CurrDict.GetAt(keyRec), CAD_DBS.OpenMode.ForRead, False)
  16.                             retS = xrec.Data.AsArray(0).Value.ToString
  17.                         Catch ex As System.Exception
  18.                         End Try
  19.                     End If
  20.                 End If
  21.             End Using
  22.         End Using
  23.         Return retS
  24.     End Function
  25.  
  26.  




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

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Замер скорости чтения XRecord
« Ответ #1 : 25-01-2016, 23:29:15 »
Или оператор  Try.. Catch тормозов добавляет.
Этот тынц наглядно демонстрирует, что наличие исключений в цикле может существенно влиять на скорость работы приложения.

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

  • ADN
  • *
  • Сообщений: 1189
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Re: Замер скорости чтения XRecord
« Ответ #2 : 25-01-2016, 23:32:31 »
Этот тынц наглядно демонстрирует, что наличие исключений в цикле может существенно влиять на скорость работы приложения.
Убрал из алгоритма оператор Try.. Catch - все равно 8 мс читает.

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

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Замер скорости чтения XRecord
« Ответ #3 : 25-01-2016, 23:40:46 »
Убрал из алгоритма оператор Try.. Catch - все равно 8 мс читает.
На скорость влияет не "Try.. Catch", а возникающие исключения (Exceptions). Если твой код работал без "Try.. Catch", значит исключений не возникало. Я не вижу в твоём коде явного способа закрытия транзакции. Соответственно выполняется Commit, что является достаточно ресурсоёмким и, в данном случае, совершенно не нужным.

Если метод планируется использовать в больших циклах, то возможно имеет смысл передавать объект Transaction дополнительным параметром, а не создавать его каждый раз заново.

Ты не проверяешь в своём коде ни параметры на входе, ни результаты, отправляемые на выход. Это плохой подход в программировании.

Отмечено как Решение Алексей (IdeaSoft) 26-01-2016, 00:00:21

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Замер скорости чтения XRecord
« Ответ #4 : 25-01-2016, 23:47:37 »
7К очень уж много я там храню лишней информации.
Похоже, что да.

Или оператор  Try.. Catch тормозов добавляет.
Только если исключение реально возникает.
В твоём коде нет tr.Commit - соотвественно происходит откат транзакции, а это дополнительное время, часто очень значительное.
Я бы в этом коде обошелся бы совсем без транзакции.

Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN
  • *
  • Сообщений: 1189
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Re: Замер скорости чтения XRecord
« Ответ #5 : 25-01-2016, 23:55:57 »
Ты не проверяешь в своём коде ни параметры на входе, ни результаты
Параметры на входе Doc as Document и db As DataBase я проверяю снаружи функции
параметр на выходы retS тоже проверяю вне функции

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

  • ADN
  • *
  • Сообщений: 1189
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Re: Замер скорости чтения XRecord
« Ответ #6 : 25-01-2016, 23:57:13 »
Я бы в этом коде обошелся бы совсем без транзакции
Вот вот! Я тоже думаю к чему мне транзакция,
если базу открываю для чтения с флагом OpenMode.ForRead

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

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Замер скорости чтения XRecord
« Ответ #7 : 25-01-2016, 23:57:26 »
Параметры на входе Doc as Document и db As DataBase я проверяю снаружи функции
параметр на выходы retS тоже проверяю вне функции
Плохой, подверженный ошибкам подход.

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

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Замер скорости чтения XRecord
« Ответ #8 : 25-01-2016, 23:58:11 »
Вот вот! Я тоже думаю к чему мне транзакция,
если базу открываю для чтения с флагом OpenMode.ForRead
Кто-то мешает переписать код без использования транзакции? Можешь заменить на эмуляцию, в этом случае придётся заменить в коде только одно слово.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Замер скорости чтения XRecord
« Ответ #9 : 26-01-2016, 00:01:41 »
Я не вижу в твоём коде явного способа закрытия транзакции. Соответственно выполняется Commit, что является достаточно ресурсоёмким и, в данном случае, совершенно не нужным.
Если нет Commit, то выполняется Abort, который действительно ресурсоемкий.
P.S.: Я понимаю, что это у тебя просто описка, но уточнить я должен дабы не вводить никого в заблуждение.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN
  • *
  • Сообщений: 1189
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Re: Замер скорости чтения XRecord
« Ответ #10 : 26-01-2016, 00:02:57 »
Плохой, подверженный ошибкам подход.
А что Doc и db вернее нужно было бы проверять в теле функции!?
 

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

  • ADN
  • *
  • Сообщений: 1189
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Re: Замер скорости чтения XRecord
« Ответ #11 : 26-01-2016, 00:04:26 »
Если нет Commit, то выполняется Abort, который действительно ресурсоемкий.
Да-Да!! Саша ты прав поставил Commit и вместо 8 мс функция сразу начала работать 1 мс, а то и меньше < 1
Нужно попробовать вообще без транзакции сделать.

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

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Замер скорости чтения XRecord
« Ответ #12 : 26-01-2016, 00:07:35 »
Плохой, подверженный ошибкам подход.
А что Doc и db вернее нужно было бы проверять в теле функции!?
А что, разве это не очевидно? Текущая реализация вынуждает писать тебя код проверки каждый раз, как ты будешь использовать эту функцию. Чем больше кода, тем больше вероятность появления ошибки. Кроме того, в каких-то фрагментах ты можешь вовсе забыть выполнить эту проверку. То же самое относится и к случаям, когда твою функцию будут использовать др. программисты или программы - им каждый раз нужно будет писать код проверки. Текущая реализация функции предполагает, что программист, использующий её, должен быть знаком и с её реализацией (т.е. должен знать о том, что ему нужно дополнительно выполнять ряд проверок). Это плохой, подверженный ошибкам подход в программировании.

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

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Замер скорости чтения XRecord
« Ответ #13 : 26-01-2016, 00:09:04 »
Если нет Commit, то выполняется Abort, который действительно ресурсоемкий.
Согласен. Под вечер уже плохо соображаю. :)

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

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Замер скорости чтения XRecord
« Ответ #14 : 26-01-2016, 00:10:46 »
Нужно попробовать вообще без транзакции сделать.
Чем не устроил вариант с эмуляцией? По сути - это способ "без транзакции", который в коде выглядит "как транзакция".