Странные проблемы с производительностью.

Автор Тема: Странные проблемы с производительностью.  (Прочитано 23717 раз)

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

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Смотрел, смотрел на код - и у меня бредовый вопрос к знатокам C++ - а не может-ли меняться size_type после reserve - если это так - то количество итераций в коде автора как раз таки возрастет на порядки (запомнили в VectorSize мы его как Int32, а "крутим" как Int64 например) - автору - добавьте после всех push'ей вывод в консоль TmpVector.size - сразу увидим.
p.s. - пожалуй не досмотрел - size_type - это-ж не у объекта, а у класса.
« Последнее редактирование: 27-01-2016, 00:03:14 от Дима_ »

Оффлайн Николай Горлов

  • ADN
  • *
  • Сообщений: 238
  • Карма: 34
вставлю свои 5 копеек. взял приведенный код, собрал консольный Win32 проектик на своей студии 2012 SP4.погонял, потом чуток модернизировал и опять погонял. и так
наполнение, пушбэки лишние, если известен размер массива:
Код - C++ [Выбрать]
  1. TmpVector.resize(VectorSize);
  2. for (TestVector::size_type i = 0; i < VectorSize; i++)
  3. {
  4.         TmpVector[i] = new double(0.001);
  5. }
  6.  

удаление, слегка оптимизировано:
Код - C++ [Выбрать]
  1. //-> это выше функции int _tmain(int argc, _TCHAR* argv[])
  2. struct delete_ptr
  3. {
  4.     template <typename T>
  5.     void operator()(T* pPtr)
  6.     {
  7.         delete pPtr;
  8.     }
  9. };
  10. //<-
  11.         std::for_each(TmpVector.begin(), TmpVector.end(), delete_ptr());
  12. //      TestVector::iterator TmpIter1 = TmpVector.begin();
  13. //      while (TmpIter1 != TmpVector.end())
  14. //      {
  15. //              double* tt = (double*) *TmpIter1;
  16. //              delete tt;
  17. //              ++TmpIter1;
  18. //      }
  19.         TmpVector.clear();
  20.  

самое замечательное, что при заданном размере массива в 5млн разброс цифр при 10-15 запусках идет такой, что никакие закономерности проследить вообще не получается. но если увеличить размер массива раз в 10-20, то порядок разброса цифр уменьшается в разы. например, время создания для 5млн идет от 0.16 до 0.26 сек., а для 50млн - 1.85 - 1.89 сек., так что, увы, 5млн элементов недостаточно для выявления хоть какой-то статистики.
PS: ну и от себя добавлю, если тестирование проводить на "загруженном" компьютере, то результат может быть непредсказуемым. Например, одновременно играть в сапера, слушать музыку, болтать в скайпе и тестировать этот код ))). я пока плеер не закрыл, подумал, что программа зависла ). ну и еще студия вечно гребет ресурсы, так что и её лучше закрывать.

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Добавлю, что наличие антивируса/брандмауэра может очень существенно влиять на скорость работы программы. Был случай, когда я Outpost не давал мне возможность загрузится, пока я не отключал сетевой шнурок - проблема была в очень сильной сетевой атаке, когда все ресурсы PC по причине установленного Outpost были отданы на фильтрацию сетевого трафика. Для чистоты проверки требуется полная их деинсталляция (а не отключение).
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн DebalanceАвтор темы

  • ADN Club
  • ****
  • Сообщений: 421
  • Карма: 16
    • Advanced software for AutoCAD
  • Skype: Debalance
В, общем, вопрос торможения консольного приложения (StdVectorTest.exe) на моём компе снят: вся проблема была в открытой студии из которой я (тупо) пытался запустить экзешник. Но вопросы о торможении AutoCAD (в процессе создания-удаления данных в куче) по-прежгему остаются. Кроме того, выяснилось (по крайней мере у меня) что Acad 2015 и Acad 2016 затрачивают разное время на данные операции. Я создал тестовое ARX-приложение (на базе ObjectArx 2015) аналогичное по сути тестовой консольной программе и протестировал его на обоих автокадах. Результат был в какой-то степени неожиданным. Оказалось, что AutoCAD 2016 в разы медленнее выполняет процедуры создания-удаления объектов в куче (cобственно все мои предыдущие эксперименты я осуществлял на этой версии AutoCAD), а AutoCAD 2015 по производительности не уступает консольному приложению.
Привожу листинги испытания на обоих автокадах:

AutoCAD 2015:
Start
================
Time1: <0.156250 seconds>
Time2: <0.093750 seconds>
TotalTime: <0.265625 seconds>
================
End

AutoCAD 2016:
Start
================
Time1: <0.265625 seconds>
Time2: <5.703125 seconds>
TotalTime: <5.968750 seconds>
================
End

