diff --git a/src/profiler.c b/src/profiler.c
index ad8338eebfd130d4088f9fd9d4fcc9856c8cc731..133dff3f88261d6618be1f45ffe263524c744b14 100644
--- a/src/profiler.c
+++ b/src/profiler.c
@@ -31,6 +31,46 @@
 #include "hydro.h"
 #include "version.h"
 
+/* Array to store the list of file names. Order must match profiler_types
+ * enumerator and profiler_func_names. */
+const char *profiler_file_names[profiler_length] = {"enginecollecttimesteps",
+                                                    "enginedrift",
+                                                    "enginerebuild",
+                                                    "schedulerreweight",
+                                                    "schedulerclearwaits",
+                                                    "schedulerrewait",
+                                                    "schedulerenqueue",
+                                                    "engineprintstats",
+                                                    "enginelaunch",
+                                                    "spacerebuild",
+                                                    "enginemaketasks",
+                                                    "enginemarktasks",
+                                                    "spaceregrid",
+                                                    "spacepartssort",
+                                                    "spacesplit",
+                                                    "spacegetcellid",
+                                                    "spacecountparts"};
+
+/* Array to store the list of function names. Order must match profiler_types
+ * enumerator and profiler_file_names. */
+const char *profiler_func_names[profiler_length] = {"engine_collect_timesteps",
+                                                    "engine_drift",
+                                                    "engine_rebuild",
+                                                    "scheduler_reweight",
+                                                    "scheduler_clear_waits",
+                                                    "scheduler_rewait",
+                                                    "scheduler_enqueue",
+                                                    "engine_print_stats",
+                                                    "engine_launch",
+                                                    "space_rebuild",
+                                                    "engine_maketasks",
+                                                    "engine_marktasks",
+                                                    "space_regrid",
+                                                    "space_parts_sort",
+                                                    "space_split",
+                                                    "space_get_cell_id",
+                                                    "space_count_parts"};
+
 /**
  * @brief Resets all timers.
  *
@@ -38,24 +78,8 @@
  * function timers.
  */
 void profiler_reset_timers(struct profiler *profiler) {
-
-  profiler->collect_timesteps_time = 0;
-  profiler->drift_time = 0;
-  profiler->rebuild_time = 0;
-  profiler->reweight_time = 0;
-  profiler->clear_waits_time = 0;
-  profiler->re_wait_time = 0;
-  profiler->enqueue_time = 0;
-  profiler->stats_time = 0;
-  profiler->launch_time = 0;
-  profiler->space_rebuild_time = 0;
-  profiler->engine_maketasks_time = 0;
-  profiler->engine_marktasks_time = 0;
-  profiler->space_regrid_time = 0;
-  profiler->space_parts_sort_time = 0;
-  profiler->space_split_time = 0;
-  profiler->space_parts_get_cell_id_time = 0;
-  profiler->space_count_parts_time = 0;
+  /* Iterate over times array and reset values. */
+  for (int i = 0; i < profiler_length; i++) profiler->times[i] = 0;
 }
 
 /**
@@ -66,8 +90,9 @@ void profiler_reset_timers(struct profiler *profiler) {
  * @param functionName name of function that is being timed.
  * @param file (return) pointer used to open output file.
  */
-void profiler_write_timing_info_header(const struct engine *e, char *fileName,
-                                       char *functionName, FILE **file) {
+void profiler_write_timing_info_header(const struct engine *e,
+                                       const char *fileName,
+                                       const char *functionName, FILE **file) {
 
   /* Create the file name in the format: "fileName_(no. of threads)" */
   char fullFileName[200] = "";
@@ -103,44 +128,11 @@ void profiler_write_timing_info_header(const struct engine *e, char *fileName,
  */
 void profiler_write_all_timing_info_headers(const struct engine *e,
                                             struct profiler *profiler) {
-
-  profiler_write_timing_info_header(e, "enginecollecttimesteps",
-                                    "engine_collect_timesteps",
-                                    &profiler->file_engine_collect_timesteps);
-  profiler_write_timing_info_header(e, "enginedrift", "engine_drift",
-                                    &profiler->file_engine_drift);
-  profiler_write_timing_info_header(e, "enginerebuild", "engine_rebuild",
-                                    &profiler->file_engine_rebuild);
-  profiler_write_timing_info_header(e, "schedulerreweight",
-                                    "scheduler_reweight",
-                                    &profiler->file_scheduler_reweight);
-  profiler_write_timing_info_header(e, "schedulerclearwaits",
-                                    "scheduler_clear_waits",
-                                    &profiler->file_scheduler_clear_waits);
-  profiler_write_timing_info_header(e, "schedulerrewait", "scheduler_rewait",
-                                    &profiler->file_scheduler_re_wait);
-  profiler_write_timing_info_header(e, "schedulerenqueue", "scheduler_enqueue",
-                                    &profiler->file_scheduler_enqueue);
-  profiler_write_timing_info_header(e, "engineprintstats", "engine_print_stats",
-                                    &profiler->file_engine_stats);
-  profiler_write_timing_info_header(e, "enginelaunch", "engine_launch",
-                                    &profiler->file_engine_launch);
-  profiler_write_timing_info_header(e, "spacerebuild", "space_rebuild",
-                                    &profiler->file_space_rebuild);
-  profiler_write_timing_info_header(e, "enginemaketasks", "engine_maketasks",
-                                    &profiler->file_engine_maketasks);
-  profiler_write_timing_info_header(e, "enginemarktasks", "engine_marktasks",
-                                    &profiler->file_engine_marktasks);
-  profiler_write_timing_info_header(e, "spaceregrid", "space_regrid",
-                                    &profiler->file_space_regrid);
-  profiler_write_timing_info_header(e, "spacepartssort", "space_parts_sort",
-                                    &profiler->file_space_parts_sort);
-  profiler_write_timing_info_header(e, "spacesplit", "space_split",
-                                    &profiler->file_space_split);
-  profiler_write_timing_info_header(e, "spacegetcellid", "space_get_cell_id",
-                                    &profiler->file_space_parts_get_cell_id);
-  profiler_write_timing_info_header(e, "spacecountparts", "space_count_parts",
-                                    &profiler->file_space_count_parts);
+  /* Iterate over files array and write file headers. */
+  for (int i = 0; i < profiler_length; i++) {
+    profiler_write_timing_info_header(
+        e, profiler_file_names[i], profiler_func_names[i], &profiler->files[i]);
+  }
 }
 
 /**
@@ -169,39 +161,10 @@ void profiler_write_timing_info(const struct engine *e, ticks time,
 void profiler_write_all_timing_info(const struct engine *e,
                                     struct profiler *profiler) {
 
-  profiler_write_timing_info(e, profiler->drift_time,
-                             profiler->file_engine_drift);
-  profiler_write_timing_info(e, profiler->rebuild_time,
-                             profiler->file_engine_rebuild);
-  profiler_write_timing_info(e, profiler->reweight_time,
-                             profiler->file_scheduler_reweight);
-  profiler_write_timing_info(e, profiler->clear_waits_time,
-                             profiler->file_scheduler_clear_waits);
-  profiler_write_timing_info(e, profiler->re_wait_time,
-                             profiler->file_scheduler_re_wait);
-  profiler_write_timing_info(e, profiler->enqueue_time,
-                             profiler->file_scheduler_enqueue);
-  profiler_write_timing_info(e, profiler->stats_time,
-                             profiler->file_engine_stats);
-  profiler_write_timing_info(e, profiler->launch_time,
-                             profiler->file_engine_launch);
-  profiler_write_timing_info(e, profiler->space_rebuild_time,
-                             profiler->file_space_rebuild);
-  profiler_write_timing_info(e, profiler->engine_maketasks_time,
-                             profiler->file_engine_maketasks);
-  profiler_write_timing_info(e, profiler->engine_marktasks_time,
-                             profiler->file_engine_marktasks);
-  profiler_write_timing_info(e, profiler->space_regrid_time,
-                             profiler->file_space_regrid);
-  profiler_write_timing_info(e, profiler->space_parts_sort_time,
-                             profiler->file_space_parts_sort);
-  profiler_write_timing_info(e, profiler->space_split_time,
-                             profiler->file_space_split);
-  profiler_write_timing_info(e, profiler->space_parts_get_cell_id_time,
-                             profiler->file_space_parts_get_cell_id);
-  profiler_write_timing_info(e, profiler->space_count_parts_time,
-                             profiler->file_space_count_parts);
-
+  /* Iterate over times array and print timing info to files. */
+  for (int i = 0; i < profiler_length; i++) {
+    profiler_write_timing_info(e, profiler->times[i], profiler->files[i]);
+  }
   /* Reset timers. */
   profiler_reset_timers(profiler);
 }
@@ -215,20 +178,6 @@ void profiler_write_all_timing_info(const struct engine *e,
  */
 void profiler_close_files(struct profiler *profiler) {
 
-  fclose(profiler->file_engine_drift);
-  fclose(profiler->file_engine_rebuild);
-  fclose(profiler->file_scheduler_reweight);
-  fclose(profiler->file_scheduler_clear_waits);
-  fclose(profiler->file_scheduler_re_wait);
-  fclose(profiler->file_scheduler_enqueue);
-  fclose(profiler->file_engine_stats);
-  fclose(profiler->file_engine_launch);
-  fclose(profiler->file_space_rebuild);
-  fclose(profiler->file_engine_maketasks);
-  fclose(profiler->file_engine_marktasks);
-  fclose(profiler->file_space_regrid);
-  fclose(profiler->file_space_parts_sort);
-  fclose(profiler->file_space_split);
-  fclose(profiler->file_space_parts_get_cell_id);
-  fclose(profiler->file_space_count_parts);
+  /* Iterate over files array and close files. */
+  for (int i = 0; i < profiler_length; i++) fclose(profiler->files[i]);
 }
diff --git a/src/profiler.h b/src/profiler.h
index b00bc986ece8b78282b11ce317a6746ecba5a50f..911d4747912d64dd46d2cf59369670ff26a92012 100644
--- a/src/profiler.h
+++ b/src/profiler.h
@@ -25,46 +25,33 @@
 /* Local includes */
 #include "engine.h"
 
+/* Enumerator to be used as an index into the timers and files array. To add an
+ * extra timer extend this list, before the profiler_length value.*/
+enum profiler_types {
+  profiler_engine_collect_timesteps = 0,
+  profiler_engine_drift,
+  profiler_engine_rebuild,
+  profiler_scheduler_reweight,
+  profiler_scheduler_clear_waits,
+  profiler_scheduler_re_wait,
+  profiler_scheduler_enqueue,
+  profiler_engine_stats,
+  profiler_engine_launch,
+  profiler_space_rebuild,
+  profiler_engine_maketasks,
+  profiler_engine_marktasks,
+  profiler_space_regrid,
+  profiler_space_parts_sort,
+  profiler_space_split,
+  profiler_space_parts_get_cell_id,
+  profiler_space_count_parts,
+  profiler_length
+};
+
 /* Profiler that holds file pointers and time taken in functions. */
 struct profiler {
-
-  /* File pointers for timing info. */
-  FILE *file_engine_collect_timesteps;
-  FILE *file_engine_drift;
-  FILE *file_engine_rebuild;
-  FILE *file_scheduler_reweight;
-  FILE *file_scheduler_clear_waits;
-  FILE *file_scheduler_re_wait;
-  FILE *file_scheduler_enqueue;
-  FILE *file_engine_stats;
-  FILE *file_engine_launch;
-  FILE *file_space_rebuild;
-  FILE *file_engine_maketasks;
-  FILE *file_engine_marktasks;
-  FILE *file_space_regrid;
-  FILE *file_space_parts_sort;
-  FILE *file_space_split;
-  FILE *file_space_parts_get_cell_id;
-  FILE *file_space_count_parts;
-
-  /* Time taken in functions. */
-  ticks collect_timesteps_time;
-  ticks drift_time;
-  ticks rebuild_time;
-  ticks reweight_time;
-  ticks clear_waits_time;
-  ticks re_wait_time;
-  ticks enqueue_time;
-  ticks stats_time;
-  ticks launch_time;
-  ticks space_rebuild_time;
-  ticks engine_maketasks_time;
-  ticks engine_marktasks_time;
-  ticks space_regrid_time;
-  ticks space_parts_sort_time;
-  ticks space_split_time;
-  ticks space_parts_get_cell_id_time;
-  ticks space_count_parts_time;
+  FILE *files[profiler_length];
+  ticks times[profiler_length];
 };
 
 /* Function prototypes. */