Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
 |  |  |  |  |  |
[Win32] вот алгоритм - проверь у себя плз 18.04.02 01:54 Число просмотров: 1003
Автор: beetle <beetle> Статус: Member
|
> NtQueryInformationThread(...) > kotoraya ispolzuetsia po polnoi programme vezde я не спорю.что она работает,но тогда проясні мне почему она мне нулі сует,а???
> > маркетинг не позволяет вікладівать точную инфу.Но > тогда > > помогает айс =)) > > ??? > blah-blah-blah имелся в виду отладчик SoftIce =))
> > я вот попробую через такті проца сделать =)) > > A kak ty uznaesh kakie "такті" otnosiatsi k tvoeii thread? не знаю пока.сам спросил про енто
|
|
<programming>
|
[Win32] 2 all - trables with GetThreadTimes 16.04.02 23:03
Автор: beetle <beetle> Статус: Member
|
мне нужно провести хронометраж исполнения алгоритма поиска.Для ентого до начала поиска візіваю :
...
GetThreadTimes(GetCurrentThread(),&ftPlug,&ftPlug,&ftKrnlS,&ftUsrS)
...
возвращает некоторіе значения:
ftKrnlS - время,затраченное потоком на віполнение кода ОС
ftUsrS - время,затрач.потоком на віполнение своего кода
Потом идет:
...
ptrMatchedElemPos = _find(dwResArraySize);
...//по ходу єто функция поиска ел-та.При //большом N(N-кол-во записей в файле)может //искать долго,так как делает не меньше чем N-1
//сравнений
далее сразу же после єтого идет:
GetThreadTimes(GetCurrentThread(),&ftPlug,&ftPlug,&ftKrnlE,&ftUsrE)
и получается,что
ftKrnlE == ftKrnlS и ftUsrE = ftUserS
(спецом смотрел под дебуггером)
пробовал добавить кучу циклов,чтобі время проц впустую погонять - разница во времени віходит минимальная
какие будут предположения????
|
 |
[win32] попробуй командой процессора rdtsc 17.04.02 18:08
Автор: mijk Статус: Незарегистрированный пользователь
|
Если у тебя пентиум и не нужен раздельный учет по kernel и user, можно использовать команду rdtsc, возвращающую количество машинных запусков от старта процессора в регистрах edx и eax. C++ ее не понимает, но, вроде, можно так:
inline unsigned _int64 GetCycleCount()
{
_asm _emit 0x0F
_asm _emit 0x31
}
---
Использование простое:
unsigned _int64 start = GetCycleCount();
..........
unsigned _int64 duration = GetCycleCount() - start;
|
 |  |
[win32] попробуй командой процессора rdtsc 18.04.02 01:52
Автор: beetle <beetle> Статус: Member
|
|
енто все великолепно,но для однозадачной среды.А как мне узнать,какие такты мои.а какие левых процессов.ведь я же не гарантирован,что между вызовами GettickCount() винда не переключит контекст проца на дрругой поток.
|
 |
[Win32] 2 all - trables with GetThreadTimes 16.04.02 23:47
Автор: + <Mikhail> Статус: Elderman
|
> мне нужно провести хронометраж исполнения алгоритма > поиска.Для ентого до начала поиска візіваю : > ... > GetThreadTimes(GetCurrentThread(),&ftPlug,&ftPlug,&ftKrnlS, > &ftUsrS) > ... > возвращает некоторіе значения: > ftKrnlS - время,затраченное потоком на віполнение кода ОС > ftUsrS - время,затрач.потоком на віполнение своего кода > Потом идет: > ... > ptrMatchedElemPos = _find(dwResArraySize); > ...//по ходу єто функция поиска ел-та.При //большом > N(N-кол-во записей в файле)может //искать долго,так как > делает не меньше чем N-1 > //сравнений > далее сразу же после єтого идет: > GetThreadTimes(GetCurrentThread(),&ftPlug,&ftPlug,&ftKrnlE, > &ftUsrE) > и получается,что > ftKrnlE == ftKrnlS и ftUsrE = ftUserS > (спецом смотрел под дебуггером) > пробовал добавить кучу циклов,чтобі время проц впустую > погонять - разница во времени віходит минимальная > какие будут предположения????
Specialno prover u menia vse rabotaet.
vyvod odin: tvoi algoritm vypolniaetsia ochen bystro
vot moi test:
FILETIME fc,fe,fk,fu,_fk,_fu;
::GetThreadTimes(::GetCurrentThread(),&fc, &fe, &fk, &fu);
for(long ll =0;ll<100000;++ll)
{
buf = ::SysAllocStringByteLen(0,16);
}
::GetThreadTimes(::GetCurrentThread(),&fc, &fe, &_fk, &_fu);
printf("k-time = %d, u-time=%d\n", _fk.dwLowDateTime - fk.dwLowDateTime , _fu.dwLowDateTime, _fu.dwLowDateTime );
---
resultat: k-time = 400576, u-time=49971856
|
 |  |
[Win32] я думаю дело не в моем алгоритме 17.04.02 15:58
Автор: beetle <beetle> Статус: Member
|
> Specialno prover u menia vse rabotaet. > vyvod odin: tvoi algoritm vypolniaetsia ochen bystro > > vot moi test:
> FILETIME fc,fe,fk,fu,_fk,_fu;
> ::GetThreadTimes(::GetCurrentThread(),&fc, &fe,
> &fk, &fu);
>
> for(long ll =0;ll<100000;++ll)
> {
> buf = ::SysAllocStringByteLen(0,16);
> }
> ::GetThreadTimes(::GetCurrentThread(),&fc, &fe,
> &_fk, &_fu);
> printf("k-time = %d, u-time=%d\n",
> _fk.dwLowDateTime - fk.dwLowDateTime , _fu.dwLowDateTime,
> _fu.dwLowDateTime );
>
> ---
> resultat: k-time = 400576, u-time=49971856 хех - дік я же говорю,что с циклами пустіми відает разницу.Я делал все енто проще даже-ставил цикл-пустішку-и все-равно есть разница.
Что значит слишком бістро-меньше 100 наносекунд ті хочешь сказать =))
врядли - видимо функция коряво ведет хронометраж.Я сначала поиск вінес в отдельній поток-так там она мне ваще нули возвращала,где бі я ее не візівал.Может кто подскажет как по другому сделать?????
|
 |  |  |
[Win32] я думаю дело не в моем алгоритме 17.04.02 21:19
Автор: + <Mikhail> Статус: Elderman
|
> > > Specialno prover u menia vse rabotaet. > > vyvod odin: tvoi algoritm vypolniaetsia ochen bystro > > > > vot moi test:
> > FILETIME fc,fe,fk,fu,_fk,_fu;
> > ::GetThreadTimes(::GetCurrentThread(),&fc, &fe,
> > &fk, &fu);
> >
> > for(long ll =0;ll<100000;++ll)
> > {
> > buf = ::SysAllocStringByteLen(0,16);
> > }
> > ::GetThreadTimes(::GetCurrentThread(),&fc, &fe,
> > &_fk, &_fu);
> > printf("k-time = %d, u-time=%d\n",
> > _fk.dwLowDateTime - fk.dwLowDateTime ,
> _fu.dwLowDateTime,
> > _fu.dwLowDateTime );
> >
> > ---
> > resultat: k-time = 400576, u-time=49971856 > хех - дік я же говорю,что с циклами пустіми відает > разницу.Я делал все енто проще даже-ставил цикл-пустішку-и > все-равно есть разница. > Что значит слишком бістро-меньше 100 наносекунд ті хочешь > сказать =)) > врядли - видимо функция коряво ведет хронометраж.Я сначала > поиск вінес в отдельній поток-так там она мне ваще нули > возвращала,где бі я ее не візівал.Может кто подскажет как > по другому сделать?????
Esli ona vydaet eto znachenie znachit ono takoe i est`.
from MSDN:
These times do not include time spent executing system threads or waiting in a suspended or blocked state.
sledovatelno tvoi algorithm ispolzuet kakieto API kotorye ispolzuut system threads.
|
 |  |  |  |
[Win32] вот алгоритм - проверь у себя плз 17.04.02 22:32
Автор: beetle <beetle> Статус: Member
|
DWORD dwResArraySize = 0,*ptrMatchedElemPos = NULL,pos;
FILETIME ftKrnlS,ftKrnlE,ftUsrS,ftUsrE,ftPlug;
__int64 qwKrnlTm,qwUsrTm,qwTotal;
CString end,pars,rslts;
if(GetThreadTimes(GetCurrentThread(),&ftPlug,&ftPlug,&ftKrnlS,&ftUsrS)==0)
ERR
ptrMatchedElemPos = _find(dwResArraySize);
if(GetThreadTimes(GetCurrentThread(),&ftPlug,&ftPlug,&ftKrnlE,&ftUsrE)==0)
ERR
qwKrnlTm = FTtoQW(&ftKrnlE) - FTtoQW(&ftKrnlS);
qwUsrTm = FTtoQW(&ftUsrE) - FTtoQW(&ftUsrS);
qwTotal = qwKrnlTm + qwUsrTm;
wsprintf(end.GetBuffer(50),"Пошук завершено.Тривалість %lu %luХ100 наносекунд",pos = (DWORD)(qwTotal >> 32),(DWORD)qwTotal& 0xFFFFFFFF);
m_lstResults.AddString(end);
**************************************************** DWORD* CExSearch::_find(DWORD& dwSizeRA)
{
DWORD dwPosCount = m_pPhMgrDlg->m_pDataBox.GetCount(),*ptrMatchedElemPos = NULL;
for (DWORD pos = 0;pos < dwPosCount;pos++) {
if(m_bIsSearchByName)
if(!strstr(m_pPhMgrDlg->m_pDataBox[pos].name,(LPCTSTR)_strSearchByName))
continue;
if(m_bIsSearchByPhone)
if(!strstr(m_pPhMgrDlg->m_pDataBox[pos].phone,(LPCTSTR)strSearchByPhone))
continue;
if(m_bIsSearchByComments)
if(!strstr(m_pPhMgrDlg->m_pDataBox[pos].comments,(LPCTSTR)ь_strSearchByComments))
continue;
if(ptrMatchedElemPos == NULL)
if((ptrMatchedElemPos = (DWORD*) new DWORD[dwPosCount]) == NULL) {
ERR
return 0;
}
ptrMatchedElemPos[dwSizeRA++] = pos;
}
return ptrMatchedElemPos;
}
попробуй.Интернесно.А то,что написано в мСДН - не всегда верно на 100%.МСДН знаешь ли коммерческая штука.Иногда маркетинг не позволяет вікладівать точную инфу.Но тогда помогает айс =))
я вот попробую через такті проца сделать =))
|
 |  |  |  |  |
[Win32] вот алгоритм - проверь у себя плз 17.04.02 23:25
Автор: + <Mikhail> Статус: Elderman
|
> попробуй.Интернесно.А то,что написано в мСДН - не всегда > верно на 100%.МСДН знаешь ли коммерческая штука.Иногда
Nu-nu, pokrainei mere ata function rabotaet ka i pologaetsia.
Kstat ata function just wrapper for NtQueryInformationThread(...)
kotoraya ispolzuetsia po polnoi programme vezde
> маркетинг не позволяет вікладівать точную инфу.Но тогда > помогает айс =))
???
blah-blah-blah
> я вот попробую через такті проца сделать =))
A kak ty uznaesh kakie "такті" otnosiatsi k tvoeii thread?
|
 |  |  |  |  |  |
[Win32] вот алгоритм - проверь у себя плз 18.04.02 01:54
Автор: beetle <beetle> Статус: Member
|
> NtQueryInformationThread(...) > kotoraya ispolzuetsia po polnoi programme vezde я не спорю.что она работает,но тогда проясні мне почему она мне нулі сует,а???
> > маркетинг не позволяет вікладівать точную инфу.Но > тогда > > помогает айс =)) > > ??? > blah-blah-blah имелся в виду отладчик SoftIce =))
> > я вот попробую через такті проца сделать =)) > > A kak ty uznaesh kakie "такті" otnosiatsi k tvoeii thread? не знаю пока.сам спросил про енто
|
 |  |  |  |  |  |  |
[Win32] вот алгоритм - проверь у себя плз 18.04.02 04:41
Автор: + <Mikhail> Статус: Elderman
|
Ctho to ne vizhu I kokogo libo super-puper find.
Poslednii raz govoru chto eta function rabotaet i to chto ona vydaet i est to vremia kotoroe proshlo, i esli eto vremia malo ili null togda tak ono i est`!! A to chto obchee vrema gorazdo bolshe chem vremia poluchennoe cherez etu function, skoree vsego oznachaet chto tvoe thread rabotaet s drugoi thread( ili threads) a ta drugaia (drugie) pozhiraut eto vremia.
P.S.
e.p.r.s.t. blin
|
 |  |  |  |  |  |  |  |
[Win32] вот алгоритм - проверь у себя плз 18.04.02 10:57
Автор: beetle <beetle> Статус: Member
|
> Ctho to ne vizhu I kokogo libo super-puper find. я же тебе говорил,что обычный перебор.По другому нельзя в данной ситуации.Там видишь ли задействованы все атрибуты,а сортированы данные только по одному.Вот и приходится
> Poslednii raz govoru chto eta function rabotaet i to chto > ona vydaet i est to vremia kotoroe proshlo, i esli eto > vremia malo ili null togda tak ono i est`!! A to chto > obchee vrema gorazdo bolshe chem vremia poluchennoe cherez > etu function, skoree vsego oznachaet chto tvoe thread > rabotaet s drugoi thread( ili threads) a ta drugaia > (drugie) pozhiraut eto vremia. да интересно какие же потоки вызываются для нескольких операций сравнения.Или ты решил,что сравнение в ядре выполняется???
ясно сказано,что она возвращает время в 100-наносекундных интервалах-так ты хош сказать,что ентот перебор хотя бы для 100 елементов выполняется менее чем за 100 наносекунд - может быть=)).Проверю с профилировщиком
|
|
|