Сообщество программистов Autodesk в СНГ

ADN Club => ObjectARX => Тема начата: Debalance от 20-01-2016, 10:09:59

Название: Странные проблемы с производительностью.
Отправлено: Debalance от 20-01-2016, 10:09:59
Тестирую приложение на базе ObjectARX 2015 в Acad 2016. Собственно программа производит некие геометрические построения, предварительно осуществляя математические вычисления. Вдруг выяснилась некая странная особенность: на этапе выполнения математических вычислений при тестировании на машинах с разной конфигурацией программа затрачивает разное время. Самое непонятное для меня это то, что, например, на машине с более мощным камнем и бОльшим объёмом RAM вычисления выполняются существенно дольше чем на компе с более простой конфигурацией. Если оперировать абсолютными цифрами, то имеем следующее:

Комп1: Core i5-4690, RAM 8Гб - время 3 с.
Комп2: Core i5-6600, RAM 32Гб - время 21 с.

Получается в конкретном случае отличие производительности в семь раз!
Что за хрень!
Для меня очевидно, что дело не железе, но в чём ещё? Может кто сталкивался с подобной проблемой?
Название: Re: Странные проблемы с производительностью.
Отправлено: Дима_ от 20-01-2016, 14:09:50
Кофейную гущу покажите.
Название: Re: Странные проблемы с производительностью.
Отправлено: Debalance от 20-01-2016, 14:30:33
Кофейную гущу покажите.
К сожалению это не возможно. Пытаюсь копать в сторону реализованной многопоточности (основные вычисления реализованы в отдельном потоке)...
Название: Re: Странные проблемы с производительностью.
Отправлено: Александр Ривилис от 20-01-2016, 15:06:15
Если оперировать абсолютными цифрами, то имеем следующее:
Абсолютные цифры - не показатель. Сравнивать нужно усреднённые по нескольким измерениям цифры использованного процессорного времени. А причин по которым такое происходит может быть масса.
1) Разная разрядность Windows/AutoCAD
2) Разные версии Windows
3) Разные входные данные
4) Разный двоичный код arx (например, Debug/Release)
5) Наличие различных антивирусов, которые активно мониторят систему.
6) Наличие параллельных процессов, отнимающих кванты процессорного времени.
7) Обращение к AutoCAD для того, чтобы дать ему возможность реагировать на мышь и т.д., перерисовать индикатор прогресса.
Последний пункт может в десятки раз уменьшить скорость обработки.
Потом непонятно что имеется в виду под математическими вычислениями, используются ли средства ObjectARX в этом расчете...
Название: Re: Странные проблемы с производительностью.
Отправлено: Debalance от 22-01-2016, 09:57:56
Цитировать
Сравнивать нужно усреднённые по нескольким измерениям цифры...
Не понял, какие цифры я должен сравнивать? А главное, зачем? Если я вижу реальную многократную разницу во времени...
Цитировать
1) Разная разрядность Windows/AutoCAD
Везде x64.
Цитировать
2) Разные версии Windows
Комп 1: Win 10, Комп 2: Win 8.1.
Цитировать
3) Разные входные данные
Тестирование осуществлялось на одном и том же чертеже.
Цитировать
4) Разный двоичный код arx (например, Debug/Release)
Release в обоих случаях.
Цитировать
5) Наличие различных антивирусов, которые активно мониторят систему.
Деактивировал антивирус - то же что и в валенках.
Цитировать
6) Наличие параллельных процессов, отнимающих кванты процессорного времени.
Кроме запущенного AutoCAD - более ничего.
Цитировать
7) Обращение к AutoCAD для того, чтобы дать ему возможность реагировать на мышь и т.д., перерисовать индикатор прогресса. Последний пункт может в десятки раз уменьшить скорость обработки.
Оптимизировал проект и создал тестовый вариант: без диалоговых окон (прогресс-баров и т.п.), аннулировал многопоточность; мышь при запуске не трогал - результат тот же.
Цитировать
Потом непонятно что имеется в виду под математическими вычислениями, используются ли средства ObjectARX в этом расчете...
Проект создан без использования MFC. Основная математика реализована на манипуляциях с данными в stl-контейнерах с небольшим вкраплением бустового функционала. Также используется геометрия AcGe-классов.
Название: Re: Странные проблемы с производительностью.
Отправлено: Александр Ривилис от 22-01-2016, 14:37:34
Для меня очевидно, что дело не железе, но в чём ещё?
Итак одни и теже машинные коды выполняются на разных машинах. Соотвественно в первую очередь это вопрос железа. Во вторую очередь часть процессорного времени на себя отбирает система. Кстати, время ты засекаешь с момента начала сканирования чертежа? Если да, то возможно еще и вопрос быстродействия винчестера. Если в это время попадает еще и вывод на экран результатов (добавление примитивов), то возможно роль играет и видеокарта. Короче говоря вариантов масса и искать причину тебе.
Я бы порекомендовал измерять процессорное (именно процессорное) время на отдельных этапах работы программы и сравнивал их на двух машинах. Может что-то и выплывет.
Кстати, а версии AutoCAD и SP одинаковые?
Название: Re: Странные проблемы с производительностью.
Отправлено: Debalance от 22-01-2016, 14:57:28
Кстати, а версии AutoCAD и SP одинаковые?
Да, всё идентичное. Попробую проанализировать бенчмарк железа...
Название: Re: Странные проблемы с производительностью.
Отправлено: Александр Ривилис от 22-01-2016, 15:05:50
Меня честно говоря тоже очень удивляет разница в производительности в 7 раз. Ну в два раза еще куда ни шло...
Название: Re: Странные проблемы с производительностью.
Отправлено: Дима_ от 22-01-2016, 21:50:32
Так все-же есть конкретный кусок кода который на тестовых данных дает семикратную разницу, или это только при общем замере?
Название: Re: Странные проблемы с производительностью.
Отправлено: Debalance от 23-01-2016, 17:21:28
В общем мне удалось локализовать проблему, но она из разряда необъяснимых флуктуаций.
После сравнительного анализа комплексной производительности двух компов, который показал 25%-ое превосходство Компа 2 над Компом 1, я стал тестировать в режиме отладки отдельные участки кода на их быстродействие. Основным предметом моего исследования стали stl-контейнеры, которые я заполнял различными типами данных. Вскоре выяснилась странность в поведении вот такого вектора: std::vector<void*>, который как раз и давал примерно семикратную задержку во времени в момент последовательного его заполнения. Привожу свой тестовый код:
Код - C++ [Выбрать]
  1. boost::timer::cpu_timer Timer1;
  2.  
  3. typedef std::vector<void*> TestVector;
  4. const TestVector::size_type VectorSize = 5000000;
  5.  
  6. TestVector TmpVector;
  7. TmpVector.reserve(VectorSize);
  8. for (TestVector::size_type i = 0; i < VectorSize; i++)
  9. {
  10.         TmpVector.push_back(new double(0.001));
  11. }
  12.  
  13. // Очистка контейнера
  14. BOOST_FOREACH(const TestVector::value_type &TmpVal, TmpVector)
  15. {
  16.         double* tt = (double*) TmpVal;
  17.         delete tt;
  18. }
  19. TmpVector.clear();
  20.  
  21. boost::chrono::duration<double> sec;
  22. sec = boost::chrono::nanoseconds(Timer1.elapsed().user);
  23. Timer1.stop();
  24.  
  25. std::stringstream sst;
  26. sst << boost::format("\nTime: <%f>") % sec.count();
  27. OutputDebugStringA(sst.str().c_str());
В программе я использовал данный тип контейнера как универсальный инструмент для хранения указателей различных типов объектов. И вот, стоит только в этом тестовом коде заменить std::vector<void*> на std::vector<double*> как он начинает выполняться без задержек и укладывается в 0,32 с, в то время как в исходном состоянии этот код на данной машине выполнялся за 2,4 с.
Хочу ещё раз отметить, что такая проблема появилась на этом компе вдруг и совершенно внезапно: раньше всё работало безупречно. Кроме того, я протестировал работу программы ещё на нескольких машинах, включая довольно слабые ноутбуки - везде всё работает без задержек. И ещё, некоторые пользователи конкретно этой программы (по моей просьбе) сообщали мне информацию о её быстродействии. И среди этих сообщений были и такие, в которых время выполнения многократно не совпадало с ожидаемым. Поэтому в какой-то степени я рад, что эта флуктуация произошла на доступной для меня машине.
Название: Re: Странные проблемы с производительностью.
Отправлено: Александр Ривилис от 23-01-2016, 18:23:52
Вскоре выяснилась странность в поведении вот такого вектора: std::vector<void*>, который как раз и давал примерно семикратную задержку во времени в момент последовательного его заполнения.
Могу предположить в чем причина. Тип данных (double *) по умолчанию указывает на границу двойного слова, тип (void *) на границу байта. Таким образом все операции требуют промежуточного перемещения данных на границу двойного слова. Как-то так. Впрочем, думаю что опциями компилятора можно было бы избавится от этой задержки, но могли бы возникнуть побочные эффекты.
Название: Re: Странные проблемы с производительностью.
Отправлено: Дима_ от 24-01-2016, 03:37:39
Я полагаю что дело "в глубинных" настройках системы выделения памяти (ее фрагментации) - TmpVector.push_back(new double(0.001)) в зависимости от типа контейнера либо кладет значение в уже подготовленный "реверсом" непрерывный кусок памяти, либо кладет туда-же ссылку на объект - но под сами объекты память не готовилась и видимо для 5000000 точно потребуется несколько "переносов".
Название: Re: Странные проблемы с производительностью.
Отправлено: Debalance от 25-01-2016, 14:01:37
Тема получила продолжение. Указанная выше проблема стала проявляться на Компе1. Опять же возникла она вдруг, чисто при работе над проектом. Теперь я решил потестировать работу со списками (std::list<>). Причем не важно какие данные я там храню (void*, double*, double, char) - тормозит конкретно, как при выполнении push_back, так и при выделении памяти в конструкторе контейнера.
Может действительно какие-то настройки линкера надо подкрутить?
Название: Re: Странные проблемы с производительностью.
Отправлено: Александр Ривилис от 25-01-2016, 18:36:04
1. Убедись, что используешь все системные библиотеки в Release и именно те, которые из VC 2012 Update 4 - если у тебя установлен Update 5 - могут быть проблемы.
2. Тестировать производительность в Debug не имеет смысла
3. Попробуй с опцией компилятора /Zp8 и /Zp16 : https://msdn.microsoft.com/en-us/library/xh3e3fd0.aspx
4. Посмотри не используется ли файл подкачки при выделении памяти.
тормозит конкретно, как при выполнении push_back
Ну тут вероятно выделяется память если ты используешь new double(...) и т.п.

так и при выделении памяти в конструкторе контейнера.
А вот это я не понял. В коде у тебя пустой конструктор. Или ты имеешь в виду вот это:
Код - C++ [Выбрать]
  1. TmpVector.reserve(VectorSize);
Ну тогда тут тоже выделение большого куска непрерывной памяти.

Название: Re: Странные проблемы с производительностью.
Отправлено: Александр Ривилис от 25-01-2016, 19:53:21
Кстати, похоже v.reserve() + v.push_back() в цикле не эффективно:
http://lemire.me/blog/2012/06/20/do-not-waste-time-with-stl-vectors/
Название: Re: Странные проблемы с производительностью.
Отправлено: Debalance от 26-01-2016, 10:22:35
1. У меня установлен только Update 4.
2. Тестировал в Release и Debug.
3. Последовательно пробовал с указанными Вами опциями компиляции - результат тот же.
4. Файл подкачки в момент выделения памяти не используется. Собственно говоря задержка пропорциональна размеру контейнера (даже в случае его уменьшения).

А вот это я не понял. В коде у тебя пустой конструктор.
В предыдущем посте (я писал об этом) я развлекался с std::list<>. Я пробовал заполнять список по разному, в том числе так:
typedef std::list<char> TestList;
const TestList::size_type ListSize = 5000000;
TestList TmpList(ListSize, 1);
Ощутимой разницы с push_back нет.

В общем какой-то ступор...  >:(.
Название: Re: Странные проблемы с производительностью.
Отправлено: Debalance от 26-01-2016, 10:30:53
Кстати, похоже v.reserve() + v.push_back() в цикле не эффективно:
http://lemire.me/blog/2012/06/20/do-not-waste-time-with-stl-vectors/
Я внимательно прочитал указанную Вами статью и, честно говоря, не понял, почему Вы говорите о неэффективности использования связки v.reserve() + v.push_back()? Наоборот, автор говорит:
Цитировать
It is likely to be slightly faster...
И кстати данные в таблице красноречиво говорят как раз об эффективности этой связки.
Название: Re: Странные проблемы с производительностью.
Отправлено: Александр Ривилис от 26-01-2016, 10:38:53
И кстати данные в таблице красноречиво говорят как раз об эффективности этой связки.
Если посмотреть в таблицу, то самый эффективный вариант с new, второй с конструктором и без push_back.
Название: Re: Странные проблемы с производительностью.
Отправлено: Debalance от 26-01-2016, 10:45:40
Если посмотреть в таблицу, то самый эффективный вариант с new, второй с конструктором и без push_back.
Ну да. Я имел ввиду v.push_back vs v.reserve() + v.push_back().
Название: Re: Странные проблемы с производительностью.
Отправлено: Александр Ривилис от 26-01-2016, 15:42:21
1) Ты проводил тестирование в том же проекте, в котором в начале возникла проблема с производительностью или создал новый для тестирования?
2) Если ты создал новый, то проверяешь как приложение внутри AutoCAD или сделал отдельный exe-файл и в нём замеряешь производительность.
3) Что касается std:list<> то тут добавляются еще поля ссылающиеся на предыдущий и последующий элемент списка. Так что дополнительный расход памяти. Думаю, что всё-таки std::vector был бы оптимальнее.
Название: Re: Странные проблемы с производительностью.
Отправлено: Debalance от 26-01-2016, 16:25:56
Сначала я проверял в проекте, потом создал простенький консольный проект в MSVS 2012 Express, потом я создал такой же проект в MSVS 2010 - результат одинаков. Вот исходник тестового проектика:
Код - C++ [Выбрать]
  1. #include "stdafx.h"
  2. #include <iostream>
  3. #include <string>
  4. #include <sstream>
  5. #include <vector>
  6.  
  7. #include <boost\format.hpp>
  8. #include <boost\foreach.hpp>
  9. #include <boost\timer\timer.hpp>
  10. #include <boost\chrono.hpp>
  11.  
  12. int _tmain(int argc, _TCHAR* argv[])
  13. {
  14.         std::printf("\nStart\n================\n");
  15.         std::stringstream sst;
  16.         boost::timer::cpu_timer Timer1;
  17.         boost::timer::cpu_timer Timer2;
  18.         boost::chrono::duration<double> sec;
  19.  
  20.         typedef std::vector<void*> TestVector;
  21.         TestVector TmpVector;
  22.         TestVector::size_type VectorSize = 5000000;
  23.         TmpVector.reserve(VectorSize);
  24.         for (TestVector::size_type i = 0; i < VectorSize; i++)
  25.         {
  26.                 TmpVector.push_back(new double(0.001));
  27.         }
  28.  
  29.         sec = boost::chrono::nanoseconds(Timer2.elapsed().user);
  30.         sst << boost::format("\nTime1: <%f seconds>") % sec.count();
  31.         std::printf(sst.str().c_str());
  32.         sst.str("");
  33.  
  34.         Timer2.stop();
  35.         Timer2.start();
  36.        
  37.         TestVector::iterator TmpIter1 = TmpVector.begin();
  38.         while (TmpIter1 != TmpVector.end())
  39.         {
  40.                 double* tt = (double*) *TmpIter1;
  41.                 delete tt;
  42.                 ++TmpIter1;
  43.         }
  44.         TmpVector.clear();
  45.  
  46.         sec = boost::chrono::nanoseconds(Timer2.elapsed().user);
  47.         sst << boost::format("\nTime2: <%f seconds>") % sec.count();
  48.         std::printf(sst.str().c_str());
  49.         sst.str("");
  50.        
  51.         Timer2.stop();
  52.                
  53.         sec = boost::chrono::nanoseconds(Timer1.elapsed().user);
  54.         sst << boost::format("\nTotalTime: <%f seconds>\n\n================\nEnd. Press any key...") % sec.count();
  55.         std::printf(sst.str().c_str());
  56.         sst.str("");
  57.         Timer1.stop();
  58.  
  59.         getwchar();
  60.         return 0;
  61. }
  62.  
В программе контролируется 3 времени:
1. Время наполнения вектора.
2. Время удаления данных из вектора.
3. Суммарное время.
Я прикладываю к посту экзешник (MSVS 2012) - интересно, что будет у Вас. Свои результаты я тоже прикрепляю.
Название: Re: Странные проблемы с производительностью.
Отправлено: Александр Ривилис от 26-01-2016, 16:33:43
(https://adn-cis.org/forum/proxy.php?request=http%3A%2F%2Fimg-fotki.yandex.ru%2Fget%2F64354%2F7842324.5%2F0_116e51_bce0e1f1_orig.png&hash=fa937ee822083ea2b8196945b37b93e8)

P.S.: Не заставляй меня напоминать как следует на нашем форуме форматировать код.
Название: Re: Странные проблемы с производительностью.
Отправлено: Дима_ от 26-01-2016, 16:48:51
Ноутбук:

Start
================

Time1: <0.390625 seconds>
Time2: <0.187500 seconds>
TotalTime: <0.578125 seconds>

================
End. Press any key...
Название: Re: Странные проблемы с производительностью.
Отправлено: Александр Ривилис от 26-01-2016, 16:53:20
Свои результаты я тоже прикрепляю.
У меня такое чувство, что выполнял ты не этот exe-файл. Не могу поверить что разница в 1000 раз. У меня I7 не помню какой, и 8Гб RAM.
Название: Re: Странные проблемы с производительностью.
Отправлено: Андрей Бушман от 26-01-2016, 17:07:50
Нотик:
Цитировать
Start
================

Time1: <0.328125 seconds>
Time2: <0.140625 seconds>
TotalTime: <0.468750 seconds>

================
End. Press any key...
Название: Re: Странные проблемы с производительностью.
Отправлено: Debalance от 26-01-2016, 18:38:12
У меня такое чувство, что выполнял ты не этот exe-файл. Не могу поверить что разница в 1000 раз. У меня I7 не помню какой, и 8Гб RAM.
В том то всё и дело, что этот... Наблюдаю это уже на второй машине. Ещё раз повторю - проблема, то появляется, то исчезает как-то вдруг (кстати на первой машине с которой я начинал топик теперь снова всё работает так же прекрасно уже дня два, хотя я не предпринимал никаких усилий). Ещё раз повторюсь - указанная странность наблюдалась не только у меня.

Все откликнувшимся спасибо за тестирование!
Название: Re: Странные проблемы с производительностью.
Отправлено: Александр Ривилис от 26-01-2016, 18:45:43
Тогда в порядке бреда:
1) одно из ядер процессора бракованное.
2) таки в дело включается дисковая виртуальная память.
Название: Re: Странные проблемы с производительностью.
Отправлено: Debalance от 26-01-2016, 18:55:49
1) одно из ядер процессора бракованное.
Ну тогда бы тормозило всё - а этого не наблюдается. Плюс если я реализую конструкцию вот так std::vector<double> - то тоже всё заполняется мгновенно. Плюс проводил анализ бенчмарка - все показатели в норме.
2) таки в дело включается дисковая виртуальная память.
Смотрел в диспетчере задач (в процессе ожидания окончания работы программы) - 0% использования диска.
Название: Re: Странные проблемы с производительностью.
Отправлено: Андрей Бушман от 26-01-2016, 19:00:59
Думаю, что получить ответ на обозначенный вопрос более вероятным будет здесь (http://stackoverflow.com/).
Название: Re: Странные проблемы с производительностью.
Отправлено: Дмитрий Загорулькин от 26-01-2016, 20:12:58
Стационарный: i5-2500K, ОЗУ - 16Гб, Windows 7 Pro
Start
================

Time1: <0.218401 seconds>
Time2: <0.093601 seconds>
TotalTime: <0.312002 seconds>

================
End. Press any key...

Ноутбук: i7-2670QM ОЗУ 4 Гб, Win 7 Home Basic

Start
================

Time1: <0.561604 seconds>
Time2: <0.280802 seconds>
TotalTime: <0.842405 seconds>

================
End. Press any key...
Название: Re: Странные проблемы с производительностью.
Отправлено: Дима_ от 26-01-2016, 23:33:07
Смотрел, смотрел на код - и у меня бредовый вопрос к знатокам C++ - а не может-ли меняться size_type после reserve - если это так - то количество итераций в коде автора как раз таки возрастет на порядки (запомнили в VectorSize мы его как Int32, а "крутим" как Int64 например) - автору - добавьте после всех push'ей вывод в консоль TmpVector.size - сразу увидим.
p.s. - пожалуй не досмотрел - size_type - это-ж не у объекта, а у класса.
Название: Re: Странные проблемы с производительностью.
Отправлено: Николай Горлов от 27-01-2016, 11:44:15
вставлю свои 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: ну и от себя добавлю, если тестирование проводить на "загруженном" компьютере, то результат может быть непредсказуемым. Например, одновременно играть в сапера, слушать музыку, болтать в скайпе и тестировать этот код ))). я пока плеер не закрыл, подумал, что программа зависла ). ну и еще студия вечно гребет ресурсы, так что и её лучше закрывать.
Название: Re: Странные проблемы с производительностью.
Отправлено: Александр Ривилис от 27-01-2016, 13:22:02
Добавлю, что наличие антивируса/брандмауэра может очень существенно влиять на скорость работы программы. Был случай, когда я Outpost не давал мне возможность загрузится, пока я не отключал сетевой шнурок - проблема была в очень сильной сетевой атаке, когда все ресурсы PC по причине установленного Outpost были отданы на фильтрацию сетевого трафика. Для чистоты проверки требуется полная их деинсталляция (а не отключение).
Название: Re: Странные проблемы с производительностью.
Отправлено: Debalance от 28-01-2016, 13:50:59
В, общем, вопрос торможения консольного приложения (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.
Название: Re: Странные проблемы с производительностью.
Отправлено: Александр Ривилис от 28-01-2016, 14:17:15
аналогичное по сути тестовой консольной программе
Аналогичное - это что? Если просишь тестировать - показывай исходник.

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

Что-то у тебя снова не то...
Название: Re: Странные проблемы с производительностью.
Отправлено: Debalance от 28-01-2016, 14:26:37
.
Если просишь тестировать - показывай исходник.
Исходник:
Код - 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. }
в принципе могу выложить проект...
Название: Re: Странные проблемы с производительностью.
Отправлено: Александр Ривилис от 28-01-2016, 14:46:32
Мне это было нужно чтобы понимать используешь ли ты какие-то вещи из ObjectARX или нет. Глядя на код вижу что нет. Т.е. проблема не в AutoCAD.
Название: Re: Странные проблемы с производительностью.
Отправлено: Александр Ривилис от 28-01-2016, 14:53:32
Проверил еще на виртуальной машине, которой выделено 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!
Название: Re: Странные проблемы с производительностью.
Отправлено: Debalance от 28-01-2016, 15:00:51
NO COMMENTS!
Мда-а-а... Честно, устал бороться с флуктуациями в 2016-ом каде...
Может сервайс-пак у меня как-то криво стоит?
Название: Re: Странные проблемы с производительностью.
Отправлено: Александр Ривилис от 28-01-2016, 15:04:30
Мда-а-а... Честно, устал бороться с флуктуациями в 2016-ом каде...
Может сервайс-пак у меня как-то криво стоит?
Не думаю. У тебя скорее проблема с Windows / Hardware, чем с AutoCAD - ты не используешь в этом коде из AutoCAD ничего...
Это видно из раздела импорта твоего arx-файла.
Название: Re: Странные проблемы с производительностью.
Отправлено: Николай Горлов от 28-01-2016, 15:34:43
вангую ))) с железом всё в порядке.
просто что-то гребет на себя ресурсы, как делало и раньше, но с очередным онлайн обновлением начало это делать более агрессивно. антивирус, например, или еще что-то висящее в процессах. как иначе можно еще объяснить 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: а если процессу акада принудительно в диспетчере повысить приоритет, будет ли уменьшаться время обработки?
Название: Re: Странные проблемы с производительностью.
Отправлено: Александр Ривилис от 28-01-2016, 15:54:27
я так подозреваю, что автокад еще толком не догрузился, когда вы запустили команду. ну или активной был другая программа.
было б интересно посмотреть статистику хотя б 3-4 запускам подряд.
У меня это всё на виртуальной машине. AutoCAD загрузился. Других активных программ нет (ни антивирусов, ни брандмауэров). Но памяти маловато. Думаю что измерять нужно процессорное время. Хотя разброс времени и останется, он будет значительно меньше.
Название: Re: Странные проблемы с производительностью.
Отправлено: Debalance от 28-01-2016, 15:55:23
У тебя скорее проблема с Windows / Hardware
Ну тогда было бы трудно объяснить, почему в AutoCAD 2015 производительность той-же самой программы не падает. У меня создается впечатление что в 2016-ом каде болтается что-то такое что тормозит процесс, хотя в целом невидно чтобы он как-то тормозил..
Может есть какие-нибудь специальные тестовые плагины для AutoCAD?
Название: Re: Странные проблемы с производительностью.
Отправлено: Александр Ривилис от 28-01-2016, 15:56:05
PS: а если процессу акада принудительно в диспетчере повысить приоритет, будет ли уменьшаться время обработки?
Процессорное - нет, а общее время - вполне возможно. Но это нужно экспериментировать на реальной машине, а не на виртуальной.
Название: Re: Странные проблемы с производительностью.
Отправлено: Александр Ривилис от 28-01-2016, 15:57:40
У меня создается впечатление что в 2016-ом каде болтается что-то такое что тормозит процесс, хотя в целом невидно чтобы он как-то тормозил..
Убедись, что перед запуском твоего приложения AutoCAD использует 0% CPU.
Название: Re: Странные проблемы с производительностью.
Отправлено: Debalance от 28-01-2016, 16:09:39
Убедись, что перед запуском твоего приложения AutoCAD использует 0% CPU.
Ну да, так и есть.
Название: Re: Странные проблемы с производительностью.
Отправлено: Александр Ривилис от 28-01-2016, 16:21:36
Выложи полностью проект. Может там что-то не то...
Название: Re: Странные проблемы с производительностью.
Отправлено: Debalance от 28-01-2016, 16:24:55
Вот он.
Название: Re: Странные проблемы с производительностью.
Отправлено: Александр Ривилис от 28-01-2016, 16:41:27
На первый взгляд я ничего криминального не увидел, но было бы лучше если бы ты сделал проект при помощи ObjectARX Wizard - меньше вероятность того, что какая-то из опций компилятора/линкера не правильна.
Ну и MS VS Express - это не тот инструмент, который следует использовать для создания arx-приложений.
Название: Re: Странные проблемы с производительностью.
Отправлено: Debalance от 28-01-2016, 18:46:06
Ну и MS VS Express - это не тот инструмент...
А чем он плох? Для простых приложений (класса "Хеллоу ворлд") где не требуется MFC и прочие премудрости - он очень даже ничего... Кроме того есть вполне официальный документ (http://docs.autodesk.com/ACDMAC/2015/ENU/Mac_Lightsaber_Dev_Help/Developer%20Guide/index.html?url=files/GUID-696C5565-D4F3-459A-B8AB-CA4D8736533A.htm,topicNumber=d30e2321), которым можно смело руководствоваться при создании приложений (в нём визард рассматривается всего лишь как альтернатива). Так что всё законно ))).
Название: Re: Странные проблемы с производительностью.
Отправлено: Александр Ривилис от 28-01-2016, 22:24:21
А чем он плох?
Насколько я понимаю он не допускает оптимизации кода. Возможно это не все его недостатки.
Кроме того есть вполне официальный документ, которым можно смело руководствоваться при создании приложений (в нём визард рассматривается всего лишь как альтернатива). Так что всё законно ))).
Документ явно устаревший. Обрати внимание на упоминание в нём acdb18.lib. Т.е. это соотвествует максимум ObjectARX 2012 и Visual Studio 2008.
Визард действительно лишь альтернатива, но с каждым годом требуется следить за большим и большим числом опций компилятора/линкера и это становится очень затруднительным.
Название: Re: Странные проблемы с производительностью.
Отправлено: Александр Ривилис от 29-01-2016, 00:50:27
Я убрал из кода boost, создал новый проект при помощи ObjectARX Wizard и приготовил для тебя StdVectorTest-x64.arx с командой Vector_Test
Попробуй.
Мои результаты:
Command: APPLOAD
StdVectorTest-x64.arx successfully loaded.
Command: VECTOR_TEST
Time1: <202.801300 milliseconds>
Time2: <93.600600 milliseconds>
Command: VECTOR_TEST
Time1: <187.201200 milliseconds>
Time2: <78.000500 milliseconds>
Command: VECTOR_TEST
Time1: <171.601100 milliseconds>
Time2: <93.600600 milliseconds>
Command: VECTOR_TEST
Time1: <187.201200 milliseconds>
Time2: <62.400400 milliseconds>
Command: VECTOR_TEST
Time1: <187.201200 milliseconds>
Time2: <93.600600 milliseconds>
Command: VECTOR_TEST
Time1: <218.401400 milliseconds>
Time2: <93.600600 milliseconds>
Command: VECTOR_TEST
Time1: <202.801300 milliseconds>
Time2: <78.000500 milliseconds>
Command: VECTOR_TEST
Time1: <202.801300 milliseconds>
Time2: <78.000500 milliseconds>
Command: VECTOR_TEST
Time1: <218.401400 milliseconds>
Time2: <78.000500 milliseconds>
Command: VECTOR_TEST
Time1: <187.201200 milliseconds>
Time2: <93.600600 milliseconds>
Command: VECTOR_TEST
Time1: <202.801300 milliseconds>
Time2: <78.000500 milliseconds>
Код измеряет пользовательское время текущей Thread в операции создания/заполнения и удаления объектов контейнера.
Название: Re: Странные проблемы с производительностью.
Отправлено: Debalance от 29-01-2016, 10:36:29
Запустил, протестировал. Попрежнему разница существенная между 2015 и 2016, особенно при удалении:

AutoCAD 2015:
Command: APPLOAD
StdVectorTest-x64.arx successfully loaded.
Command: VECTOR_TEST
Time1: <140.625000 milliseconds>
Time2: <93.750000 milliseconds>
Command:
VECTOR_TEST
Time1: <109.375000 milliseconds>
Time2: <109.375000 milliseconds>

AutoCAD 2016:
Command: APPLOAD
StdVectorTest-x64.arx successfully loaded.
Command: VECTOR_TEST
Time1: <312.500000 milliseconds>
Time2: <5890.625000 milliseconds>
Command:
VECTOR_TEST
Time1: <296.875000 milliseconds>
Time2: <5906.250000 milliseconds>
Название: Re: Странные проблемы с производительностью.
Отправлено: Александр Ривилис от 29-01-2016, 13:41:40
У меня идеи закончились. Разве что у тебя внутри AutoCAD 2016 подменён обработчик set_new_handler (https://msdn.microsoft.com/ru-ru/library/5fath9te.aspx). Кто и как это сделал для меня секрет.
Название: Re: Странные проблемы с производительностью.
Отправлено: Debalance от 29-01-2016, 14:22:32
У меня идеи закончились.
У меня тоже закончились вместе с терпением ковырять эту проблему дальше... Тем не менее спасибо за поддержку.
Название: Re: Странные проблемы с производительностью.
Отправлено: Александр Ривилис от 29-11-2016, 17:39:11
Кажется появилась новая идея в связи с копанием с вот этой темой: http://adn-cis.org/forum/index.php?topic=7477.msg23674#new
Посмотри в сторону обновлений VS 2015. Похоже Update 2 что-то там серьезно меняет в STL:  https://blogs.msdn.microsoft.com/vcblog/2016/04/14/stl-fixes-in-vs-2015-update-2/

Ooops!!! Я промахнулся. Это же  2016 и VS 2012...