Сначала я решил что проблема в ObjectARX 2015. Я пересобрал плагин в 2016-ой версии - результат тот же. И так, вопросы остаются...
Я выкладываю тестовое ARX-приложение и обращаюсь к Сообществу с просьбой потестировать его (желательно) на двух версиях AutoCAD. Приложение StdVectorTest.arx собрано на ObjectARX 2015 для x64 кадов. После загрузки - применить команду VECTORTEST.

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
аналогичное по сути тестовой консольной программе
Аналогичное - это что? Если просишь тестировать - показывай исходник.

AutoCAD 2015:

Command: VECTORTEST
Start
================
Time1: <0.202801 seconds>
Time2: <0.078001 seconds>
TotalTime: <0.280802 seconds>
================
End

AutoCAD 2016:
Command: VECTORTEST
Start
================
Time1: <0.171601 seconds>
Time2: <0.078001 seconds>
TotalTime: <0.249602 seconds>
================
End

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

Оффлайн DebalanceАвтор темы

  • ADN Club
  • ****
  • Сообщений: 421
  • Карма: 16
    • Advanced software for AutoCAD
  • Skype: Debalance
.
Если просишь тестировать - показывай исходник.
Исходник:
Код - C++ [Выбрать]
  1. #include "stdafx.h"
  2. #include <iostream>
  3. #include <string>
  4. #include <sstream>
  5. #include <vector>
  6. #include <list>
  7.  
  8. #include <boost\format.hpp>
  9. #include <boost\foreach.hpp>
  10. #include <boost\timer\timer.hpp>
  11. #include <boost\chrono.hpp>
  12.  
  13. void MyCommand()
  14. {
  15.         acutPrintf(L"\nStart\n================\n");
  16.         std::wstringstream sst;
  17.         boost::timer::cpu_timer Timer1;
  18.         boost::timer::cpu_timer Timer2;
  19.         boost::chrono::duration<double> sec;
  20.  
  21.         typedef std::vector<void*> TestVector;
  22.         TestVector TmpVector;
  23.         TestVector::size_type VectorSize = 5000000;
  24.         TmpVector.reserve(VectorSize);
  25.         for (TestVector::size_type i = 0; i < VectorSize; i++)
  26.         {
  27.                 TmpVector.push_back(new double(0.001));
  28.         }
  29.  
  30.         sec = boost::chrono::nanoseconds(Timer2.elapsed().user);
  31.         sst << boost::wformat(L"\nTime1: <%f seconds>") % sec.count();
  32.         acutPrintf(sst.str().c_str());
  33.         sst.str(L"");
  34.  
  35.         Timer2.stop();
  36.         Timer2.start();
  37.        
  38.         TestVector::iterator TmpIter1 = TmpVector.begin();
  39.         while (TmpIter1 != TmpVector.end())
  40.         {
  41.                 double* tt = (double*) *TmpIter1;
  42.                 delete tt;
  43.                 ++TmpIter1;
  44.         }
  45.         TmpVector.clear();
  46.  
  47.         sec = boost::chrono::nanoseconds(Timer2.elapsed().user);
  48.         sst << boost::wformat(L"\nTime2: <%f seconds>") % sec.count();
  49.         acutPrintf(sst.str().c_str());
  50.         sst.str(L"");
  51.        
  52.         Timer2.stop();
  53.                
  54.         sec = boost::chrono::nanoseconds(Timer1.elapsed().user);
  55.         sst << boost::wformat(L"\nTotalTime: <%f seconds>\n\n================\nEnd") % sec.count();
  56.         acutPrintf(sst.str().c_str());
  57.         sst.str(L"");
  58.         Timer1.stop();
  59. }
  60.  
  61. extern "C" AcRx::AppRetCode
  62. acrxEntryPoint(AcRx::AppMsgCode msg, void* appId)
  63. {
  64.     switch(msg)
  65.     {
  66.         case AcRx::kInitAppMsg:
  67.                 {
  68.                         acrxDynamicLinker->unlockApplication(appId);
  69.                         acrxDynamicLinker->registerAppMDIAware(appId);
  70.                         acedRegCmds->addCommand(L"STDE_VECTOR_TEST", L"_VECTORTEST", L"VECTORTEST", ACRX_CMD_MODAL|ACRX_CMD_USEPICKSET|ACRX_CMD_REDRAW, MyCommand);
  71.                         break;
  72.                 }
  73.     case AcRx::kUnloadAppMsg:
  74.         break;
  75.     default:
  76.         break;
  77.     }
  78.     return AcRx::kRetOK;
  79. }
в принципе могу выложить проект...

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Мне это было нужно чтобы понимать используешь ли ты какие-то вещи из ObjectARX или нет. Глядя на код вижу что нет. Т.е. проблема не в AutoCAD.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Проверил еще на виртуальной машине, которой выделено 4Гб RAM:

AutoCAD Architecture 2016:

Команда: VECTORTEST
Start
================
Time1: <2.184014 seconds>
Time2: <0.078001 seconds>
TotalTime: <2.262014 seconds>
================
End

