InferenceTFLite: Optimizing FillLayerId function 72/299672/3
authorVibhav Aggarwal <v.aggarwal@samsung.com>
Fri, 6 Oct 2023 08:03:12 +0000 (17:03 +0900)
committerVibhav Aggarwal <v.aggarwal@samsung.com>
Fri, 6 Oct 2023 10:07:58 +0000 (19:07 +0900)
[Issue type] code optimization

The previous implementation of FillLayerId function performs a nested loop on layers map and tensors of mInterpreter.
This has a worst case time complexity O(|mInterpreter->tensors|*|layers|).
This patch makes use of std::map::find to reduce the complexity to O(|mInterpreter->tensors|*log(|layers|)).
The previous best case time complexity was O(|layers|^2) which has now reduced to O(|layers|*log(|layers|).

Change-Id: Ifd096a280f81a40ec12aa5d338e5e295d1a52d44
Signed-off-by: Vibhav Aggarwal <v.aggarwal@samsung.com>
src/inference_engine_tflite.cpp

index 8f22bd996a7272eff890f2e33c4240a6558cb583..a1c8517a5a920e5055d8e417c18bc1c0d8d3dba4 100644 (file)
@@ -387,20 +387,22 @@ namespace TFLiteImpl
 
                if (!buffer.empty()) {
                        for (auto& idx : buffer)
-                               layerId.insert(std::make_pair(mInterpreter->tensor(idx)->name, idx));
+                               layerId[mInterpreter->tensor(idx)->name] = idx;
                        return;
                }
 
-               for (auto& layer: layers) {
-                       LOGI("Layer list [%s]", layer.first.c_str());
-                       for (unsigned int idx = 0; idx < mInterpreter->tensors_size(); ++idx) {
-                               if (mInterpreter->tensor(idx)->name == NULL)
-                                       continue;
-                               if ((layer.first).compare(mInterpreter->tensor(idx)->name) == 0) {
-                                       layerId.insert(std::make_pair(layer.first, idx));
-                                       break;
-                               }
+               for (unsigned int idx = 0; idx < mInterpreter->tensors_size(); ++idx) {
+                       auto tensor_name = mInterpreter->tensor(idx)->name;
+                       if (!tensor_name)
+                               continue;
+
+                       if (layers.find(tensor_name) != layers.end()) {
+                               LOGI("Layer list [%s]", tensor_name);
+                               layerId[tensor_name] = idx;
                        }
+
+                       if (layerId.size() == layers.size())
+                               break;
                }
        }