aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordam <dam@gudinoff>2022-11-15 01:12:42 +0000
committerdam <dam@gudinoff>2022-11-15 01:12:42 +0000
commit01ea9b45bcbb950a51fcb2eedba1b563d8044805 (patch)
tree21cbca63474cbc7fc35c63997e7757f823b1700c
parent625b44ca131d4b74c73ffb32aef19c35aa08cb09 (diff)
downloadtask-time-tracker-01ea9b45bcbb950a51fcb2eedba1b563d8044805.tar.zst
task-time-tracker-01ea9b45bcbb950a51fcb2eedba1b563d8044805.zip
Fixed bug on import_from_csv.
-rw-r--r--main.c97
1 files changed, 97 insertions, 0 deletions
diff --git a/main.c b/main.c
index 10d3c62..628bb94 100644
--- a/main.c
+++ b/main.c
@@ -460,10 +460,34 @@ void update_times(database_st *db) {
}
}
+int64_t super_add(int64_t x, int64_t y) {
+ int64_t result;
+ if (__builtin_add_overflow(x, y, &result)) {
+ result = (x > 0 ? INT64_MAX : INT64_MIN);
+// result = (x >> 63) ^ INT64_MAX;
+// result = ((uint64_t)x >> 63) + INT64_MAX;
+ }
+ return result;
+}
+
// Recalculates database totals.
void update_total_times(database_st *db) {
assert(db != NULL);
+ /*
+ // 100 MOPS
+ int64_t *total_times = db->total_times;
+ memset(db->total_times, 0, NUM_WEEK_DAYS * SIZEOF_INT64);
+ for (size_t idx = 0; idx < db->count; idx++) {
+ int64_t *times = db->tasks[idx].times;
+ for (int it = 0; it < NUM_WEEK_DAYS; it++) {
+ total_times[it] = add_int64(total_times[it], times[it]);
+ }
+ }
+ */
+
+ /*
+ // 120 MOPS
int64_t *d0 = &db->total_times[0];
int64_t *d1 = &db->total_times[1];
int64_t *d2 = &db->total_times[2];
@@ -483,6 +507,66 @@ void update_total_times(database_st *db) {
*d5 = add_int64(*d5, times[5]);
*d6 = add_int64(*d6, times[6]);
}
+ */
+
+ /*
+ // 122 MOPS
+ memset(db->total_times, 0, NUM_WEEK_DAYS * SIZEOF_INT64);
+ for (size_t idx = 0; idx < db->count; idx++) {
+ int64_t *times = db->tasks[idx].times;
+ db->total_times[0] = add_int64(db->total_times[0], times[0]);
+ db->total_times[1] = add_int64(db->total_times[1], times[1]);
+ db->total_times[2] = add_int64(db->total_times[2], times[2]);
+ db->total_times[3] = add_int64(db->total_times[3], times[3]);
+ db->total_times[4] = add_int64(db->total_times[4], times[4]);
+ db->total_times[5] = add_int64(db->total_times[5], times[5]);
+ db->total_times[6] = add_int64(db->total_times[6], times[6]);
+ }
+ */
+
+ /*
+ // 140 MOPS
+ memset(db->total_times, 0, NUM_WEEK_DAYS * SIZEOF_INT64);
+ for (size_t idx = 0; idx < db->count; idx++) {
+ int64_t *times = db->tasks[idx].times;
+ __builtin_add_overflow(db->total_times[0], times[0], &db->total_times[0]);
+ __builtin_add_overflow(db->total_times[1], times[1], &db->total_times[1]);
+ __builtin_add_overflow(db->total_times[2], times[2], &db->total_times[2]);
+ __builtin_add_overflow(db->total_times[3], times[3], &db->total_times[3]);
+ __builtin_add_overflow(db->total_times[4], times[4], &db->total_times[4]);
+ __builtin_add_overflow(db->total_times[5], times[5], &db->total_times[5]);
+ __builtin_add_overflow(db->total_times[6], times[6], &db->total_times[6]);
+ }
+ */
+
+ // 140 MOPS
+ memset(db->total_times, 0, NUM_WEEK_DAYS * SIZEOF_INT64);
+ for (size_t idx = 0; idx < db->count; idx++) {
+ int64_t *times = db->tasks[idx].times;
+ db->total_times[0] = super_add(db->total_times[0], times[0]);
+ db->total_times[1] = super_add(db->total_times[1], times[1]);
+ db->total_times[2] = super_add(db->total_times[2], times[2]);
+ db->total_times[3] = super_add(db->total_times[3], times[3]);
+ db->total_times[4] = super_add(db->total_times[4], times[4]);
+ db->total_times[5] = super_add(db->total_times[5], times[5]);
+ db->total_times[6] = super_add(db->total_times[6], times[6]);
+ }
+
+ /*
+ // 110 MOPS
+ memset(db->total_times, 0, NUM_WEEK_DAYS * SIZEOF_INT64);
+ int64_t *totals = db->total_times;
+ for (size_t idx = 0; idx < db->count; idx++) {
+ const int64_t *restrict times = db->tasks[idx].times;
+ totals[0] = add_int64(totals[0], times[0]);
+ totals[1] = add_int64(totals[1], times[1]);
+ totals[2] = add_int64(totals[2], times[2]);
+ totals[3] = add_int64(totals[3], times[3]);
+ totals[4] = add_int64(totals[4], times[4]);
+ totals[5] = add_int64(totals[5], times[5]);
+ totals[6] = add_int64(totals[6], times[6]);
+ }
+ */
}
// Resets the times of the provided task (and adjusts database totals).
@@ -1256,6 +1340,19 @@ int main(int argc, char *argv[]) {
load_database(&database, db_file_path);
+ // TODO WIP WIP
+ clock_t start = clock() ;
+ update_total_times(&database);
+ clock_t end = clock() ;
+ double time_sec = (end-start) / (double)CLOCKS_PER_SEC;
+ double speed = (double)database.count / (1000000.0 * time_sec);
+ double usPM = 1000000.0 * 1000.0 * time_sec / (double)database.count;
+ endwin();
+ fprintf(stderr, "update of %zd took: %9.3fms\n", database.count, time_sec);
+ fprintf(stderr, "speed: %9.3f MOPS\n", speed);
+ fprintf(stderr, "tpm : %9.3f usPM\n", usPM);
+ return EXIT_FAILURE;
+
flushinp();
ungetch(KEY_RESIZE);
for (int key; ((key = getch()) != 'q') && (key != 'Q'); ) {