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

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

  1. #1 Подсчет тактов процессора 
    Профи Аватар для stabud
    Регистрация
    05.01.2013
    Сообщений
    765
    Сказал(а) спасибо
    318
    Поблагодарили 337 раз(а) в 266 сообщениях
    Записей в блоге
    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
    Сообщений
    765
    Сказал(а) спасибо
    318
    Поблагодарили 337 раз(а) в 266 сообщениях
    Записей в блоге
    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,819
    Сказал(а) спасибо
    1,806
    Поблагодарили 932 раз(а) в 794 сообщениях
    Записей в блоге
    1
    Через CPUID, ясно. Хороший пример. Есть у WINAPI функция возвращающая счётчик тактов,
    помнится на PB(код) я решал проблемы с таймером через неё. Но думается этот код
    с CPUID будет работать чётче, т.к. не тратится время на API вызов.
    Обучение прикладному программированию(по skype), качественно, недорого, 18+, вопросы в личку.
    «Если вы ничего не сделаете, я уверяю вас, ничего и не произойдёт» © Жак Фреско
    Ограниченно модерирую.
    Ответить с цитированием  
     

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

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

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

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

Похожие темы

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