mirror of
https://bitbucket.org/Mattrixwv/csclasses.git
synced 2025-12-06 18:23:58 -05:00
Initial commit with Stopwatch
This commit is contained in:
7
.gitignore
vendored
Normal file
7
.gitignore
vendored
Normal file
@@ -0,0 +1,7 @@
|
||||
#Ignore IDE files
|
||||
.vs
|
||||
.vscode
|
||||
|
||||
#Ignore compiled code
|
||||
CSClasses/bin
|
||||
CSClasses/obj
|
||||
25
CSClasses.sln
Normal file
25
CSClasses.sln
Normal file
@@ -0,0 +1,25 @@
|
||||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio Version 16
|
||||
VisualStudioVersion = 16.0.30413.136
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CSClasses", "CSClasses\CSClasses.csproj", "{A3C01050-4957-4AF3-8908-21966FD99A06}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
Release|Any CPU = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{A3C01050-4957-4AF3-8908-21966FD99A06}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{A3C01050-4957-4AF3-8908-21966FD99A06}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{A3C01050-4957-4AF3-8908-21966FD99A06}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{A3C01050-4957-4AF3-8908-21966FD99A06}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||
SolutionGuid = {B0128E8F-6695-4A7B-8336-9797AD19FC98}
|
||||
EndGlobalSection
|
||||
EndGlobal
|
||||
7
CSClasses/CSClasses.csproj
Normal file
7
CSClasses/CSClasses.csproj
Normal file
@@ -0,0 +1,7 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>netstandard2.0</TargetFramework>
|
||||
</PropertyGroup>
|
||||
|
||||
</Project>
|
||||
184
CSClasses/Stopwatch.cs
Normal file
184
CSClasses/Stopwatch.cs
Normal file
@@ -0,0 +1,184 @@
|
||||
//C#/CSClasses/Stopwatch.cs
|
||||
//Matthew Ellison
|
||||
// Created: 08-21-20
|
||||
//Modified: 08-21-20
|
||||
//This file contains a class that is used to time the execution time of other programs
|
||||
/*
|
||||
Copyright (C) 2020 Matthew Ellison
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
namespace mee{
|
||||
public class Stopwatch{
|
||||
//Variables
|
||||
private System.Diagnostics.Stopwatch stopwatch = new System.Diagnostics.Stopwatch(); //The stopwatch that is used
|
||||
private enum TIME_RESOLUTION{ NANOSECOND, MICROSECOND, MILLISECOND, SECOND, MINUTE, HOUR, ERROR };
|
||||
private const int NUM_TO_RUN = 100000;
|
||||
//Functions
|
||||
//Constructor makes sure all values are set to defaults
|
||||
public Stopwatch(){
|
||||
}
|
||||
//Returns a long with the elapsed time in nanoseconds. Used by other functions to get the time before converting it to the correct resolution
|
||||
private long getTime(){
|
||||
return stopwatch.ElapsedTicks;
|
||||
}
|
||||
//Simultates starting a stopwatch
|
||||
public void start(){
|
||||
stopwatch.Start();
|
||||
}
|
||||
//Simulates stopping a stopwatch
|
||||
public void stop(){
|
||||
stopwatch.Stop();
|
||||
}
|
||||
//Resets all the variables in teh stopwatch
|
||||
public void reset(){
|
||||
stopwatch.Reset();
|
||||
}
|
||||
//Returns the timer in nanoseconds
|
||||
public decimal getNano(){
|
||||
//Each tick = 100 nanoseconds
|
||||
return (decimal)stopwatch.ElapsedTicks * 100m;
|
||||
}
|
||||
//Returns the timer in microseconds
|
||||
public decimal getMicro(){
|
||||
return (decimal)stopwatch.ElapsedTicks / 10m;
|
||||
}
|
||||
//Returns the timer in milliseconds
|
||||
public decimal getMilli(){
|
||||
return (decimal)stopwatch.ElapsedTicks / 10000m;
|
||||
}
|
||||
//Returns the timer in seconds
|
||||
public decimal getSecond(){
|
||||
return (decimal)stopwatch.ElapsedTicks / 10000000m;
|
||||
}
|
||||
//Returns the timer in minutes
|
||||
public decimal getMinute(){
|
||||
return (decimal)stopwatch.ElapsedTicks / 600000000m;
|
||||
}
|
||||
//Returns the timer in hours
|
||||
public decimal getHour(){
|
||||
return (decimal)stopwatch.ElapsedTicks / 36000000000m;
|
||||
}
|
||||
//Returns the timer as a string at the 'best' resolution. (Goal is xxx.xxx)
|
||||
public string getStr(){
|
||||
//Get the current duration from time
|
||||
return getStr(getNano());
|
||||
}
|
||||
//Returns a string of the decimal value passed in (assuming the value in nanoseconds)
|
||||
public static string getStr(decimal nanoseconds){
|
||||
decimal duration = nanoseconds;
|
||||
//Reduce the number to the appropriate number of digits. (xxx.x)
|
||||
//This loop works down to seconds
|
||||
TIME_RESOLUTION resolution = new TIME_RESOLUTION();
|
||||
for(resolution = TIME_RESOLUTION.NANOSECOND;(resolution < TIME_RESOLUTION.SECOND) && (duration >= 1000);++resolution){
|
||||
duration /= 1000;
|
||||
}
|
||||
//Check if the duration needs reduced to minutes
|
||||
if((duration >= 120) && (resolution == TIME_RESOLUTION.SECOND)){
|
||||
//Reduce to mintues
|
||||
duration /= 60;
|
||||
++resolution;
|
||||
|
||||
//Check if the duration needs reduced to hours
|
||||
if(duration >= 60){
|
||||
//Reduce to hours
|
||||
duration /= 60;
|
||||
++resolution;
|
||||
}
|
||||
}
|
||||
|
||||
//Turn the number into a string
|
||||
//string time = string.Format("{0C3}", duration);
|
||||
string time = duration.ToString("C3").Substring(1);
|
||||
|
||||
//Tack on the appropriate suffix for resolution
|
||||
switch(resolution){
|
||||
case TIME_RESOLUTION.NANOSECOND: time += " nanoseconds"; break;
|
||||
case TIME_RESOLUTION.MICROSECOND: time += " microseconds"; break;
|
||||
case TIME_RESOLUTION.MILLISECOND: time += " milliseconds"; break;
|
||||
case TIME_RESOLUTION.SECOND: time += " seconds"; break;
|
||||
case TIME_RESOLUTION.MINUTE: time += " minutes"; break;
|
||||
case TIME_RESOLUTION.HOUR: time += " hours"; break;
|
||||
case TIME_RESOLUTION.ERROR:
|
||||
default: time = "There was an error computing the time"; break; //TODO: This should throw an exception instead
|
||||
}
|
||||
//Return the string
|
||||
return time;
|
||||
}
|
||||
//Overrides default tostring. returns getStr
|
||||
public override string ToString(){
|
||||
return getStr();
|
||||
}
|
||||
|
||||
//Tests
|
||||
public static void Main(string[] args){
|
||||
System.Console.WriteLine("Testing start/stop");
|
||||
testStartStop();
|
||||
System.Console.WriteLine("start/stop completed successfully");
|
||||
System.Console.WriteLine("Testing conversion");
|
||||
testConversion();
|
||||
System.Console.WriteLine("conversion test completed successfully");
|
||||
System.Console.WriteLine("Testing stringConversion");
|
||||
testStringConversion();
|
||||
System.Console.WriteLine("stringConversion completed successfully");
|
||||
}
|
||||
public static void testStartStop(){
|
||||
Stopwatch timer = new Stopwatch();
|
||||
timer.start();
|
||||
timer.stop();
|
||||
//If it gets here without throwing an exception everything went well
|
||||
}
|
||||
public static void testConversion(){
|
||||
Stopwatch timer = new Stopwatch();
|
||||
int sum = 0;
|
||||
//Start the timer
|
||||
timer.start();
|
||||
//Do something to run some time
|
||||
for(int cnt = 0;cnt < NUM_TO_RUN;++cnt){
|
||||
sum += cnt;
|
||||
}
|
||||
//Stop the timer
|
||||
timer.stop();
|
||||
//Assert something so the sum isn't ignored during compile
|
||||
System.Diagnostics.Debug.Assert(sum != 0);
|
||||
//Check that the different resolutions work out correctly
|
||||
decimal nano = timer.getNano();
|
||||
System.Diagnostics.Debug.Assert(timer.getMicro() == (nano / 1000m), "Micro resolution test failed");
|
||||
System.Diagnostics.Debug.Assert(timer.getMilli() == (nano / 1000000m), "Milli resolution test failed");
|
||||
System.Diagnostics.Debug.Assert(timer.getSecond() == (nano / 1000000000m), "Second resolution test failed");
|
||||
System.Diagnostics.Debug.Assert(timer.getMinute() == (nano / 60000000000m), "Minute resolution test failed");
|
||||
System.Diagnostics.Debug.Assert(timer.getHour() == (nano / 3600000000000m), "Hour resolution test failed");
|
||||
}
|
||||
public static void testStringConversion(){
|
||||
//Test nanoseconds
|
||||
string results = Stopwatch.getStr(1.0m);
|
||||
System.Diagnostics.Debug.Assert(results == "1.000 nanoseconds", "Failed nanoseconds: " + results);
|
||||
//Test microseconds
|
||||
results = Stopwatch.getStr(1.0e3m);
|
||||
System.Diagnostics.Debug.Assert(results == "1.00 microsesconds", "Failed microseconds: " + results);
|
||||
//Test milliseconds
|
||||
results = Stopwatch.getStr(1.0e6m);
|
||||
System.Diagnostics.Debug.Assert(results == "1.00 milliseconds", "Failed milliseconds: " + results);
|
||||
//Test seconds
|
||||
results = Stopwatch.getStr(1.0e9m);
|
||||
System.Diagnostics.Debug.Assert(results == "1.00 seconds", "Failed seconds: " + results);
|
||||
//Test minutes
|
||||
results = Stopwatch.getStr(1.0e12m);
|
||||
System.Diagnostics.Debug.Assert(results == "1.00 minutes", "Failed minutes: " + results);
|
||||
//Test hours
|
||||
results = Stopwatch.getStr(1.0e13m);
|
||||
System.Diagnostics.Debug.Assert(results == "1.00 hours", "Failed hours: " + results);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user