Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Sleep и WaitFor...

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2

Открыть новую тему     Написать ответ в эту тему

odl455



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Есть ли какое-нить сравнение по производительности. Есть некоторые проблемы реализации приостановки потока при помощи ждущей функции, посему используется
 
while(1)
{
 
  if ( ) // проверяем некое условие выхода из цикла, например сравниваем
         // глобальную переменную
  {
     break;  
  }
  Sleep(1);
 
}
 
Как оценить выгоду по производительности пердыдущего и такого вариантов
 
while(1)
{
   if ( WaitForSingle... )
   {
       break;
   }
}

Всего записей: 659 | Зарегистр. 26-08-2002 | Отправлено: 22:07 14-09-2004
wiwiw

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
очевидно, второй лучше. тока нафига там цикл?

Всего записей: 127 | Зарегистр. 20-03-2004 | Отправлено: 22:22 14-09-2004 | Исправлено: wiwiw, 22:24 14-09-2004
odl455



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
wiwiw
 
совсем даже не очевидно.
чем второй способ на твой взгляд лучше? (про цикл забей )

Всего записей: 659 | Зарегистр. 26-08-2002 | Отправлено: 23:37 14-09-2004
vndovr

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Предположительно (всего кода ведь нет ):
Конкретно в данном случае первый поток будет продолжать свое выполнение после каждой милисекунды, проверять условие и, если неверно, опять приостанавливать выполнение. Второй просто ожидает (предположительно, по коду не видно) когда на него передадут управление при появлении какого-то события - просто время не тратится на проверки каждые 1 ms. Ну тут тоже можно предположить что кривой/сложной/специфической реализации WaitFor...  первый может оказаться и быстрее  
 
А если забить на цикл - и тебе просто поток на 1 ms приостановить - так первый лучше и быстрее
 
Sleep и WaitForSingle... - в общем разные функции для разных задач.

Всего записей: 359 | Зарегистр. 05-02-2004 | Отправлено: 01:33 15-09-2004 | Исправлено: vndovr, 01:35 15-09-2004
WiseAlex



Софтовых дел М...
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
поток будет продолжать свое выполнение после каждой милисекунды

обычно для sleep минимум 15 мс и то не точно

Всего записей: 1001 | Зарегистр. 02-03-2003 | Отправлено: 10:54 15-09-2004
Pupsik

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Конечно надо использовать WaitFor!
Процессор не будет так грузиться.
 

Цитата:
обычно для sleep минимум 15 мс

Да?
 

Всего записей: 553 | Зарегистр. 13-03-2003 | Отправлено: 11:53 15-09-2004
WiseAlex



Софтовых дел М...
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Pupsik
тестовая прога

Код:
 
int _tmain(int argc, _TCHAR* argv[])
{
LARGE_INTEGER Freq;
QueryPerformanceFrequency(&Freq);
LARGE_INTEGER PrevCounter,CurCounter;
for(int i=0;i<50;++i)
{
QueryPerformanceCounter(&PrevCounter);
Sleep(i);
QueryPerformanceCounter(&CurCounter);
double time=double(CurCounter.QuadPart-PrevCounter.QuadPart)/Freq.QuadPart*1000;
cout<<"Sleep time: "<<i<<"ms, Real sleep time:"<<time<<"ms\n";
} // for(int i=0;i<50;++i)
return 0;
}
 

результат:
Sleep time: 0ms, Real sleep time:0.00307302ms
Sleep time: 1ms, Real sleep time:10.2133ms
Sleep time: 2ms, Real sleep time:15.5517ms
Sleep time: 3ms, Real sleep time:15.5749ms
Sleep time: 4ms, Real sleep time:15.5995ms
Sleep time: 5ms, Real sleep time:15.6417ms
Sleep time: 6ms, Real sleep time:15.5897ms
Sleep time: 7ms, Real sleep time:15.5827ms
Sleep time: 8ms, Real sleep time:15.6011ms
Sleep time: 9ms, Real sleep time:15.6274ms
Sleep time: 10ms, Real sleep time:15.5176ms
Sleep time: 11ms, Real sleep time:15.6193ms
Sleep time: 12ms, Real sleep time:15.581ms
Sleep time: 13ms, Real sleep time:15.6056ms
Sleep time: 14ms, Real sleep time:15.7283ms
Sleep time: 15ms, Real sleep time:15.457ms
Sleep time: 16ms, Real sleep time:31.2361ms
...
1 мс неустойчива - система не ждет, а возвращает управление когда сочтет нужным у меня для 1 мс разброс от 0,3мс до 15

Всего записей: 1001 | Зарегистр. 02-03-2003 | Отправлено: 12:54 15-09-2004
mihas83



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
WiseAlex

Цитата:
тестовая прога  

Так результаты зависят от системы и ее ''настроения''...

----------
Мы знаем: время растяжимо. Оно зависит от того,
Какого рода содержимым Вы заполняете его. (C. Маршак)

Всего записей: 7855 | Зарегистр. 15-07-2003 | Отправлено: 13:41 15-09-2004
WiseAlex



Софтовых дел М...
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
mihas83

Цитата:
Так результаты зависят от системы и ее ''настроения''...  

только в отношении Sleep(1);
все остальные дают дискретность с минимальным шагом для таймера в системе. В большенстве современных - 15 мс. - т.е. от Настроения здесь зависимости нет

Всего записей: 1001 | Зарегистр. 02-03-2003 | Отправлено: 14:38 15-09-2004
vndovr

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Это результаты с моей машины:
 
Sleep time: 0ms, Real sleep time:1.79269ms
Sleep time: 1ms, Real sleep time:1.57953ms
Sleep time: 2ms, Real sleep time:2.85679ms
Sleep time: 3ms, Real sleep time:3.84127ms
Sleep time: 4ms, Real sleep time:4.7777ms
Sleep time: 5ms, Real sleep time:5.7904ms
Sleep time: 6ms, Real sleep time:8.38794ms
Sleep time: 7ms, Real sleep time:7.03106ms
Sleep time: 8ms, Real sleep time:8.68853ms
Sleep time: 9ms, Real sleep time:9.67134ms
 
 
Добавлено
XP sp2, P 1.4, 1G

Всего записей: 359 | Зарегистр. 05-02-2004 | Отправлено: 14:43 15-09-2004
mihas83



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
только в отношении Sleep(1);  

WiseAlex, так я на это намекал.

Всего записей: 7855 | Зарегистр. 15-07-2003 | Отправлено: 15:10 15-09-2004
WiseAlex



Софтовых дел М...
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
vndovr
А есть возможность на такой же машине но на XP Sp1 проверить.
Судя по всему это особенность железа, но как-то странно
 
вот что я нашел  
( в конторе везде xp sp1)
для P3 766 и P4mobile 1300 на centrino - дискретность 10 мс
Sleep time: 0ms, Real sleep time:0.0170413ms
Sleep time: 1ms, Real sleep time:0.998451ms
Sleep time: 2ms, Real sleep time:9.96747ms
Sleep time: 3ms, Real sleep time:9.97585ms
Sleep time: 4ms, Real sleep time:9.95294ms
Sleep time: 5ms, Real sleep time:10.0105ms
Sleep time: 6ms, Real sleep time:9.91718ms
Sleep time: 7ms, Real sleep time:10.0032ms
Sleep time: 8ms, Real sleep time:9.96216ms
Sleep time: 9ms, Real sleep time:9.9873ms
Sleep time: 10ms, Real sleep time:9.97753ms
Sleep time: 11ms, Real sleep time:19.9821ms
Sleep time: 12ms, Real sleep time:19.9645ms
Sleep time: 13ms, Real sleep time:19.9816ms
Sleep time: 14ms, Real sleep time:20.0713ms
Sleep time: 15ms, Real sleep time:19.9514ms
для всех наших ПК с athlon-duron 15мс (см пост выше)

Всего записей: 1001 | Зарегистр. 02-03-2003 | Отправлено: 15:47 15-09-2004
odl455



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
WiseAlex
 
если можно сделай на своей машине цикл по Sleep time: 1ms
меня интересует будет ли изменяться Real sleep time
 
Мне это нужно чтобы понять у кого быстрее реакция: Sleep(1) или WaitForSingle...
 
На моей машине (P4 2.0) Real sleep time в среднем 1.8 ms

Всего записей: 659 | Зарегистр. 26-08-2002 | Отправлено: 15:50 15-09-2004
WiseAlex



Софтовых дел М...
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Athlon XP 2000 RAM 512 on nVidia  
WinXP Corp Sp1
Sleep time: 1ms, Real sleep time:10.3253ms
Sleep time: 1ms, Real sleep time:15.5721ms
Sleep time: 1ms, Real sleep time:15.5877ms
Sleep time: 1ms, Real sleep time:15.6009ms
Sleep time: 1ms, Real sleep time:15.5975ms
Sleep time: 1ms, Real sleep time:15.6766ms
Sleep time: 1ms, Real sleep time:15.5361ms
Sleep time: 1ms, Real sleep time:15.5821ms
Sleep time: 1ms, Real sleep time:15.6266ms
Sleep time: 1ms, Real sleep time:16.6918ms
Sleep time: 1ms, Real sleep time:14.4775ms
Sleep time: 1ms, Real sleep time:15.6118ms
Sleep time: 1ms, Real sleep time:15.6123ms
Sleep time: 1ms, Real sleep time:15.6746ms
Sleep time: 1ms, Real sleep time:15.5358ms
Sleep time: 1ms, Real sleep time:15.6419ms

