⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hrtimer.cpp

📁 lots Elliptic curve cryptography codes. Use Visual c++ to compile
💻 CPP
字号:
// hrtimer.cpp - written and placed in the public domain by Wei Dai#include "pch.h"#include "hrtimer.h"#include "misc.h"#include <stddef.h>		// for NULL#include <time.h>#if defined(CRYPTOPP_WIN32_AVAILABLE)#include <windows.h>#elif defined(CRYPTOPP_UNIX_AVAILABLE)#include <sys/time.h>#include <sys/times.h>#include <unistd.h>#endif#include <assert.h>NAMESPACE_BEGIN(CryptoPP)#ifndef CRYPTOPP_IMPORTSdouble TimerBase::ConvertTo(TimerWord t, Unit unit){	static unsigned long unitsPerSecondTable[] = {1, 1000, 1000*1000, 1000*1000*1000};	assert(unit < sizeof(unitsPerSecondTable) / sizeof(unitsPerSecondTable[0]));	return (double)CRYPTOPP_VC6_INT64 t * unitsPerSecondTable[unit] / CRYPTOPP_VC6_INT64 TicksPerSecond();}void TimerBase::StartTimer(){	m_last = m_start = GetCurrentTimerValue();	m_started = true;}double TimerBase::ElapsedTimeAsDouble(){	if (m_stuckAtZero)		return 0;	if (m_started)	{		TimerWord now = GetCurrentTimerValue();		if (m_last < now)	// protect against OS bugs where time goes backwards			m_last = now;		return ConvertTo(m_last - m_start, m_timerUnit);	}	StartTimer();	return 0;}unsigned long TimerBase::ElapsedTime(){	double elapsed = ElapsedTimeAsDouble();	assert(elapsed <= ULONG_MAX);	return (unsigned long)elapsed;}TimerWord Timer::GetCurrentTimerValue(){#if defined(CRYPTOPP_WIN32_AVAILABLE)	LARGE_INTEGER now;	if (!QueryPerformanceCounter(&now))		throw Exception(Exception::OTHER_ERROR, "Timer: QueryPerformanceCounter failed with error " + IntToString(GetLastError()));	return now.QuadPart;#elif defined(CRYPTOPP_UNIX_AVAILABLE)	timeval now;	gettimeofday(&now, NULL);	return (TimerWord)now.tv_sec * 1000000 + now.tv_usec;#else	clock_t now;	return clock();#endif}TimerWord Timer::TicksPerSecond(){#if defined(CRYPTOPP_WIN32_AVAILABLE)	static LARGE_INTEGER freq = {0};	if (freq.QuadPart == 0)	{		if (!QueryPerformanceFrequency(&freq))			throw Exception(Exception::OTHER_ERROR, "Timer: QueryPerformanceFrequency failed with error " + IntToString(GetLastError()));	}	return freq.QuadPart;#elif defined(CRYPTOPP_UNIX_AVAILABLE)	return 1000000;#else	return CLOCKS_PER_SEC;#endif}#endif	// #ifndef CRYPTOPP_IMPORTSTimerWord ThreadUserTimer::GetCurrentTimerValue(){#if defined(CRYPTOPP_WIN32_AVAILABLE)	static bool getCurrentThreadImplemented = true;	if (getCurrentThreadImplemented)	{		FILETIME now, ignored;		if (!GetThreadTimes(GetCurrentThread(), &ignored, &ignored, &ignored, &now))		{			DWORD lastError = GetLastError();			if (lastError == ERROR_CALL_NOT_IMPLEMENTED)			{				getCurrentThreadImplemented = false;				goto GetCurrentThreadNotImplemented;			}			throw Exception(Exception::OTHER_ERROR, "ThreadUserTimer: GetThreadTimes failed with error " + IntToString(lastError));		}		return now.dwLowDateTime + ((TimerWord)now.dwHighDateTime << 32);	}GetCurrentThreadNotImplemented:	return (TimerWord)clock() * (10*1000*1000 / CLOCKS_PER_SEC);#elif defined(CRYPTOPP_UNIX_AVAILABLE)	tms now;	times(&now);	return now.tms_utime;#else	return clock();#endif}TimerWord ThreadUserTimer::TicksPerSecond(){#if defined(CRYPTOPP_WIN32_AVAILABLE)	return 10*1000*1000;#elif defined(CRYPTOPP_UNIX_AVAILABLE)	static const long ticksPerSecond = sysconf(_SC_CLK_TCK);	return ticksPerSecond;#else	return CLOCKS_PER_SEC;#endif}NAMESPACE_END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -