performance improvements for loops
diff --git a/include/inja/renderer.hpp b/include/inja/renderer.hpp
index fcb2bcd..d62bdb6 100644
--- a/include/inja/renderer.hpp
+++ b/include/inja/renderer.hpp
@@ -500,16 +500,17 @@
       (*current_loop_data)["parent"] = std::move(tmp);
     }
 
+    size_t index = 0;
     for (auto it = result->begin(); it != result->end(); ++it) {
       json_loop_data[static_cast<std::string>(node.value)] = *it;
 
-      size_t index = std::distance(result->begin(), it);
       (*current_loop_data)["index"] = index;
       (*current_loop_data)["index1"] = index + 1;
       (*current_loop_data)["is_first"] = (index == 0);
       (*current_loop_data)["is_last"] = (index == result->size() - 1);
 
       node.body.accept(*this);
+      ++index;
     }
 
     json_loop_data[static_cast<std::string>(node.value)].clear();
@@ -531,17 +532,18 @@
       (*current_loop_data)["parent"] = std::move(*current_loop_data);
     }
 
+    size_t index = 0;
     for (auto it = result->begin(); it != result->end(); ++it) {
       json_loop_data[static_cast<std::string>(node.key)] = it.key();
       json_loop_data[static_cast<std::string>(node.value)] = it.value();
 
-      size_t index = std::distance(result->begin(), it);
       (*current_loop_data)["index"] = index;
       (*current_loop_data)["index1"] = index + 1;
       (*current_loop_data)["is_first"] = (index == 0);
       (*current_loop_data)["is_last"] = (index == result->size() - 1);
 
       node.body.accept(*this);
+      ++index;
     }
 
     json_loop_data[static_cast<std::string>(node.key)].clear();
diff --git a/single_include/inja/inja.hpp b/single_include/inja/inja.hpp
index b9ccd7c..281ae54 100644
--- a/single_include/inja/inja.hpp
+++ b/single_include/inja/inja.hpp
@@ -3759,16 +3759,17 @@
       (*current_loop_data)["parent"] = std::move(tmp);
     }
 
+    size_t index = 0;
     for (auto it = result->begin(); it != result->end(); ++it) {
       json_loop_data[static_cast<std::string>(node.value)] = *it;
 
-      size_t index = std::distance(result->begin(), it);
       (*current_loop_data)["index"] = index;
       (*current_loop_data)["index1"] = index + 1;
       (*current_loop_data)["is_first"] = (index == 0);
       (*current_loop_data)["is_last"] = (index == result->size() - 1);
 
       node.body.accept(*this);
+      ++index;
     }
 
     json_loop_data[static_cast<std::string>(node.value)].clear();
@@ -3790,17 +3791,18 @@
       (*current_loop_data)["parent"] = std::move(*current_loop_data);
     }
 
+    size_t index = 0;
     for (auto it = result->begin(); it != result->end(); ++it) {
       json_loop_data[static_cast<std::string>(node.key)] = it.key();
       json_loop_data[static_cast<std::string>(node.value)] = it.value();
 
-      size_t index = std::distance(result->begin(), it);
       (*current_loop_data)["index"] = index;
       (*current_loop_data)["index1"] = index + 1;
       (*current_loop_data)["is_first"] = (index == 0);
       (*current_loop_data)["is_last"] = (index == result->size() - 1);
 
       node.body.accept(*this);
+      ++index;
     }
 
     json_loop_data[static_cast<std::string>(node.key)].clear();