AutoCAD Civil 3D 2016 (несколько раз подряд):

Команда: appload StdVectorTest.arx успешно загружено.
Команда: VECTORTEST
Start
================
Time1: <0.234002 seconds>
Time2: <0.078001 seconds>
TotalTime: <0.312002 seconds>
================
End
Команда: VECTORTEST
Start
================
Time1: <0.218401 seconds>
Time2: <0.078001 seconds>
TotalTime: <0.296402 seconds>
================
End
Команда: VECTORTEST
Start
================
Time1: <0.140401 seconds>
Time2: <0.078001 seconds>
TotalTime: <0.218401 seconds>
================
End
Команда: VECTORTEST
Start
================
Time1: <0.202801 seconds>
Time2: <0.078001 seconds>
TotalTime: <0.296402 seconds>
================
End

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

Оффлайн DebalanceАвтор темы

  • ADN Club
  • ****
  • Сообщений: 421
  • Карма: 16
    • Advanced software for AutoCAD
  • Skype: Debalance
NO COMMENTS!
Мда-а-а... Честно, устал бороться с флуктуациями в 2016-ом каде...
Может сервайс-пак у меня как-то криво стоит?

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Мда-а-а... Честно, устал бороться с флуктуациями в 2016-ом каде...
Может сервайс-пак у меня как-то криво стоит?
Не думаю. У тебя скорее проблема с Windows / Hardware, чем с AutoCAD - ты не используешь в этом коде из AutoCAD ничего...
Это видно из раздела импорта твоего arx-файла.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Николай Горлов

  • ADN
  • *
  • Сообщений: 238
  • Карма: 34
вангую ))) с железом всё в порядке.
просто что-то гребет на себя ресурсы, как делало и раньше, но с очередным онлайн обновлением начало это делать более агрессивно. антивирус, например, или еще что-то висящее в процессах. как иначе можно еще объяснить 50%-60% разницу по времени выполнения одного и того же кода при повторении его несколько раз?

AutoCAD Civil 3D 2016 (несколько раз подряд):

Код: [Выделить]
Команда: appload StdVectorTest.arx успешно загружено.
Команда: VECTORTEST
Start
================
Time1: <0.234002 seconds>
Time2: <0.078001 seconds>
TotalTime: <0.312002 seconds>
================
End
Команда: VECTORTEST
Start
================
Time1: <0.218401 seconds>
Time2: <0.078001 seconds>
TotalTime: <0.296402 seconds>
================
End
Команда: VECTORTEST
Start
================
Time1: <0.140401 seconds>
Time2: <0.078001 seconds>
TotalTime: <0.218401 seconds>
================
End
Команда: VECTORTEST
Start
================
Time1: <0.202801 seconds>
Time2: <0.078001 seconds>
TotalTime: <0.296402 seconds>
================
End

я так подозреваю, что автокад еще толком не догрузился, когда вы запустили команду. ну или активной был другая программа.
было б интересно посмотреть статистику хотя б 3-4 запускам подряд.

AutoCAD Architecture 2016:

Код: [Выделить]
Команда: VECTORTEST
Start
================
Time1: <2.184014 seconds>
Time2: <0.078001 seconds>
TotalTime: <2.262014 seconds>
================
End

PS: а если процессу акада принудительно в диспетчере повысить приоритет, будет ли уменьшаться время обработки?

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
я так подозреваю, что автокад еще толком не догрузился, когда вы запустили команду. ну или активной был другая программа.
было б интересно посмотреть статистику хотя б 3-4 запускам подряд.
У меня это всё на виртуальной машине. AutoCAD загрузился. Других активных программ нет (ни антивирусов, ни брандмауэров). Но памяти маловато. Думаю что измерять нужно процессорное время. Хотя разброс времени и останется, он будет значительно меньше.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн DebalanceАвтор темы

  • ADN Club
  • ****
  • Сообщений: 421
  • Карма: 16
    • Advanced software for AutoCAD
  • Skype: Debalance
У тебя скорее проблема с Windows / Hardware
Ну тогда было бы трудно объяснить, почему в AutoCAD 2015 производительность той-же самой программы не падает. У меня создается впечатление что в 2016-ом каде болтается что-то такое что тормозит процесс, хотя в целом невидно чтобы он как-то тормозил..
Может есть какие-нибудь специальные тестовые плагины для AutoCAD?

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
PS: а если процессу акада принудительно в диспетчере повысить приоритет, будет ли уменьшаться время обработки?
Процессорное - нет, а общее время - вполне возможно. Но это нужно экспериментировать на реальной машине, а не на виртуальной.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
У меня создается впечатление что в 2016-ом каде болтается что-то такое что тормозит процесс, хотя в целом невидно чтобы он как-то тормозил..
Убедись, что перед запуском твоего приложения AutoCAD использует 0% CPU.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение