Важная информация
Показано с 1 по 5 из 5

Тема: Подсчет тактов процессора

  1. #1 Подсчет тактов процессора 
    Профи Аватар для stabud
    Регистрация
    05.01.2013
    Сообщений
    783
    Сказал(а) спасибо
    326
    Поблагодарили 347 раз(а) в 274 сообщениях
    Записей в блоге
    6
    Я тут на оф.сайте нашел хорошенький код от MichaelW. Потом выложу на своем сайте. Можно применять для тестирования скорости взамен всяким временным подсчетам , которые мягко сказать пляшут результатами.

    Код :
    ''=============================================================================
    #include "windows.bi"
    ''=============================================================================
     
    dim shared as longint counter_cycles
    dim shared as integer _counter_loopcount_, _counter_loopcounter_
    dim shared as integer _process_priority_class_, _thread_priority_
     
    #macro COUNTER_BEGIN( loop_count, process_priority, thread_priority )
    	_counter_loopcount_ = loop_count
    	_process_priority_class_ = GetPriorityClass(GetCurrentProcess())
    	_thread_priority_ = GetThreadPriority(GetCurrentThread())
    	SetPriorityClass(GetCurrentProcess(), process_priority)
    	SetThreadPriority(GetCurrentThread(), thread_priority)
    	_counter_loopcounter_ = _counter_loopcount_
    	asm
    		xor eax, eax
    		cpuid               '' serialize
    		rdtsc               '' get reference loop start count
    		push edx            '' preserve msd (most significant dword)
    		push eax            '' preserve lsd
    		xor eax, eax
    		cpuid               '' serialize
    		.balign 16
    		0:                    '' start of reference loop
    		sub DWORD PTR _counter_loopcounter_, 1
    		jnz 0b              '' end of reference loop
    		xor eax, eax
    		cpuid               '' serialize
    		rdtsc               '' get reference loop end count
    		pop ecx             '' recover lsd of start count
    		sub eax, ecx        '' calc lsd of reference loop count
    		pop ecx             '' recover msd of start count
    		sbb edx, ecx        '' calc msd of reference loop count
    		push edx            '' preserve msd of reference loop count
    		push eax            '' preserve lsd of reference loop count
    		xor eax, eax
    		cpuid               '' serialize
    		rdtsc               '' get test loop start count
    		push edx            '' preserve msd
    		push eax            '' preserve lsd
    	end asm
    	_counter_loopcounter_ = _counter_loopcount_
    	asm
    		xor eax, eax
    		cpuid               '' serialize
    		.balign 16
    		1:                    '' start of test loop
    	end asm
    #endmacro
     
    ''=============================================================================
     
    #macro COUNTER_END()
    	asm
    		sub DWORD PTR _counter_loopcounter_, 1
    		jnz 1b              '' end of test loop
    		xor eax, eax
    		cpuid               '' serialize
    		rdtsc
    		pop ecx             '' recover lsd of start count
    		sub eax, ecx        '' calc lsd of test loop count
    		pop ecx             '' recover msd of start count
    		sbb edx, ecx        '' calc msd of test loop count
    		pop ecx             '' recover lsd of reference loop count
    		sub eax, ecx        '' calc lsd of corrected loop count
    		pop ecx             '' recover msd of reference loop count
    		sbb edx, ecx        '' calc msd of corrected loop count
    		mov DWORD PTR [counter_cycles], eax
    		mov DWORD PTR [counter_cycles+4], edx
    	end asm
    	SetPriorityClass(GetCurrentProcess(),_process_priority_class_)
    	SetThreadPriority(GetCurrentThread(),_thread_priority_)
    	counter_cycles /= _counter_loopcount_
    #endmacro
     
    ''=============================================================================
    Ответить с цитированием  
     

  2. Пользователь сказал cпасибо:

    >Quiet Snow< (19.05.2013)

  3. #2  
    Профи Аватар для stabud
    Регистрация
    05.01.2013
    Сообщений
    783
    Сказал(а) спасибо
    326
    Поблагодарили 347 раз(а) в 274 сообщениях
    Записей в блоге
    6
    Результаты конечно тоже пляшут, но для тестирования например двух процедур неплохо.

    Пример как использовать:

    Код :
    counter_begin( 1000, REALTIME_PRIORITY_CLASS, THREAD_PRIORITY_TIME_CRITICAL)
    For i As Integer = 10 To 10000
     
    Next
    COUNTER_END()
    print counter_cycles
    sleep
    Ответить с цитированием  
     

  4. Пользователь сказал cпасибо:

    >Quiet Snow< (19.05.2013)

  5. #3  
    Супер модератор Аватар для >Quiet Snow<
    Регистрация
    11.04.2011
    Адрес
    Планета земля
    Сообщений
    3,927
    Сказал(а) спасибо
    1,842
    Поблагодарили 982 раз(а) в 840 сообщениях
    Записей в блоге
    1
    Через CPUID, ясно. Хороший пример. Есть у WINAPI функция возвращающая счётчик тактов,
    помнится на PB(код) я решал проблемы с таймером через неё. Но думается этот код
    с CPUID будет работать чётче, т.к. не тратится время на API вызов.
    Обучение прикладному программированию(по skype), качественно, недорого, 18+, вопросы в личку.
    «Если вы ничего не сделаете, я уверяю вас, ничего и не произойдёт» © Жак Фреско
    Ограниченно модерирую.
    Ответить с цитированием  
     

  6. #4  
    Профи Аватар для stabud
    Регистрация
    05.01.2013
    Сообщений
    783
    Сказал(а) спасибо
    326
    Поблагодарили 347 раз(а) в 274 сообщениях
    Записей в блоге
    6
    Кстати , нельзя переименовать тему? Пропущена буква
    Ответить с цитированием  
     

  7. #5  
    Супер модератор Аватар для >Quiet Snow<
    Регистрация
    11.04.2011
    Адрес
    Планета земля
    Сообщений
    3,927
    Сказал(а) спасибо
    1,842
    Поблагодарили 982 раз(а) в 840 сообщениях
    Записей в блоге
    1
    Подсчет тактов процессора
    Значит уже кто-то из модеров подсуетился. (да и что-то такой опции не нашёл )
    Обучение прикладному программированию(по skype), качественно, недорого, 18+, вопросы в личку.
    «Если вы ничего не сделаете, я уверяю вас, ничего и не произойдёт» © Жак Фреско
    Ограниченно модерирую.
    Ответить с цитированием  
     

Информация о теме
Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. подсчет символов в ячейке
    от 123456789igor в разделе Delphi
    Ответов: 5
    Последнее сообщение: 21.11.2013, 18:30
Ваши права
  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •