Load diff base data in parallel to primary data file.
authorMilian Wolff <mail@milianw.de>
Fri, 17 Jun 2016 15:23:14 +0000 (17:23 +0200)
committerMilian Wolff <mail@milianw.de>
Fri, 17 Jun 2016 15:23:14 +0000 (17:23 +0200)
Slightly improves performance when diffing.

CMakeLists.txt
gui/CMakeLists.txt
gui/parser.cpp
heaptrack_print.cpp

index a733949..4ecf600 100644 (file)
@@ -109,7 +109,7 @@ target_link_libraries(heaptrack_interpret backtrace)
 add_library(sharedprint STATIC accumulatedtracedata.cpp)
 target_link_libraries(sharedprint LINK_PUBLIC ${Boost_LIBRARIES} ${ZLIB_LIBRARIES})
 add_executable(heaptrack_print heaptrack_print.cpp)
-target_link_libraries(heaptrack_print LINK_PRIVATE sharedprint)
+target_link_libraries(heaptrack_print LINK_PRIVATE sharedprint ${CMAKE_THREAD_LIBS_INIT})
 
 set(BIN_INSTALL_DIR "bin")
 set(LIB_SUFFIX "" CACHE STRING "Define suffix of directory name (32/64)")
index 230eacf..f309b06 100644 (file)
@@ -46,6 +46,7 @@ target_link_libraries(heaptrack_gui
     KF5::I18n
     KF5::KIOWidgets
     KChart
-    sharedprint)
+    sharedprint
+    ${CMAKE_THREAD_LIBS_INIT})
 
 install(TARGETS heaptrack_gui ${INSTALL_TARGETS_DEFAULT_ARGS})
index ed424a1..df0a343 100644 (file)
@@ -28,6 +28,7 @@
 
 #include <vector>
 #include <tuple>
+#include <future>
 
 using namespace std;
 
@@ -485,21 +486,29 @@ void Parser::parse(const QString& path, const QString& diffBase)
         const auto stdPath = path.toStdString();
         auto data = make_shared<ParserData>();
         emit progressMessageAvailable(i18n("parsing data..."));
-        if (!data->read(stdPath)) {
-            emit failedToOpen(path);
-            return;
-        }
 
         if (!diffBase.isEmpty()) {
             ParserData diffData;
-            if (!diffData.read(diffBase.toStdString())) {
+            auto readBase = async(launch::async, [&diffData, diffBase] () {
+                return diffData.read(diffBase.toStdString());
+            });
+            if (!data->read(stdPath)) {
+                emit failedToOpen(path);
+                return;
+            }
+            if (!readBase.get()) {
                 emit failedToOpen(diffBase);
                 return;
             }
             data->diff(diffData);
             data->stringCache.diffMode = true;
+        } else if (!data->read(stdPath)) {
+            emit failedToOpen(path);
+            return;
         }
 
+
+
         data->updateStringCache();
 
         emit summaryAvailable({
index 36648e8..364a790 100644 (file)
@@ -29,6 +29,7 @@
 
 #include <iostream>
 #include <iomanip>
+#include <future>
 
 #include "config.h"
 
@@ -605,17 +606,21 @@ int main(int argc, char** argv)
     const bool printTemporary = vm["print-temporary"].as<bool>();
 
     cout << "reading file \"" << inputFile << "\" - please wait, this might take some time..." << endl;
-    if (!data.read(inputFile)) {
-        return 1;
-    }
 
     if (!diffFile.empty()) {
         cout << "reading diff file \"" << diffFile << "\" - please wait, this might take some time..." << endl;
         Printer diffData;
-        if (!diffData.read(diffFile)) {
+        auto diffRead = async(launch::async, [&diffData, diffFile] () {
+            return diffData.read(diffFile);
+        });
+
+        if (!data.read(inputFile) || !diffRead.get()) {
             return 1;
         }
+
         data.diff(diffData);
+    } else if (!data.read(inputFile)) {
+        return 1;
     }
 
     data.finalize();