Всего записей: 1001 | Зарегистр. 02-03-2003 | Отправлено: 16:22 15-09-2004
fuxx

Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору

Цитата:
while(1)
{
 
  if ( ) // проверяем некое условие выхода из цикла, например сравниваем
         // глобальную переменную
  {
     break;  
  }
  Sleep(1);
 
}
 
Как оценить выгоду по производительности пердыдущего и такого вариантов
 
while(1)
{
   if ( WaitForSingle... )
   {
       break;
   }
}

 
Ты наверное имел в виду:
WaitForSingleObject ( VarSemaphore, INFINITE );
 
А там где изменяешь "условие выхода из цикла"
ReleaseSemaphore(VarSemaphore, 1, NULL );
 
ЭТО точно производительнее.

Всего записей: 117 | Зарегистр. 14-04-2003 | Отправлено: 16:22 15-09-2004
odl455



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
fuxx
 
да, но тут помимо производительности важна ещё и скорость реакции - что быстрее получит уведомление Sleep быстрее отвиснет или WaitForSingle...
к тому же не факт что использование семафора в данном случае будет более производительным решением. while(1) {Sleep(1); }  - поток практически ничего не жрёт или я просто не знаю как посчитать сколько поток жрёт ресурсов процессора при таком варианте
 
 
Добавлено
WiseAlex
 
cпасибо.

Всего записей: 659 | Зарегистр. 26-08-2002 | Отправлено: 16:27 15-09-2004
WiseAlex



Софтовых дел М...
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
odl455

Цитата:
как посчитать сколько поток жрёт ресурсов процессора при таком варианте  

у меня тоже была эта проблема
в принципе при частом использовании функций типа WaitFor... основное время уже тратится на переключение м/у программой и ОС

Всего записей: 1001 | Зарегистр. 02-03-2003 | Отправлено: 16:59 15-09-2004
vndovr

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
WiseAlex
Другой похожей машины нету, попробовал на P4 2.4, XP sp2
 
leep time: 0ms, Real sleep time:0.00748643ms
Sleep time: 1ms, Real sleep time:1.88508ms
Sleep time: 2ms, Real sleep time:2.04536ms
Sleep time: 3ms, Real sleep time:3.02389ms
Sleep time: 4ms, Real sleep time:4.00779ms
Sleep time: 5ms, Real sleep time:4.91465ms
Sleep time: 6ms, Real sleep time:5.91539ms
Sleep time: 7ms, Real sleep time:6.90489ms

Всего записей: 359 | Зарегистр. 05-02-2004 | Отправлено: 17:23 15-09-2004
wiwiw

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
odl455
действительно, все не так просто
вот правильный ответ:
 
Spinlocks assume that the protected resource is always accessed for short periods of time. This makes it more efficient to spin and then transition to kernel mode and wait. Many developers spin some number of times (say 4000), and if access to the resource is still denied, the thread transitions to kernel mode, where it waits (consuming no CPU time) until the resource becomes available. This is how critical sections are implemented.
 
 
 

Всего записей: 127 | Зарегистр. 20-03-2004 | Отправлено: 00:09 16-09-2004
fuxx

Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору

Цитата:
да, но тут помимо производительности важна ещё и скорость реакции - что быстрее получит уведомление Sleep быстрее отвиснет или WaitForSingle...  

?! Неужели вы серьезно думаете что выход из вызова WaitForSingleObject будет проходить дольше чем 1ms? Задержку чистого системного вызова померять можно вызвав много раз WaitForSingleObject на уже засигналеном объекте ядра. А Sleep у вас в общем случае ВСЕГДА запаздывает на 1ms. Так что Sleep явно хуже по реакции.
 

Цитата:
к тому же не факт что использование семафора в данном случае будет более производительным решением. while(1) {Sleep(1); }  - поток практически ничего не жрёт или я просто не знаю как посчитать сколько поток жрёт ресурсов процессора при таком варианте  

WaitForSingleObject в заблокированном состоянии вообще не потребляет процессора до тех пор пока объект ядра не придет в засигналенное состояние (т.о. проверка условия выхода из цикла делается 1 раз, правда в другом месте, там где происходит измениние состояния семафора), а Sleep раз в милисекунду пробуждает ваш поток (все равно через ядро) и потребляет ресурсы (т.е. проверка выхода из цикла делается 1 раз в милисекунду и срабатывает за все это время 1 раз).  

Всего записей: 117 | Зарегистр. 14-04-2003 | Отправлено: 11:42 16-09-2004
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Sleep и WaitFor...


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2025

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru