Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Время выполнения программы 
:(
    Опции темы
Usya
Дата 20.2.2010, 22:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 154
Регистрация: 7.6.2005

Репутация: нет
Всего: нет



Если утрировать, то задачу можно сформулировать следующим образом: есть прога для тестирования, в одном из обработчиков прописан следующий код:

Код
{
  бла-бла-бла
  
  for (int s=0;s<10;s++) {};

  блу-блу-блу
}


Если заремить цикл, то время выполнения этого блока увеличивается в полтора-два раза (приблизительно с 8 с половиной до 14 с половиной минут). В чем может быть загвоздка?

Буду признателен за любой совет.

Заранее благодарен!

P.s. Код программы не привожу, т.к. в ней более тысячи строк, а приводить код указанного обработчика без составных процедур не имеет смысла.
--------------------
Я не волшебник, я только учусь...
PM MAIL   Вверх
Alexeis
Дата 20.2.2010, 23:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 26
Всего: 459



Usya, цикл реально пустой? Или он все же влияет на работу алгоритма?


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
artsb
Дата 20.2.2010, 23:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



Цитата(Usya @  20.2.2010,  22:32 Найти цитируемый пост)
P.s. Код программы не привожу, т.к. в ней более тысячи строк, а приводить код указанного обработчика без составных процедур не имеет смысла. 

Как минимум покажите что у вас между {}


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
Usya
Дата 21.2.2010, 00:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 154
Регистрация: 7.6.2005

Репутация: нет
Всего: нет



Alexeisartsb

На самом деле в цикле должно что-то выполняться (и количество шагов в нем зависит от ряда факторов), но при поиске решения проблемы я просто взял и вместо моего цикла вставил пустой. Оказалось важно наличие цикла, а не то, что в нем. Причем его наличие почему-то влияет на время выполнения некоторых процедур, вызываемых в коде “бла-бла-бла”. Такое ощущение, что при вставке этого цикла на этапе компиляции Builder (6.0) умудряется что-то оптимизировать (возможно сам пытается что-то распараллелить из расчетов), в результате чего в среднем код работает быстрее.
 
Кроме того, при попытке оптимизации ряда функций, я просто перестал понимать логику изменения времени выполнения программы. До этого момента все попытки оптимизации были как минимум адекватны изменению времени выполнения программы. Сейчас пытаюсь с этим разобраться.
--------------------
Я не волшебник, я только учусь...
PM MAIL   Вверх
Alexeis
Дата 21.2.2010, 01:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 26
Всего: 459



Usya, возможно приложение многопоточное и это как-то влияет на синхронизацию потоков ухудшая производительность.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Usya
Дата 21.2.2010, 01:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 154
Регистрация: 7.6.2005

Репутация: нет
Всего: нет



Alexeis, в данной программе я не использую распараллеливание процессов (только подключаюсь однократно к другому распараллеленному процессу для закачки данных для обработки, но это длится менее секунды). Возможно сам Builder пытается что-то намудрить с распараллеливанием, хотя все равно, как-то не совсем это понятно.
--------------------
Я не волшебник, я только учусь...
PM MAIL   Вверх
Alexeis
Дата 21.2.2010, 01:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 26
Всего: 459



Цитата(Usya @  21.2.2010,  00:21 Найти цитируемый пост)
Возможно сам Builder пытается что-то намудрить с распараллеливанием, хотя все равно, как-то не совсем это понятно. 

  Нет, билдер такого не делает. В одном потоке невозможно распараллелится. 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Usya
Дата 21.2.2010, 20:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 154
Регистрация: 7.6.2005

Репутация: нет
Всего: нет



Сегодня протестировал три варианта:
1-й – исходный, 
2-й – поставил перед пустым циклом return,
3-й – заремил все, что находится после “бла-бла-бла”, включая цикл.

Результаты в режиме Code Optimization = None:
17:42            17:37            15:36
В режиме Code Optimization = Speed:
9:01            8:44            13:33

Тестирование производилось параллельно по три экземпляра за проход (процессор четырехядерный – загружен по полной соответственно не был). Приведенное выше время выполнения указано только для кода “бла-бла-бла”. На разницу в секундах можно не обращать внимания (могут сказываться различные накладные расходы). Каждый из экземпляров прогнал дважды и усреднил (разница во времени выполнения однотипных экземпляров была от одной до тринадцати секунд, да и то - 13 сек только для одного из экземпляров, для остальных – не более семи секунд) – для статистики маловато, но чтобы оценить порядок времени выполнения каждого из экземпляров, возможно достаточно.

Кстати, одна из возможных причин такого поведения описана в книге Криса Касперски “Техника оптимизации программ. Эффективное использование памяти” в параграфе “Проблема наведенных эффектов”, за что ему большое спасибо. А также спасибо всем отозвавшимся на решение этой задачки.

P.s.
Может я где-то и нахимичил с результатами тестов, но зато кое-что начало проясняться из нелогичности в оптимизации после прочитанного в книге, хотя читал слишком поверхностно. По ходу дела, с этим придется серьезно разбираться.

--------------------
Я не волшебник, я только учусь...
PM MAIL   Вверх
artsb
Дата 22.2.2010, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



Цитата(Usya @  21.2.2010,  20:42 Найти цитируемый пост)
Сегодня протестировал три варианта:

Подозреваю, что вы неправильно тестировали. Небось использовали GetTickCount для расчёта времени работы кода (или подобные способы). Но это не правильно. Так нельзя получить правильных результатов. А дело тут в том, что Windows - это ОС с вытесняющей многозадачностью. Может получиться такая ситуация:
Код

long int cnt;
cnt = GetTickCount();
// в этом месте ОС может переключиться на другой поток.
// следовательно, результат будет неверным.
// причём расхождения могут быть огромными.
// working...
cnt = GetTickCount() - cnt;
// ...

А нужно приблизительно так:
Код

FILETIME KernelTimeStart, KernelTimeEnd;
FILETIME UserTimeStart, UserTimeEnd;
FILETIME Temp;
__int64 KernelTimeElapsed, UserTimeElapsed, TotalTimeElapsed;
ULARGE_INTEGER uliKernelTimeStart, uliUserTimeStart;
ULARGE_INTEGER uliKernelTimeEnd, uliUserTimeEnd;

GetThreadTimes(GetCurrentThread(), &Temp, &Temp, &KernelTimeStart, &UserTimeStart);
// working...
GetThreadTimes(GetCurrentThread(), &Temp, &Temp, &KernelTimeEnd, &UserTimeEnd);

uliKernelTimeStart.LowPart = KernelTimeStart.dwLowDateTime;
uliKernelTimeStrat.HighPart = KernelTimeStart.dwHighDateTime;

uliKernelTimeEnd.LowPart = KernelTimeEnd.dwLowDateTime;
uliKernelTimeEnd.HighPart = KernelTimeEnd.dwHighDateTime;

uliUserTimeStart.LowPart = UserTimeStart.dwLowDateTime;
uliUserTimeStrat.HighPart = UserTimeStart.dwHighDateTime;

uliUserTimeEnd.LowPart = UserTimeEnd.dwLowDateTime;
uliUserTimeEnd.HighPart = UserTimeEnd.dwHighDateTime;

KernelTimeElapsed = uliKernelTimeEnd.QuadPart - uliKernelTimeStart.QuadPart; // время работы кода системы
UserTimeElapsed = uliUserTimeEnd.QuadPart - uliUserTimeStart.QuadPart; // время работы кода программы
TotalTimeElapsed = KernelTimeElapsed + UserTimeElapsed; // общее время работы



--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
Alexeis
Дата 22.2.2010, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 26
Всего: 459



artsb>// в этом месте ОС может переключиться на другой поток.

Usya>в данной программе я не использую распараллеливание процессов (только подключаюсь однократно к другому распараллеленному процессу для закачки данных для обработки, но это длится менее секунды)

Так что такого происходить не может. Разве что в случае если машина загружена, но и тогда статистически за несколько запусков вариант без цикла был бы быстрее, а Usya утверждает что вариант без цикла всегда медленнее. Тут какой-то более хитрый случай.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
artsb
Дата 22.2.2010, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



Цитата(Alexeis @  22.2.2010,  14:05 Найти цитируемый пост)
Так что такого происходить не может.

Так я и не говорил про потоки одного процесса. Система может переключиться на любой поток.

Цитата(Alexeis @  22.2.2010,  14:05 Найти цитируемый пост)
Тут какой-то более хитрый случай. 

Возможно... А ещё может быть так, что ТС что-то не договаривает (как это часто бывает). Так что, скоро должен появиться пост: "Вот я ..., всё дело было в ...!"  smile 

Это сообщение отредактировал(а) artsb - 22.2.2010, 14:33


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
Alexeis
Дата 22.2.2010, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 26
Всего: 459



Цитата(artsb @  22.2.2010,  13:33 Найти цитируемый пост)
Так я и не говорил про потоки одного процесса. Система может переключиться на любой поток.

  все равно статистически результат был бы правильным, а Usya проводил много замеров. Мне видится использование внешней памяти (внешним устройствам) внутри кода, т.е. все же потоки используются, но неявно в ядре ОС. 
  Кстати по твоему способу можно проводить замеры времени только в пользовательского режима, по идее это должно исключить время затраченное на ожидание чего-либо в режиме ядра (накладные вопросы синхронизации).


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
artsb
Дата 22.2.2010, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



Цитата(Alexeis @  22.2.2010,  15:28 Найти цитируемый пост)
 все равно статистически результат был бы правильным

Результат был бы правильным ТОЛЬКО при условии, что код успел отработать за один квант времени, выделенный этому потоку. Об этом пишет Рихтер  smile 

Цитата(Alexeis @  22.2.2010,  15:28 Найти цитируемый пост)
 Usya проводил много замеров

И он сам же написал, какие там были расхождения при использовании абсолютного одного и того же кода.


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
Usya
Дата 22.2.2010, 21:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 154
Регистрация: 7.6.2005

Репутация: нет
Всего: нет



Только с работы пришел и увидел, что тема на моем посте не закончилась.

artsb
Цитата

Подозреваю, что вы неправильно тестировали. Небось использовали GetTickCount ...


Я использовал clock() для замеров выполнения отдельных функций и циклов, и Now() (он остался у меня с момента начала написания проги) для замера выполнения полного времени тестирования, которое и привел прошлом посте. 

Я не буду спорить по поводу
Цитата

А дело тут в том, что Windows - это ОС с вытесняющей многозадачностью. Может получиться такая ситуация...


Да и тесты проводились не в идеальных условиях и не с идеальными замерами, важно было следующее, что при наличии пустого цикла тестирование в режиме Code Optimization = Speed заканчивалось, в среднем, раза в полтора быстрее. Причем тестирование производилось далеко неоднократно и до того, как я начал тему и после, и проводилось при параллельном выполнении тестируемых экземпляров.

Цитата

Так что, скоро должен появиться пост: "Вот я ..., всё дело было в ...!" 


Все может быть.  smile Я сегодня решил немного поглубже вникнуть в то, что пишет Крис Касперски. Пока прочитал только первую главу, в которой, в частности, он по полочкам разбирает оптимизацию одной и типовых задач, начиная от прописных истин и заканчивая достаточно интересными результатами тестирования. Много познавательного там.

Цитата

И он сам же написал, какие там были расхождения при использовании абсолютного одного и того же кода.


Написал, чтобы оценить погрешность расчетов, и что эта погрешность не перекрывает разницы тестирования в минутах!!!

Цитата

Результат был бы правильным ТОЛЬКО при условии, что код успел отработать за один квант времени


Спорный вопрос. Может я и не силен в оптимизации и приведу совсем левый пример, но у Криса Касперски рассматривается одна интересная задачка, когда одна и та же функция запускалась десять раз подряд. Время выполнения первого прогона почти вчетверо превышало последующие. Правда пример достаточно простой из нескольких строк. Но дело в другом - для идеального тестирования необходимо очищать все кэши и все буферы и т.д. и т.п. и дело здесь далеко не только в многозадачности Windows. Кстати, по поводу замеров времени в книге есть параграф "Неточность измерений", но это - отдельная тема.

Это сообщение отредактировал(а) Usya - 22.2.2010, 21:31
--------------------
Я не волшебник, я только учусь...
PM MAIL   Вверх
xvr
Дата 26.2.2010, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



В моей практике бул случай, когда вставка в программу 1 NOP'а повышала быстродействие чуть ли не вдвое. (Правда это было давно и на SPARC платформе). Дело было в том, как разложился код программы в кэше кода из за выравнивания.

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0999 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.