Кофейную гущу покажите.К сожалению это не возможно. Пытаюсь копать в сторону реализованной многопоточности (основные вычисления реализованы в отдельном потоке)...
Если оперировать абсолютными цифрами, то имеем следующее:Абсолютные цифры - не показатель. Сравнивать нужно усреднённые по нескольким измерениям цифры использованного процессорного времени. А причин по которым такое происходит может быть масса.
Сравнивать нужно усреднённые по нескольким измерениям цифры...Не понял, какие цифры я должен сравнивать? А главное, зачем? Если я вижу реальную многократную разницу во времени...
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-классов.
Для меня очевидно, что дело не железе, но в чём ещё?Итак одни и теже машинные коды выполняются на разных машинах. Соотвественно в первую очередь это вопрос железа. Во вторую очередь часть процессорного времени на себя отбирает система. Кстати, время ты засекаешь с момента начала сканирования чертежа? Если да, то возможно еще и вопрос быстродействия винчестера. Если в это время попадает еще и вывод на экран результатов (добавление примитивов), то возможно роль играет и видеокарта. Короче говоря вариантов масса и искать причину тебе.
Кстати, а версии AutoCAD и SP одинаковые?Да, всё идентичное. Попробую проанализировать бенчмарк железа...
Вскоре выяснилась странность в поведении вот такого вектора: std::vector<void*>, который как раз и давал примерно семикратную задержку во времени в момент последовательного его заполнения.Могу предположить в чем причина. Тип данных (double *) по умолчанию указывает на границу двойного слова, тип (void *) на границу байта. Таким образом все операции требуют промежуточного перемещения данных на границу двойного слова. Как-то так. Впрочем, думаю что опциями компилятора можно было бы избавится от этой задержки, но могли бы возникнуть побочные эффекты.
тормозит конкретно, как при выполнении push_backНу тут вероятно выделяется память если ты используешь new double(...) и т.п.
так и при выделении памяти в конструкторе контейнера.А вот это я не понял. В коде у тебя пустой конструктор. Или ты имеешь в виду вот это:
А вот это я не понял. В коде у тебя пустой конструктор.В предыдущем посте (я писал об этом) я развлекался с std::list<>. Я пробовал заполнять список по разному, в том числе так:
typedef std::list<char> TestList;
const TestList::size_type ListSize = 5000000;
TestList TmpList(ListSize, 1);
Ощутимой разницы с push_back нет.Кстати, похоже v.reserve() + v.push_back() в цикле не эффективно:Я внимательно прочитал указанную Вами статью и, честно говоря, не понял, почему Вы говорите о неэффективности использования связки v.reserve() + v.push_back()? Наоборот, автор говорит:
http://lemire.me/blog/2012/06/20/do-not-waste-time-with-stl-vectors/
It is likely to be slightly faster...И кстати данные в таблице красноречиво говорят как раз об эффективности этой связки.
И кстати данные в таблице красноречиво говорят как раз об эффективности этой связки.Если посмотреть в таблицу, то самый эффективный вариант с new, второй с конструктором и без push_back.
Если посмотреть в таблицу, то самый эффективный вариант с new, второй с конструктором и без push_back.Ну да. Я имел ввиду v.push_back vs v.reserve() + v.push_back().
Свои результаты я тоже прикрепляю.У меня такое чувство, что выполнял ты не этот exe-файл. Не могу поверить что разница в 1000 раз. У меня I7 не помню какой, и 8Гб RAM.
Start
================
Time1: <0.328125 seconds>
Time2: <0.140625 seconds>
TotalTime: <0.468750 seconds>
================
End. Press any key...
У меня такое чувство, что выполнял ты не этот exe-файл. Не могу поверить что разница в 1000 раз. У меня I7 не помню какой, и 8Гб RAM.В том то всё и дело, что этот... Наблюдаю это уже на второй машине. Ещё раз повторю - проблема, то появляется, то исчезает как-то вдруг (кстати на первой машине с которой я начинал топик теперь снова всё работает так же прекрасно уже дня два, хотя я не предпринимал никаких усилий). Ещё раз повторюсь - указанная странность наблюдалась не только у меня.
1) одно из ядер процессора бракованное.Ну тогда бы тормозило всё - а этого не наблюдается. Плюс если я реализую конструкцию вот так std::vector<double> - то тоже всё заполняется мгновенно. Плюс проводил анализ бенчмарка - все показатели в норме.
2) таки в дело включается дисковая виртуальная память.Смотрел в диспетчере задач (в процессе ожидания окончания работы программы) - 0% использования диска.
Start
================
Time1: <0.218401 seconds>
Time2: <0.093601 seconds>
TotalTime: <0.312002 seconds>
================
End. Press any key...
Start
================
Time1: <0.561604 seconds>
Time2: <0.280802 seconds>
TotalTime: <0.842405 seconds>
================
End. Press any key...
аналогичное по сути тестовой консольной программеАналогичное - это что? Если просишь тестировать - показывай исходник.
Command: VECTORTEST
Start
================
Time1: <0.202801 seconds>
Time2: <0.078001 seconds>
TotalTime: <0.280802 seconds>
================
End
Command: VECTORTEST
Start
================
Time1: <0.171601 seconds>
Time2: <0.078001 seconds>
TotalTime: <0.249602 seconds>
================
End
Если просишь тестировать - показывай исходник.Исходник:
Команда: VECTORTEST
Start
================
Time1: <2.184014 seconds>
Time2: <0.078001 seconds>
TotalTime: <2.262014 seconds>
================
End
Команда: 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!Мда-а-а... Честно, устал бороться с флуктуациями в 2016-ом каде...
Мда-а-а... Честно, устал бороться с флуктуациями в 2016-ом каде...Не думаю. У тебя скорее проблема с Windows / Hardware, чем с AutoCAD - ты не используешь в этом коде из AutoCAD ничего...
Может сервайс-пак у меня как-то криво стоит?
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
AutoCAD Architecture 2016:
Код: [Выделить]
Команда: VECTORTEST
Start
================
Time1: <2.184014 seconds>
Time2: <0.078001 seconds>
TotalTime: <2.262014 seconds>
================
End
я так подозреваю, что автокад еще толком не догрузился, когда вы запустили команду. ну или активной был другая программа.У меня это всё на виртуальной машине. AutoCAD загрузился. Других активных программ нет (ни антивирусов, ни брандмауэров). Но памяти маловато. Думаю что измерять нужно процессорное время. Хотя разброс времени и останется, он будет значительно меньше.
было б интересно посмотреть статистику хотя б 3-4 запускам подряд.
У тебя скорее проблема с Windows / HardwareНу тогда было бы трудно объяснить, почему в AutoCAD 2015 производительность той-же самой программы не падает. У меня создается впечатление что в 2016-ом каде болтается что-то такое что тормозит процесс, хотя в целом невидно чтобы он как-то тормозил..
PS: а если процессу акада принудительно в диспетчере повысить приоритет, будет ли уменьшаться время обработки?Процессорное - нет, а общее время - вполне возможно. Но это нужно экспериментировать на реальной машине, а не на виртуальной.
У меня создается впечатление что в 2016-ом каде болтается что-то такое что тормозит процесс, хотя в целом невидно чтобы он как-то тормозил..Убедись, что перед запуском твоего приложения AutoCAD использует 0% CPU.
Убедись, что перед запуском твоего приложения AutoCAD использует 0% CPU.Ну да, так и есть.
Ну и 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), которым можно смело руководствоваться при создании приложений (в нём визард рассматривается всего лишь как альтернатива). Так что всё законно ))).
А чем он плох?Насколько я понимаю он не допускает оптимизации кода. Возможно это не все его недостатки.
Кроме того есть вполне официальный документ, которым можно смело руководствоваться при создании приложений (в нём визард рассматривается всего лишь как альтернатива). Так что всё законно ))).Документ явно устаревший. Обрати внимание на упоминание в нём acdb18.lib. Т.е. это соотвествует максимум ObjectARX 2012 и Visual Studio 2008.
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 в операции создания/заполнения и удаления объектов контейнера.
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>
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>
У меня идеи закончились.У меня тоже закончились вместе с терпением ковырять эту проблему дальше... Тем не менее спасибо за поддержку.