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

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

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

Оффлайн 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
  • *****
  • Сообщений: 13830
  • Карма: 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
  • *****
  • Сообщений: 13830
  • Карма: 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
  • *****
  • Сообщений: 13830
  • Карма: 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
  • *****
  • Сообщений: 13830
  • Карма: 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
  • *****
  • Сообщений: 13830
  • Карма: 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...