├── .gitattributes ├── .gitignore ├── Makefile ├── README ├── test.c ├── test.vcxproj ├── timer.c ├── timer.h ├── timer.sln └── timer.vcxproj /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | 4 | # Custom for Visual Studio 5 | *.cs diff=csharp 6 | *.sln merge=union 7 | *.csproj merge=union 8 | *.vbproj merge=union 9 | *.fsproj merge=union 10 | *.dbproj merge=union 11 | 12 | # Standard to msysgit 13 | *.doc diff=astextplain 14 | *.DOC diff=astextplain 15 | *.docx diff=astextplain 16 | *.DOCX diff=astextplain 17 | *.dot diff=astextplain 18 | *.DOT diff=astextplain 19 | *.pdf diff=astextplain 20 | *.PDF diff=astextplain 21 | *.rtf diff=astextplain 22 | *.RTF diff=astextplain 23 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ################# 2 | ## Eclipse 3 | ################# 4 | 5 | *.pydevproject 6 | .project 7 | .metadata 8 | bin/ 9 | tmp/ 10 | *.tmp 11 | *.bak 12 | *.swp 13 | *~.nib 14 | local.properties 15 | .classpath 16 | .settings/ 17 | .loadpath 18 | 19 | # External tool builders 20 | .externalToolBuilders/ 21 | 22 | # Locally stored "Eclipse launch configurations" 23 | *.launch 24 | 25 | # CDT-specific 26 | .cproject 27 | 28 | # PDT-specific 29 | .buildpath 30 | 31 | 32 | ################# 33 | ## Visual Studio 34 | ################# 35 | 36 | ## Ignore Visual Studio temporary files, build results, and 37 | ## files generated by popular Visual Studio add-ons. 38 | 39 | # User-specific files 40 | *.suo 41 | *.user 42 | *.sln.docstates 43 | 44 | # Build results 45 | [Dd]ebug/ 46 | [Rr]elease/ 47 | *_i.c 48 | *_p.c 49 | *.ilk 50 | *.meta 51 | *.obj 52 | *.pch 53 | *.pdb 54 | *.pgc 55 | *.pgd 56 | *.rsp 57 | *.sbr 58 | *.tlb 59 | *.tli 60 | *.tlh 61 | *.tmp 62 | *.vspscc 63 | .builds 64 | *.dotCover 65 | 66 | ## TODO: If you have NuGet Package Restore enabled, uncomment this 67 | #packages/ 68 | 69 | # Visual C++ cache files 70 | ipch/ 71 | *.aps 72 | *.ncb 73 | *.opensdf 74 | *.sdf 75 | 76 | # Visual Studio profiler 77 | *.psess 78 | *.vsp 79 | 80 | # ReSharper is a .NET coding add-in 81 | _ReSharper* 82 | 83 | # Installshield output folder 84 | [Ee]xpress 85 | 86 | # DocProject is a documentation generator add-in 87 | DocProject/buildhelp/ 88 | DocProject/Help/*.HxT 89 | DocProject/Help/*.HxC 90 | DocProject/Help/*.hhc 91 | DocProject/Help/*.hhk 92 | DocProject/Help/*.hhp 93 | DocProject/Help/Html2 94 | DocProject/Help/html 95 | 96 | # Click-Once directory 97 | publish 98 | 99 | # Others 100 | [Bb]in 101 | [Oo]bj 102 | sql 103 | TestResults 104 | *.Cache 105 | ClientBin 106 | stylecop.* 107 | ~$* 108 | *.dbmdl 109 | Generated_Code #added for RIA/Silverlight projects 110 | 111 | # Backup & report files from converting an old project file to a newer 112 | # Visual Studio version. Backup files are not needed, because we have git ;-) 113 | _UpgradeReport_Files/ 114 | Backup*/ 115 | UpgradeLog*.XML 116 | 117 | 118 | 119 | ############ 120 | ## Windows 121 | ############ 122 | 123 | # Windows image file caches 124 | Thumbs.db 125 | 126 | # Folder config file 127 | Desktop.ini 128 | 129 | 130 | ############# 131 | ## Python 132 | ############# 133 | 134 | *.py[co] 135 | 136 | # Packages 137 | *.egg 138 | *.egg-info 139 | dist 140 | build 141 | eggs 142 | parts 143 | bin 144 | var 145 | sdist 146 | develop-eggs 147 | .installed.cfg 148 | 149 | # Installer logs 150 | pip-log.txt 151 | 152 | # Unit test / coverage reports 153 | .coverage 154 | .tox 155 | 156 | #Translations 157 | *.mo 158 | 159 | #Mr Developer 160 | .mr.developer.cfg 161 | 162 | # Mac crap 163 | .DS_Store 164 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | SRC = timer.c 2 | OBJ = $(SRC:.c=.o) 3 | OUT = libtimer.a 4 | TST = timertest 5 | TSR = test.c 6 | TOB = $(TSR:.c=.o) 7 | 8 | CFLAGS = -O3 9 | LDFLAGS = 10 | 11 | default: $(OUT) $(TST) 12 | 13 | .c.o: 14 | gcc $(CFLAGS) -c $< -o $@ 15 | 16 | $(OUT): $(OBJ) 17 | ar rcs $(OUT) $(OBJ) 18 | 19 | $(TST): $(OUT) $(TOB) 20 | gcc $(CFLAGS) $(LDFLAGS) -o $(TST) $(TOB) $(OUT) -lrt 21 | 22 | clean: 23 | rm -f $(OBJ) $(OUT) $(TOB) $(TST) 24 | -------------------------------------------------------------------------------- /README: -------------------------------------------------------------------------------- 1 | timer_lib - v1.0 - Public Domain - 2011 Mattias Jansson 2 | 3 | This library provides a cross-platform interface to measure 4 | elapsed time with (at least) millisecond accuracy. The latest 5 | source code is always available at 6 | 7 | https://github.com/mjansson/timer_lib 8 | 9 | This library is put in the public domain; you can redistribute 10 | it and/or modify it without any restrictions. 11 | 12 | For a complete cross-platform application framework, look at 13 | the foundation library available at 14 | 15 | https://github.com/mjansson/foundation_lib 16 | 17 | 18 | VERSION HISTORY 19 | 20 | 0.1 (2011-03-15) Initial release 21 | 0.2 (2011-03-20) Removed timer type (always high precision) 22 | Fixed timer_ticks_per_second declaration 23 | Added test application 24 | 0.3 (2011-03-22) Removed unused error checks in POSIX code 25 | Made timeGetTime fallback optional in Windows code (define USE_FALLBACK to 1) 26 | Fixed check of QPC weirdness (signed issue) 27 | 0.4 (2011-03-23) timer_lib_initialize() returns non-zero if failed (no high precision timer available) 28 | Changed POSIX path to use CLOCK_MONOTONIC 29 | POSIX timer_system use CLOCK_REALTIME for actual timestamp 30 | Addded Mach-O path for MacOS X 31 | Changed POSIX path to use nanosecond frequency as returned by clock_gettime 32 | 0.5 (2012-10-01) Merged (cleaned up) MacOSX build fixes from Nicolas Léveillé 33 | 0.6 (2013-01-11) Simplified API, only using tick_t type as timestamp and removing custom timer struct 34 | Removed old legacy fallback code for Windows platform 35 | 0.7 (2013-01-11) Using platform_lib for platform and compiler abstraction 36 | 0.8 (2013-07-30) Made library standalone with no deps (not using deprecated platform_lib) 37 | 1.0 (2021-12-15) Updated and cleaned up for clang 10+ and Visual Studio 2022 38 | -------------------------------------------------------------------------------- /test.c: -------------------------------------------------------------------------------- 1 | #include "timer.h" 2 | 3 | #include 4 | 5 | 6 | int main( int argc, char** argv ) 7 | { 8 | tick_t start, time; 9 | tick_t tick, freq, res; 10 | 11 | printf( "Timer test\n" ); 12 | 13 | timer_lib_initialize(); 14 | 15 | res = 0xFFFFFFFFFFFFFFFFULL; 16 | freq = timer_ticks_per_second(); 17 | start = timer_current(); 18 | 19 | while( 1 ) 20 | { 21 | time = timer_current(); 22 | do { 23 | tick = timer_elapsed_ticks( time ); 24 | } while( !tick ); 25 | 26 | if( tick < res ) 27 | res = tick; 28 | 29 | if( timer_elapsed( start ) > 10.0 ) 30 | break; 31 | } 32 | 33 | printf( "Resolution: %lfms (%d ticks)\n", 1000.0 * (double)timer_ticks_to_seconds( res ), (int)res ); 34 | 35 | timer_lib_shutdown(); 36 | 37 | return 0; 38 | } 39 | 40 | -------------------------------------------------------------------------------- /test.vcxproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Debug 6 | Win32 7 | 8 | 9 | Debug 10 | x64 11 | 12 | 13 | Release 14 | Win32 15 | 16 | 17 | Release 18 | x64 19 | 20 | 21 | 22 | {54E95B82-7759-4825-9478-91E76F1C1C89} 23 | Win32Proj 24 | test 25 | 10.0 26 | 27 | 28 | 29 | Application 30 | true 31 | Unicode 32 | v143 33 | 34 | 35 | Application 36 | true 37 | Unicode 38 | v143 39 | 40 | 41 | Application 42 | false 43 | true 44 | Unicode 45 | v143 46 | 47 | 48 | Application 49 | false 50 | true 51 | Unicode 52 | v143 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | true 72 | 73 | 74 | true 75 | build\$(ProjectName)\$(Platform)\$(Configuration)\ 76 | build\$(ProjectName)\$(Platform)\$(Configuration)\ 77 | 78 | 79 | false 80 | 81 | 82 | false 83 | build\$(ProjectName)\$(Platform)\$(Configuration)\ 84 | build\$(ProjectName)\$(Platform)\$(Configuration)\ 85 | 86 | 87 | 88 | 89 | 90 | Level3 91 | Disabled 92 | WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) 93 | MultiThreadedDebug 94 | ../platform_lib 95 | 96 | 97 | Console 98 | true 99 | winmm.lib;%(AdditionalDependencies) 100 | 101 | 102 | 103 | 104 | 105 | 106 | Level3 107 | Disabled 108 | WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) 109 | MultiThreadedDebug 110 | ../platform_lib 111 | 112 | 113 | Console 114 | true 115 | winmm.lib;%(AdditionalDependencies) 116 | 117 | 118 | 119 | 120 | Level3 121 | 122 | 123 | MaxSpeed 124 | true 125 | true 126 | WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) 127 | MultiThreaded 128 | ../platform_lib 129 | 130 | 131 | Console 132 | true 133 | true 134 | true 135 | winmm.lib;%(AdditionalDependencies) 136 | 137 | 138 | 139 | 140 | Level3 141 | 142 | 143 | MaxSpeed 144 | true 145 | true 146 | WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) 147 | MultiThreaded 148 | ../platform_lib 149 | 150 | 151 | Console 152 | true 153 | true 154 | true 155 | winmm.lib;%(AdditionalDependencies) 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | {321bab92-2ede-4b3b-939d-bd0be0248c8f} 164 | 165 | 166 | 167 | 168 | 169 | -------------------------------------------------------------------------------- /timer.c: -------------------------------------------------------------------------------- 1 | /* timer.h - Cross-platform timer library - Public Domain - 2011 Mattias Jansson / Rampant Pixels 2 | * 3 | * This library provides a cross-platform interface to measure 4 | * elapsed time with (at least) millisecond accuracy. 5 | * 6 | * This library is put in the public domain; you can redistribute 7 | * it and/or modify it without any restrictions. 8 | * 9 | */ 10 | 11 | #include "timer.h" 12 | 13 | #define TIMER_PLATFORM_WINDOWS 0 14 | #define TIMER_PLATFORM_APPLE 0 15 | #define TIMER_PLATFORM_POSIX 0 16 | 17 | #if defined( _WIN32 ) || defined( _WIN64 ) 18 | # undef TIMER_PLATFORM_WINDOWS 19 | # define TIMER_PLATFORM_WINDOWS 1 20 | # define WIN32_LEAN_AND_MEAN 21 | # include 22 | #elif defined( __APPLE__ ) 23 | # undef TIMER_PLATFORM_APPLE 24 | # define TIMER_PLATFORM_APPLE 1 25 | # include 26 | # include 27 | static mach_timebase_info_data_t timerlib_info; 28 | static void absolutetime_to_nanoseconds (uint64_t mach_time, uint64_t* clock ) { *clock = mach_time * timerlib_info.numer / timerlib_info.denom; } 29 | #else 30 | # undef TIMER_PLATFORM_POSIX 31 | # define TIMER_PLATFORM_POSIX 1 32 | # include 33 | # include 34 | # include 35 | #endif 36 | 37 | static tick_t timerlib_freq = 0; 38 | static double timerlib_oofreq = 0; 39 | 40 | 41 | int timer_lib_initialize( void ) 42 | { 43 | #if TIMER_PLATFORM_WINDOWS 44 | tick_t unused; 45 | if( !QueryPerformanceFrequency( (LARGE_INTEGER*)&timerlib_freq ) || 46 | !QueryPerformanceCounter( (LARGE_INTEGER*)&unused ) ) 47 | return -1; 48 | #elif TIMER_PLATFORM_APPLE 49 | if( mach_timebase_info( &timerlib_info ) ) 50 | return -1; 51 | timerlib_freq = 1000000000ULL; 52 | #elif TIMER_PLATFORM_POSIX 53 | struct timespec ts = { .tv_sec = 0, .tv_nsec = 0 }; 54 | if( clock_gettime( CLOCK_MONOTONIC, &ts ) ) 55 | return -1; 56 | timerlib_freq = 1000000000ULL; 57 | #endif 58 | 59 | timerlib_oofreq = 1.0 / (double)timerlib_freq; 60 | 61 | return 0; 62 | } 63 | 64 | 65 | void timer_lib_shutdown( void ) 66 | { 67 | } 68 | 69 | 70 | tick_t timer_current( void ) 71 | { 72 | #if TIMER_PLATFORM_WINDOWS 73 | 74 | tick_t curclock; 75 | QueryPerformanceCounter( (LARGE_INTEGER*)&curclock ); 76 | return curclock; 77 | 78 | #elif TIMER_PLATFORM_APPLE 79 | 80 | tick_t curclock = 0; 81 | absolutetime_to_nanoseconds( mach_absolute_time(), &curclock ); 82 | return curclock; 83 | 84 | #elif TIMER_PLATFORM_POSIX 85 | 86 | struct timespec ts = { .tv_sec = 0, .tv_nsec = 0 }; 87 | clock_gettime( CLOCK_MONOTONIC, &ts ); 88 | return ( (uint64_t)ts.tv_sec * 1000000000ULL ) + ts.tv_nsec; 89 | 90 | #endif 91 | } 92 | 93 | 94 | tick_t timer_ticks_per_second( void ) 95 | { 96 | return timerlib_freq; 97 | } 98 | 99 | 100 | deltatime_t timer_elapsed( const tick_t t ) 101 | { 102 | return (deltatime_t)( (double)timer_elapsed_ticks( t ) * timerlib_oofreq ); 103 | } 104 | 105 | 106 | tick_t timer_elapsed_ticks( const tick_t t ) 107 | { 108 | tick_t dt = 0; 109 | 110 | #if TIMER_PLATFORM_WINDOWS 111 | 112 | tick_t curclock = t; 113 | QueryPerformanceCounter( (LARGE_INTEGER*)&curclock ); 114 | dt = curclock - t; 115 | 116 | #elif TIMER_PLATFORM_APPLE 117 | 118 | tick_t curclock = t; 119 | absolutetime_to_nanoseconds( mach_absolute_time(), &curclock ); 120 | dt = curclock - t; 121 | 122 | #elif TIMER_PLATFORM_POSIX 123 | 124 | tick_t curclock; 125 | struct timespec ts = { .tv_sec = 0, .tv_nsec = 0 }; 126 | clock_gettime( CLOCK_MONOTONIC, &ts ); 127 | 128 | curclock = ( (tick_t)ts.tv_sec * 1000000000ULL ) + ts.tv_nsec; 129 | dt = curclock - t; 130 | 131 | #endif 132 | 133 | return dt; 134 | } 135 | 136 | 137 | deltatime_t timer_ticks_to_seconds( const tick_t dt ) 138 | { 139 | return (deltatime_t)( (double)dt * timerlib_oofreq ); 140 | } 141 | 142 | 143 | #if TIMER_PLATFORM_WINDOWS 144 | struct __timeb64 { 145 | __time64_t time; 146 | unsigned short millitm; 147 | short timezone; 148 | short dstflag; 149 | }; 150 | _CRTIMP errno_t __cdecl _ftime64_s(_Out_ struct __timeb64 * _Time); 151 | #endif 152 | 153 | tick_t timer_system( void ) 154 | { 155 | #if TIMER_PLATFORM_WINDOWS 156 | 157 | struct __timeb64 tb; 158 | _ftime64_s( &tb ); 159 | return ( (tick_t)tb.time * 1000ULL ) + (tick_t)tb.millitm; 160 | 161 | #elif TIMER_PLATFORM_APPLE 162 | 163 | tick_t curclock = 0; 164 | absolutetime_to_nanoseconds( mach_absolute_time(), &curclock ); 165 | return ( curclock / 1000000ULL ); 166 | 167 | #elif TIMER_PLATFORM_POSIX 168 | 169 | struct timespec ts = { .tv_sec = 0, .tv_nsec = 0 }; 170 | clock_gettime( CLOCK_REALTIME, &ts ); 171 | return ( (uint64_t)ts.tv_sec * 1000ULL ) + ( ts.tv_nsec / 1000000ULL ); 172 | 173 | #endif 174 | } 175 | -------------------------------------------------------------------------------- /timer.h: -------------------------------------------------------------------------------- 1 | /* timer.h - Cross-platform timer library - Public Domain - 2011 Mattias Jansson / Rampant Pixels 2 | * 3 | * This library provides a cross-platform interface to measure 4 | * elapsed time with (at least) millisecond accuracy. 5 | * 6 | * This library is put in the public domain; you can redistribute 7 | * it and/or modify it without any restrictions. 8 | * 9 | */ 10 | 11 | #pragma once 12 | 13 | /*! \file timer.h 14 | Time measurements */ 15 | 16 | #if TIMER_COMPILE 17 | #define TIMER_API 18 | #else 19 | #if __cplusplus 20 | #define TIMER_API extern "C" 21 | #else 22 | #define TIMER_API extern 23 | #endif 24 | #endif 25 | 26 | #if defined( _WIN32 ) || defined( _WIN64 ) 27 | 28 | //! Tick type 29 | typedef unsigned __int64 tick_t; 30 | 31 | #else 32 | 33 | #include 34 | //! Tick type 35 | typedef uint64_t tick_t; 36 | 37 | #endif 38 | 39 | //! Deltatime type (float or double) 40 | //typedef float deltatime_t; 41 | typedef double deltatime_t; 42 | 43 | 44 | /*! Initialize timer library */ 45 | TIMER_API int timer_lib_initialize( void ); 46 | 47 | /*! Shutdown timer library */ 48 | TIMER_API void timer_lib_shutdown( void ); 49 | 50 | /*! Get current timestamp, in ticks of system-specific frequency (queryable with timer_ticks_per_second), measured from some system-specific base timestamp 51 | and not in sync with other timestamps 52 | \return Current timestamp */ 53 | TIMER_API tick_t timer_current( void ); 54 | 55 | /*! Get elapsed time since given timestamp 56 | \param t Timestamp 57 | \return Number of seconds elapsed */ 58 | TIMER_API deltatime_t timer_elapsed( const tick_t t ); 59 | 60 | /*! Get elapsed ticks since given timestamp 61 | \param t Timestamp 62 | \return Number of ticks elapsed */ 63 | TIMER_API tick_t timer_elapsed_ticks( const tick_t t ); 64 | 65 | /*! Get timer frequency, as number of ticks per second 66 | \return Ticks per second */ 67 | TIMER_API tick_t timer_ticks_per_second( void ); 68 | 69 | /*! Get ticks as seconds (effectively calculating ticks/timer_ticks_per_second()) 70 | \param dt Deltatime in ticks 71 | \return Deltatime in seconds */ 72 | TIMER_API deltatime_t timer_ticks_to_seconds( const tick_t dt ); 73 | 74 | /*! Get system time, in milliseconds since the epoch (UNIX time) 75 | \return Current timestamp, in milliseconds */ 76 | TIMER_API tick_t timer_system( void ); 77 | 78 | -------------------------------------------------------------------------------- /timer.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 11.00 3 | # Visual Studio 2010 4 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "timer", "timer.vcxproj", "{321BAB92-2EDE-4B3B-939D-BD0BE0248C8F}" 5 | EndProject 6 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test", "test.vcxproj", "{54E95B82-7759-4825-9478-91E76F1C1C89}" 7 | EndProject 8 | Global 9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 10 | Debug|Win32 = Debug|Win32 11 | Debug|x64 = Debug|x64 12 | Release|Win32 = Release|Win32 13 | Release|x64 = Release|x64 14 | EndGlobalSection 15 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 16 | {321BAB92-2EDE-4B3B-939D-BD0BE0248C8F}.Debug|Win32.ActiveCfg = Debug|Win32 17 | {321BAB92-2EDE-4B3B-939D-BD0BE0248C8F}.Debug|Win32.Build.0 = Debug|Win32 18 | {321BAB92-2EDE-4B3B-939D-BD0BE0248C8F}.Debug|x64.ActiveCfg = Debug|x64 19 | {321BAB92-2EDE-4B3B-939D-BD0BE0248C8F}.Debug|x64.Build.0 = Debug|x64 20 | {321BAB92-2EDE-4B3B-939D-BD0BE0248C8F}.Release|Win32.ActiveCfg = Release|Win32 21 | {321BAB92-2EDE-4B3B-939D-BD0BE0248C8F}.Release|Win32.Build.0 = Release|Win32 22 | {321BAB92-2EDE-4B3B-939D-BD0BE0248C8F}.Release|x64.ActiveCfg = Release|x64 23 | {321BAB92-2EDE-4B3B-939D-BD0BE0248C8F}.Release|x64.Build.0 = Release|x64 24 | {54E95B82-7759-4825-9478-91E76F1C1C89}.Debug|Win32.ActiveCfg = Debug|Win32 25 | {54E95B82-7759-4825-9478-91E76F1C1C89}.Debug|Win32.Build.0 = Debug|Win32 26 | {54E95B82-7759-4825-9478-91E76F1C1C89}.Debug|x64.ActiveCfg = Debug|x64 27 | {54E95B82-7759-4825-9478-91E76F1C1C89}.Debug|x64.Build.0 = Debug|x64 28 | {54E95B82-7759-4825-9478-91E76F1C1C89}.Release|Win32.ActiveCfg = Release|Win32 29 | {54E95B82-7759-4825-9478-91E76F1C1C89}.Release|Win32.Build.0 = Release|Win32 30 | {54E95B82-7759-4825-9478-91E76F1C1C89}.Release|x64.ActiveCfg = Release|x64 31 | {54E95B82-7759-4825-9478-91E76F1C1C89}.Release|x64.Build.0 = Release|x64 32 | EndGlobalSection 33 | GlobalSection(SolutionProperties) = preSolution 34 | HideSolutionNode = FALSE 35 | EndGlobalSection 36 | EndGlobal 37 | -------------------------------------------------------------------------------- /timer.vcxproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Debug 6 | Win32 7 | 8 | 9 | Debug 10 | x64 11 | 12 | 13 | Release 14 | Win32 15 | 16 | 17 | Release 18 | x64 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | {321BAB92-2EDE-4B3B-939D-BD0BE0248C8F} 29 | Win32Proj 30 | timer 31 | 10.0 32 | 33 | 34 | 35 | StaticLibrary 36 | true 37 | Unicode 38 | v143 39 | 40 | 41 | StaticLibrary 42 | true 43 | Unicode 44 | v143 45 | 46 | 47 | StaticLibrary 48 | false 49 | true 50 | Unicode 51 | v143 52 | 53 | 54 | StaticLibrary 55 | false 56 | true 57 | Unicode 58 | v143 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | $(SolutionDir) 78 | $(Platform)\$(Configuration)\ 79 | $(ProjectName)32d 80 | 81 | 82 | $(SolutionDir) 83 | build\$(ProjectName)\$(Platform)\$(Configuration)\ 84 | $(ProjectName)64d 85 | 86 | 87 | $(SolutionDir) 88 | $(Platform)\$(Configuration)\ 89 | $(ProjectName)32 90 | 91 | 92 | $(SolutionDir) 93 | build\$(ProjectName)\$(Platform)\$(Configuration)\ 94 | $(ProjectName)64 95 | 96 | 97 | 98 | 99 | 100 | Level3 101 | Disabled 102 | TIMER_COMPILE;%(PreprocessorDefinitions) 103 | ProgramDatabase 104 | false 105 | false 106 | false 107 | false 108 | false 109 | false 110 | MultiThreadedDebug 111 | false 112 | Fast 113 | false 114 | false 115 | false 116 | false 117 | 118 | 119 | 120 | 121 | Windows 122 | true 123 | 124 | 125 | 126 | 127 | 128 | 129 | Level3 130 | Disabled 131 | TIMER_COMPILE;%(PreprocessorDefinitions) 132 | ProgramDatabase 133 | false 134 | false 135 | false 136 | false 137 | false 138 | false 139 | MultiThreadedDebug 140 | false 141 | Fast 142 | false 143 | false 144 | false 145 | false 146 | 147 | 148 | 149 | 150 | Windows 151 | true 152 | 153 | 154 | 155 | 156 | Level3 157 | 158 | 159 | MaxSpeed 160 | false 161 | true 162 | TIMER_COMPILE;%(PreprocessorDefinitions) 163 | ProgramDatabase 164 | false 165 | false 166 | Speed 167 | false 168 | true 169 | true 170 | false 171 | MultiThreaded 172 | false 173 | Fast 174 | false 175 | false 176 | false 177 | false 178 | 179 | 180 | 181 | 182 | Windows 183 | true 184 | true 185 | true 186 | 187 | 188 | 189 | 190 | Level3 191 | 192 | 193 | MaxSpeed 194 | false 195 | true 196 | TIMER_COMPILE;%(PreprocessorDefinitions) 197 | ProgramDatabase 198 | false 199 | false 200 | Speed 201 | false 202 | true 203 | true 204 | false 205 | MultiThreaded 206 | false 207 | Fast 208 | false 209 | false 210 | false 211 | false 212 | 213 | 214 | 215 | 216 | Windows 217 | true 218 | true 219 | true 220 | 221 | 222 | 223 | 224 | 225 | --------------------------------------------------------------------------------