Add points option to timer. Do iterations over solution to get averages

This commit is contained in:
2025-12-01 16:01:41 -05:00
parent 14607dbad6
commit 9d5739e088
2 changed files with 47 additions and 31 deletions

View File

@@ -3,10 +3,13 @@
#include <chrono> #include <chrono>
#include <iostream> #include <iostream>
#include <string>
#include <map>
#include <unordered_map>
class Timer { class Timer {
public: public:
Timer() { explicit Timer(const int iter = 1) : iterations(iter) {
running = true; running = true;
start = std::chrono::high_resolution_clock::now(); start = std::chrono::high_resolution_clock::now();
} }
@@ -16,18 +19,26 @@ public:
running = false; running = false;
}; };
void add_point(const std::string &name) {
points[name] = std::chrono::high_resolution_clock::now();
}
void print () { void print () {
if (running) { stop(); }; if (running) { stop(); };
const auto seconds = std::chrono::duration_cast<std::chrono::seconds>(end - start);
const auto ms = std::chrono::duration_cast<std::chrono::milliseconds>(end - start); std::cout << "\n# Execution time # \n";
const auto us = std::chrono::duration_cast<std::chrono::microseconds>(end - start); for (const auto &[name, time] : points) {
std::cout << "\n# Execution time # \n\t" << seconds.count() << " s\n\t" << ms.count() << " ms\n\t" << us.count() << " us" << std::endl; std::cout << "\t" << name << ": " << std::chrono::duration_cast<std::chrono::milliseconds>(time - start).count() << " ms | " << std::chrono::duration_cast<std::chrono::microseconds>(time - start).count() << " us" << std::endl;
}
std::cout << "Global: " << std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count() / iterations << " ms | " << std::chrono::duration_cast<std::chrono::microseconds>(end-start).count() / iterations << " us" << std::endl;
} }
private: private:
bool running = false; bool running = false;
std::chrono::time_point<std::chrono::system_clock> start; std::chrono::time_point<std::chrono::system_clock> start;
std::chrono::time_point<std::chrono::system_clock> end; std::chrono::time_point<std::chrono::system_clock> end;
std::unordered_map<std::string, std::chrono::time_point<std::chrono::system_clock>> points;
int iterations;
}; };
#endif //ADVENTOFCODE2025_TIMER_H #endif //ADVENTOFCODE2025_TIMER_H

View File

@@ -66,43 +66,48 @@
#include "timer.h" #include "timer.h"
int main() { int main() {
Timer timer; constexpr int iterations = 1000;
Timer timer(iterations);
std::ifstream stream("input/day1/p1.txt", std::ios::binary | std::ios::ate);
const auto size = stream.tellg();
stream.seekg(0);
std::vector<char> buffer(size);
stream.read(buffer.data(), size);
stream.close();
int state = 50;
int password = 0; int password = 0;
const char* ptr = buffer.data(); for (int i = 0; i < iterations; ++i) {
const char* end = ptr + size; std::ifstream stream("input/day1/p1.txt", std::ios::binary | std::ios::ate);
const auto size = stream.tellg();
stream.seekg(0);
std::vector<char> buffer(size);
stream.read(buffer.data(), size);
while (ptr < end) { int state = 50;
const bool is_right = (*ptr == 'R');
++ptr;
int number;
auto [next, ec] = std::from_chars(ptr, end, number);
ptr = next;
if (ptr < end && *ptr == '\r') ++ptr; const char* ptr = buffer.data();
if (ptr < end && *ptr == '\n') ++ptr; const char* end = ptr + size;
if (is_right) { while (ptr < end) {
state = (state + number) % 100; const bool is_right = (*ptr == 'R');
} else { ++ptr;
state = (state + 100 - number % 100) % 100;
int number;
auto [next, ec] = std::from_chars(ptr, end, number);
ptr = next;
if (ptr < end && *ptr == '\r') ++ptr;
if (ptr < end && *ptr == '\n') ++ptr;
if (is_right) {
state = (state + number) % 100;
} else {
state = (state + 100 - number % 100) % 100;
}
password += (state == 0);
} }
password += (state == 0); stream.close();
} }
timer.stop(); timer.stop();
std::cout << "Password: " << password << std::endl; std::cout << "Password: " << password / iterations << std::endl;
timer.print(); timer.print();