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

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

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

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

  • ADN Club
  • ****
  • Сообщений: 421
  • Карма: 16
    • Advanced software for AutoCAD
  • Skype: Debalance
Тестирую приложение на базе ObjectARX 2015 в Acad 2016. Собственно программа производит некие геометрические построения, предварительно осуществляя математические вычисления. Вдруг выяснилась некая странная особенность: на этапе выполнения математических вычислений при тестировании на машинах с разной конфигурацией программа затрачивает разное время. Самое непонятное для меня это то, что, например, на машине с более мощным камнем и бОльшим объёмом RAM вычисления выполняются существенно дольше чем на компе с более простой конфигурацией. Если оперировать абсолютными цифрами, то имеем следующее:

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

Получается в конкретном случае отличие производительности в семь раз!
Что за хрень!
Для меня очевидно, что дело не железе, но в чём ещё? Может кто сталкивался с подобной проблемой?

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

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Кофейную гущу покажите.

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

  • ADN Club
  • ****
  • Сообщений: 421
  • Карма: 16
    • Advanced software for AutoCAD
  • Skype: Debalance
Кофейную гущу покажите.
К сожалению это не возможно. Пытаюсь копать в сторону реализованной многопоточности (основные вычисления реализованы в отдельном потоке)...

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

  • Administrator
  • *****
  • Сообщений: 13832
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Если оперировать абсолютными цифрами, то имеем следующее:
Абсолютные цифры - не показатель. Сравнивать нужно усреднённые по нескольким измерениям цифры использованного процессорного времени. А причин по которым такое происходит может быть масса.
1) Разная разрядность Windows/AutoCAD
2) Разные версии Windows
3) Разные входные данные
4) Разный двоичный код arx (например, Debug/Release)
5) Наличие различных антивирусов, которые активно мониторят систему.
6) Наличие параллельных процессов, отнимающих кванты процессорного времени.
7) Обращение к AutoCAD для того, чтобы дать ему возможность реагировать на мышь и т.д., перерисовать индикатор прогресса.
Последний пункт может в десятки раз уменьшить скорость обработки.
Потом непонятно что имеется в виду под математическими вычислениями, используются ли средства ObjectARX в этом расчете...
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • ****
  • Сообщений: 421
  • Карма: 16
    • Advanced software for AutoCAD
  • Skype: Debalance
Цитировать
Сравнивать нужно усреднённые по нескольким измерениям цифры...
Не понял, какие цифры я должен сравнивать? А главное, зачем? Если я вижу реальную многократную разницу во времени...
Цитировать
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-классов.

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

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

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

  • ADN Club
  • ****
  • Сообщений: 421
  • Карма: 16
    • Advanced software for AutoCAD
  • Skype: Debalance
Кстати, а версии AutoCAD и SP одинаковые?
Да, всё идентичное. Попробую проанализировать бенчмарк железа...

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

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

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

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Так все-же есть конкретный кусок кода который на тестовых данных дает семикратную разницу, или это только при общем замере?

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

  • ADN Club
  • ****
  • Сообщений: 421
  • Карма: 16
    • Advanced software for AutoCAD
  • Skype: Debalance
В общем мне удалось локализовать проблему, но она из разряда необъяснимых флуктуаций.
После сравнительного анализа комплексной производительности двух компов, который показал 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 с.
Хочу ещё раз отметить, что такая проблема появилась на этом компе вдруг и совершенно внезапно: раньше всё работало безупречно. Кроме того, я протестировал работу программы ещё на нескольких машинах, включая довольно слабые ноутбуки - везде всё работает без задержек. И ещё, некоторые пользователи конкретно этой программы (по моей просьбе) сообщали мне информацию о её быстродействии. И среди этих сообщений были и такие, в которых время выполнения многократно не совпадало с ожидаемым. Поэтому в какой-то степени я рад, что эта флуктуация произошла на доступной для меня машине.
« Последнее редактирование: 23-01-2016, 18:24:48 от Александр Ривилис »

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

  • Administrator
  • *****
  • Сообщений: 13832
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Вскоре выяснилась странность в поведении вот такого вектора: std::vector<void*>, который как раз и давал примерно семикратную задержку во времени в момент последовательного его заполнения.
Могу предположить в чем причина. Тип данных (double *) по умолчанию указывает на границу двойного слова, тип (void *) на границу байта. Таким образом все операции требуют промежуточного перемещения данных на границу двойного слова. Как-то так. Впрочем, думаю что опциями компилятора можно было бы избавится от этой задержки, но могли бы возникнуть побочные эффекты.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Я полагаю что дело "в глубинных" настройках системы выделения памяти (ее фрагментации) - TmpVector.push_back(new double(0.001)) в зависимости от типа контейнера либо кладет значение в уже подготовленный "реверсом" непрерывный кусок памяти, либо кладет туда-же ссылку на объект - но под сами объекты память не готовилась и видимо для 5000000 точно потребуется несколько "переносов".

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

  • ADN Club
  • ****
  • Сообщений: 421
  • Карма: 16
    • Advanced software for AutoCAD
  • Skype: Debalance
Тема получила продолжение. Указанная выше проблема стала проявляться на Компе1. Опять же возникла она вдруг, чисто при работе над проектом. Теперь я решил потестировать работу со списками (std::list<>). Причем не важно какие данные я там храню (void*, double*, double, char) - тормозит конкретно, как при выполнении push_back, так и при выделении памяти в конструкторе контейнера.
Может действительно какие-то настройки линкера надо подкрутить?

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

  • Administrator
  • *****
  • Сообщений: 13832
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
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);
Ну тогда тут тоже выделение большого куска непрерывной памяти.

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

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

  • Administrator
  • *****
  • Сообщений: 13832
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Кстати, похоже v.reserve() + v.push_back() в цикле не эффективно:
http://lemire.me/blog/2012/06/20/do-not-waste-time-with-stl-vectors/
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • ****
  • Сообщений: 421
  • Карма: 16
    • Advanced software for AutoCAD
  • Skype: Debalance
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 нет.

В общем какой-то ступор...  >:(.

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

  • ADN Club
  • ****
  • Сообщений: 421
  • Карма: 16
    • Advanced software for AutoCAD
  • Skype: Debalance
Кстати, похоже 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...
И кстати данные в таблице красноречиво говорят как раз об эффективности этой связки.

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

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

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

  • ADN Club
  • ****
  • Сообщений: 421
  • Карма: 16
    • Advanced software for AutoCAD
  • Skype: Debalance
Если посмотреть в таблицу, то самый эффективный вариант с new, второй с конструктором и без push_back.
Ну да. Я имел ввиду v.push_back vs v.reserve() + v.push_back().

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

  • Administrator
  • *****
  • Сообщений: 13832
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
1) Ты проводил тестирование в том же проекте, в котором в начале возникла проблема с производительностью или создал новый для тестирования?
2) Если ты создал новый, то проверяешь как приложение внутри AutoCAD или сделал отдельный exe-файл и в нём замеряешь производительность.
3) Что касается std:list<> то тут добавляются еще поля ссылающиеся на предыдущий и последующий элемент списка. Так что дополнительный расход памяти. Думаю, что всё-таки std::vector был бы оптимальнее.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • ****
  • Сообщений: 421
  • Карма: 16
    • Advanced software for AutoCAD
  • Skype: Debalance
Сначала я проверял в проекте, потом создал простенький консольный проект в 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) - интересно, что будет у Вас. Свои результаты я тоже прикрепляю.
« Последнее редактирование: 26-01-2016, 16:46:20 от Александр Ривилис »

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

  • Administrator
  • *****
  • Сообщений: 13832
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis


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

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

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Ноутбук:

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

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

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

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

  • Administrator
  • *****
  • Сообщений: 13832
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Свои результаты я тоже прикрепляю.
У меня такое чувство, что выполнял ты не этот exe-файл. Не могу поверить что разница в 1000 раз. У меня I7 не помню какой, и 8Гб RAM.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Нотик:
Цитировать
Start
================

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

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

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

  • ADN Club
  • ****
  • Сообщений: 421
  • Карма: 16
    • Advanced software for AutoCAD
  • Skype: Debalance
У меня такое чувство, что выполнял ты не этот exe-файл. Не могу поверить что разница в 1000 раз. У меня I7 не помню какой, и 8Гб RAM.
В том то всё и дело, что этот... Наблюдаю это уже на второй машине. Ещё раз повторю - проблема, то появляется, то исчезает как-то вдруг (кстати на первой машине с которой я начинал топик теперь снова всё работает так же прекрасно уже дня два, хотя я не предпринимал никаких усилий). Ещё раз повторюсь - указанная странность наблюдалась не только у меня.

Все откликнувшимся спасибо за тестирование!

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

  • Administrator
  • *****
  • Сообщений: 13832
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Тогда в порядке бреда:
1) одно из ядер процессора бракованное.
2) таки в дело включается дисковая виртуальная память.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • ****
  • Сообщений: 421
  • Карма: 16
    • Advanced software for AutoCAD
  • Skype: Debalance
1) одно из ядер процессора бракованное.
Ну тогда бы тормозило всё - а этого не наблюдается. Плюс если я реализую конструкцию вот так std::vector<double> - то тоже всё заполняется мгновенно. Плюс проводил анализ бенчмарка - все показатели в норме.
2) таки в дело включается дисковая виртуальная память.
Смотрел в диспетчере задач (в процессе ожидания окончания работы программы) - 0% использования диска.

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

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Думаю, что получить ответ на обозначенный вопрос более вероятным будет здесь.

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Стационарный: 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...

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

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

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

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

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

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

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

  • ADN Club
  • ****
  • Сообщений: 421
  • Карма: 16
    • Advanced software for AutoCAD
  • Skype: Debalance
Убедись, что перед запуском твоего приложения AutoCAD использует 0% CPU.
Ну да, так и есть.

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

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

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

  • ADN Club
  • ****
  • Сообщений: 421
  • Карма: 16
    • Advanced software for AutoCAD
  • Skype: Debalance
Вот он.

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

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

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

  • ADN Club
  • ****
  • Сообщений: 421
  • Карма: 16
    • Advanced software for AutoCAD
  • Skype: Debalance
Ну и MS VS Express - это не тот инструмент...
А чем он плох? Для простых приложений (класса "Хеллоу ворлд") где не требуется MFC и прочие премудрости - он очень даже ничего... Кроме того есть вполне официальный документ, которым можно смело руководствоваться при создании приложений (в нём визард рассматривается всего лишь как альтернатива). Так что всё законно ))).

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

  • Administrator
  • *****
  • Сообщений: 13832
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
А чем он плох?
Насколько я понимаю он не допускает оптимизации кода. Возможно это не все его недостатки.
Кроме того есть вполне официальный документ, которым можно смело руководствоваться при создании приложений (в нём визард рассматривается всего лишь как альтернатива). Так что всё законно ))).
Документ явно устаревший. Обрати внимание на упоминание в нём acdb18.lib. Т.е. это соотвествует максимум ObjectARX 2012 и Visual Studio 2008.
Визард действительно лишь альтернатива, но с каждым годом требуется следить за большим и большим числом опций компилятора/линкера и это становится очень затруднительным.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13832
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Я убрал из кода 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 в операции создания/заполнения и удаления объектов контейнера.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • ****
  • Сообщений: 421
  • Карма: 16
    • Advanced software for AutoCAD
  • Skype: Debalance
Запустил, протестировал. Попрежнему разница существенная между 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>

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

  • Administrator
  • *****
  • Сообщений: 13832
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
У меня идеи закончились. Разве что у тебя внутри AutoCAD 2016 подменён обработчик set_new_handler (https://msdn.microsoft.com/ru-ru/library/5fath9te.aspx). Кто и как это сделал для меня секрет.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • ****
  • Сообщений: 421
  • Карма: 16
    • Advanced software for AutoCAD
  • Skype: Debalance
У меня идеи закончились.
У меня тоже закончились вместе с терпением ковырять эту проблему дальше... Тем не менее спасибо за поддержку.

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

  • Administrator
  • *****
  • Сообщений: 13832
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Кажется появилась новая идея в связи с копанием с вот этой темой: 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...
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение