From 7b70d3fc6f77a47124f3b06160f17ade79269c6c Mon Sep 17 00:00:00 2001 From: Ladislav Michl Date: Sun, 21 Jan 2024 17:14:47 +0100 Subject: [PATCH 1/4] Base: Move currentDateTimeString out of TimeInfo currentDateTimeString does not have anything in common with TimeInfo class, move it into Tools. --- src/App/Document.cpp | 4 ++-- src/Base/TimeInfo.cpp | 8 -------- src/Base/TimeInfo.h | 1 - src/Base/Tools.cpp | 9 +++++++++ src/Base/Tools.h | 2 ++ src/Mod/Cloud/App/AppCloud.cpp | 2 +- 6 files changed, 14 insertions(+), 12 deletions(-) diff --git a/src/App/Document.cpp b/src/App/Document.cpp index 0c7009717b..14c5a67bb6 100644 --- a/src/App/Document.cpp +++ b/src/App/Document.cpp @@ -798,7 +798,7 @@ Document::Document(const char* documentName) #ifdef FC_LOGUPDATECHAIN Console().Log("+App::Document: %p\n", this); #endif - std::string CreationDateString = Base::TimeInfo::currentDateTimeString(); + std::string CreationDateString = Base::Tools::currentDateTimeString(); std::string Author = App::GetApplication() .GetParameterGroupByPath("User parameter:BaseApp/Preferences/Document") ->GetASCII("prefAuthor", ""); @@ -1606,7 +1606,7 @@ bool Document::save () TipName.setValue(Tip.getValue()->getNameInDocument()); } - std::string LastModifiedDateString = Base::TimeInfo::currentDateTimeString(); + std::string LastModifiedDateString = Base::Tools::currentDateTimeString(); LastModifiedDate.setValue(LastModifiedDateString.c_str()); // set author if needed bool saveAuthor = App::GetApplication().GetParameterGroupByPath diff --git a/src/Base/TimeInfo.cpp b/src/Base/TimeInfo.cpp index 0fd6bb9fe9..e8b29aaef1 100644 --- a/src/Base/TimeInfo.cpp +++ b/src/Base/TimeInfo.cpp @@ -77,14 +77,6 @@ void TimeInfo::setTime_t(int64_t seconds) timebuffer.time = seconds; } -std::string TimeInfo::currentDateTimeString() -{ - return QDateTime::currentDateTime() - .toTimeSpec(Qt::OffsetFromUTC) - .toString(Qt::ISODate) - .toStdString(); -} - std::string TimeInfo::diffTime(const TimeInfo& timeStart, const TimeInfo& timeEnd) { std::stringstream str; diff --git a/src/Base/TimeInfo.h b/src/Base/TimeInfo.h index ae9164d41d..350ef2d09c 100644 --- a/src/Base/TimeInfo.h +++ b/src/Base/TimeInfo.h @@ -81,7 +81,6 @@ public: bool operator>=(const TimeInfo& time) const; bool operator>(const TimeInfo& time) const; - static std::string currentDateTimeString(); static std::string diffTime(const TimeInfo& timeStart, const TimeInfo& timeEnd = TimeInfo()); static float diffTimeF(const TimeInfo& timeStart, const TimeInfo& timeEnd = TimeInfo()); bool isNull() const; diff --git a/src/Base/Tools.cpp b/src/Base/Tools.cpp index 54a494c7fd..6875fa8f4f 100644 --- a/src/Base/Tools.cpp +++ b/src/Base/Tools.cpp @@ -26,6 +26,7 @@ #include #include #include +#include #include #endif @@ -365,6 +366,14 @@ std::string Base::Tools::joinList(const std::vector& vec, const std return str.str(); } +std::string Base::Tools::currentDateTimeString() +{ + return QDateTime::currentDateTime() + .toTimeSpec(Qt::OffsetFromUTC) + .toString(Qt::ISODate) + .toStdString(); +} + // ---------------------------------------------------------------------------- using namespace Base; diff --git a/src/Base/Tools.h b/src/Base/Tools.h index 4f2c957b4b..d45777c962 100644 --- a/src/Base/Tools.h +++ b/src/Base/Tools.h @@ -346,6 +346,8 @@ struct BaseExport Tools * @return */ static std::string joinList(const std::vector& vec, const std::string& sep = ", "); + + static std::string currentDateTimeString(); }; diff --git a/src/Mod/Cloud/App/AppCloud.cpp b/src/Mod/Cloud/App/AppCloud.cpp index bdbc52485f..8da272a57d 100644 --- a/src/Mod/Cloud/App/AppCloud.cpp +++ b/src/Mod/Cloud/App/AppCloud.cpp @@ -1359,7 +1359,7 @@ bool Cloud::Module::cloudSave(const char* BucketName) doc->TipName.setValue(doc->Tip.getValue()->getNameInDocument()); } - std::string LastModifiedDateString = Base::TimeInfo::currentDateTimeString(); + std::string LastModifiedDateString = Base::Tools::currentDateTimeString(); doc->LastModifiedDate.setValue(LastModifiedDateString.c_str()); // set author if needed bool saveAuthor = App::GetApplication() From a691d6fcdc404d14523065c4ffb4a57c634e1534 Mon Sep 17 00:00:00 2001 From: Ladislav Michl Date: Wed, 15 Nov 2023 10:28:15 +0100 Subject: [PATCH 2/4] Base: Use std::chrono for time handling Replace platform specific implementations with standard C++ std::chrono. As time_t is now 64-bit on all supported systems, use it to set the clock. --- src/App/Document.cpp | 2 +- src/Base/CMakeLists.txt | 1 - src/Base/PreCompiled.h | 1 + src/Base/TimeInfo.cpp | 105 ----------------------- src/Base/TimeInfo.h | 160 ++++++++++++------------------------ tests/src/Base/TimeInfo.cpp | 26 +++--- 6 files changed, 66 insertions(+), 229 deletions(-) delete mode 100644 src/Base/TimeInfo.cpp diff --git a/src/App/Document.cpp b/src/App/Document.cpp index 14c5a67bb6..149a47fd7d 100644 --- a/src/App/Document.cpp +++ b/src/App/Document.cpp @@ -1799,7 +1799,7 @@ private: if (useFCBakExtension) { std::stringstream str; Base::TimeInfo ti = fi.lastModified(); - time_t s =ti.getSeconds(); + time_t s = ti.getTime_t(); struct tm * timeinfo = localtime(& s); char buffer[100]; diff --git a/src/Base/CMakeLists.txt b/src/Base/CMakeLists.txt index a21b6c240a..85a48dae43 100644 --- a/src/Base/CMakeLists.txt +++ b/src/Base/CMakeLists.txt @@ -264,7 +264,6 @@ SET(FreeCADBase_CPP_SRCS Stream.cpp Swap.cpp ${SWIG_SRCS} - TimeInfo.cpp Tools.cpp Tools2D.cpp Tools3D.cpp diff --git a/src/Base/PreCompiled.h b/src/Base/PreCompiled.h index b38b44a68d..791715b249 100644 --- a/src/Base/PreCompiled.h +++ b/src/Base/PreCompiled.h @@ -37,6 +37,7 @@ #include #include #include +#include #ifdef FC_OS_WIN32 #define _USE_MATH_DEFINES #endif // FC_OS_WIN32 diff --git a/src/Base/TimeInfo.cpp b/src/Base/TimeInfo.cpp deleted file mode 100644 index e8b29aaef1..0000000000 --- a/src/Base/TimeInfo.cpp +++ /dev/null @@ -1,105 +0,0 @@ -/*************************************************************************** - * Copyright (c) 2011 Jürgen Riegel * - * * - * This file is part of the FreeCAD CAx development system. * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of the GNU Library General Public * - * License as published by the Free Software Foundation; either * - * version 2 of the License, or (at your option) any later version. * - * * - * This library is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU Library General Public License for more details. * - * * - * You should have received a copy of the GNU Library General Public * - * License along with this library; see the file COPYING.LIB. If not, * - * write to the Free Software Foundation, Inc., 59 Temple Place, * - * Suite 330, Boston, MA 02111-1307, USA * - * * - ***************************************************************************/ - - -#include "PreCompiled.h" - -#ifndef _PreComp_ -#include -#include -#if defined(FC_OS_LINUX) || defined(__MINGW32__) -#include -#endif -#endif - -#include "TimeInfo.h" - - -using namespace Base; - - -/** - * A constructor. - * A more elaborate description of the constructor. - */ -TimeInfo::TimeInfo() -{ - setCurrent(); -} - -/** - * A destructor. - * A more elaborate description of the destructor. - */ -TimeInfo::~TimeInfo() = default; - - -//************************************************************************** -// separator for other implementation aspects - -void TimeInfo::setCurrent() -{ - // clang-format off -#if defined(FC_OS_BSD) || defined(FC_OS_LINUX) || defined(__MINGW32__) - struct timeval tv {}; - gettimeofday(&tv, nullptr); - timebuffer.time = tv.tv_sec; - timebuffer.millitm = tv.tv_usec / 1000; -#elif defined(FC_OS_WIN32) - _ftime(&timebuffer); -#else - ftime(&timebuffer); // deprecated -#endif - // clang-format on -} - -void TimeInfo::setTime_t(int64_t seconds) -{ - timebuffer.time = seconds; -} - -std::string TimeInfo::diffTime(const TimeInfo& timeStart, const TimeInfo& timeEnd) -{ - std::stringstream str; - str << diffTimeF(timeStart, timeEnd); - return str.str(); -} - -float TimeInfo::diffTimeF(const TimeInfo& timeStart, const TimeInfo& timeEnd) -{ - int64_t ds = int64_t(timeEnd.getSeconds() - timeStart.getSeconds()); - int dms = int(timeEnd.getMiliseconds()) - int(timeStart.getMiliseconds()); - - return float(ds) + float(dms) * 0.001F; -} - -TimeInfo TimeInfo::null() -{ - TimeInfo ti; - ti.timebuffer = {}; - return ti; -} - -bool TimeInfo::isNull() const -{ - return (*this) == TimeInfo::null(); -} diff --git a/src/Base/TimeInfo.h b/src/Base/TimeInfo.h index 350ef2d09c..b8cf9c90f6 100644 --- a/src/Base/TimeInfo.h +++ b/src/Base/TimeInfo.h @@ -1,5 +1,6 @@ /*************************************************************************** * Copyright (c) 2011 Jürgen Riegel * + * Copyright (c) 2024 Ladislav Michl * * * * This file is part of the FreeCAD CAx development system. * * * @@ -24,134 +25,75 @@ #ifndef BASE_TIMEINFO_H #define BASE_TIMEINFO_H -// Std. configurations - - -#include -#if defined(FC_OS_BSD) -#include -#else -#include -#endif -#include - -#ifdef __GNUC__ -#include -#endif - +#include +#include #include #include -#if defined(FC_OS_BSD) -struct timeb -{ - int64_t time; - unsigned short millitm; -}; -#endif - namespace Base { -/// BaseClass class and root of the type system -class BaseExport TimeInfo + +using Clock = std::chrono::system_clock; + +class TimeInfo: public std::chrono::time_point { +private: + bool _null; public: - /// Construction - TimeInfo(); + TimeInfo() + { + setCurrent(); + } + TimeInfo(const TimeInfo&) = default; TimeInfo(TimeInfo&&) = default; - /// Destruction - ~TimeInfo(); + ~TimeInfo() = default; - /// sets the object to the actual system time - void setCurrent(); - void setTime_t(int64_t seconds); - - int64_t getSeconds() const; - unsigned short getMiliseconds() const; - - TimeInfo& operator=(const TimeInfo& time) = default; - TimeInfo& operator=(TimeInfo&& time) = default; - bool operator==(const TimeInfo& time) const; - bool operator!=(const TimeInfo& time) const; - - bool operator<(const TimeInfo& time) const; - bool operator<=(const TimeInfo& time) const; - bool operator>=(const TimeInfo& time) const; - bool operator>(const TimeInfo& time) const; - - static std::string diffTime(const TimeInfo& timeStart, const TimeInfo& timeEnd = TimeInfo()); - static float diffTimeF(const TimeInfo& timeStart, const TimeInfo& timeEnd = TimeInfo()); - bool isNull() const; - static TimeInfo null(); - -private: - // clang-format off -#if defined(_MSC_VER) - struct _timeb timebuffer; -#elif defined(__GNUC__) - struct timeb timebuffer {}; -#endif - // clang-format on -}; - - -inline int64_t TimeInfo::getSeconds() const -{ - return timebuffer.time; -} - -inline unsigned short TimeInfo::getMiliseconds() const -{ - return timebuffer.millitm; -} - -inline bool TimeInfo::operator!=(const TimeInfo& time) const -{ - return (timebuffer.time != time.timebuffer.time - || timebuffer.millitm != time.timebuffer.millitm); -} - -inline bool TimeInfo::operator==(const TimeInfo& time) const -{ - return (timebuffer.time == time.timebuffer.time - && timebuffer.millitm == time.timebuffer.millitm); -} - -inline bool TimeInfo::operator<(const TimeInfo& time) const -{ - if (timebuffer.time == time.timebuffer.time) { - return timebuffer.millitm < time.timebuffer.millitm; + void setCurrent() + { + static_cast&>(*this) = Clock::now(); + _null = false; } - return timebuffer.time < time.timebuffer.time; -} -inline bool TimeInfo::operator<=(const TimeInfo& time) const -{ - if (timebuffer.time == time.timebuffer.time) { - return timebuffer.millitm <= time.timebuffer.millitm; + void setTime_t(std::time_t time) + { + static_cast&>(*this) = Clock::from_time_t(time); + _null = false; } - return timebuffer.time <= time.timebuffer.time; -} -inline bool TimeInfo::operator>=(const TimeInfo& time) const -{ - if (timebuffer.time == time.timebuffer.time) { - return timebuffer.millitm >= time.timebuffer.millitm; + std::time_t getTime_t() + { + return Clock::to_time_t(*this); } - return timebuffer.time >= time.timebuffer.time; -} -inline bool TimeInfo::operator>(const TimeInfo& time) const -{ - if (timebuffer.time == time.timebuffer.time) { - return timebuffer.millitm > time.timebuffer.millitm; + static float diffTimeF(const TimeInfo& start, const TimeInfo& end = TimeInfo()) + { + const std::chrono::duration duration = end - start; + return duration.count(); } - return timebuffer.time > time.timebuffer.time; -} + + static std::string diffTime(const TimeInfo& start, const TimeInfo& end = TimeInfo()) + { + std::stringstream ss; + const std::chrono::duration secs = end - start; + ss << secs.count(); + return ss.str(); + } + + bool isNull() const + { + return _null; + } + + static TimeInfo null() + { + TimeInfo ti; + ti._null = true; + return ti; + } +}; // class TimeInfo } // namespace Base - #endif // BASE_TIMEINFO_H diff --git a/tests/src/Base/TimeInfo.cpp b/tests/src/Base/TimeInfo.cpp index 04f4155550..ca7d356cf6 100644 --- a/tests/src/Base/TimeInfo.cpp +++ b/tests/src/Base/TimeInfo.cpp @@ -4,32 +4,32 @@ TEST(TimeInfo, TestDefault) { Base::TimeInfo ti; - EXPECT_EQ(ti.isNull(), false); + EXPECT_FALSE(ti.isNull()); } TEST(TimeInfo, TestNull) { Base::TimeInfo ti(Base::TimeInfo::null()); - EXPECT_EQ(ti.isNull(), true); + EXPECT_TRUE(ti.isNull()); } TEST(TimeInfo, TestCompare) { Base::TimeInfo ti1; - Base::TimeInfo ti2; - ti2.setTime_t(ti1.getSeconds() + 1); - EXPECT_EQ(ti1 == ti1, true); - EXPECT_EQ(ti1 != ti2, true); - EXPECT_EQ(ti1 < ti2, true); - EXPECT_EQ(ti1 > ti2, false); - EXPECT_EQ(ti1 <= ti1, true); - EXPECT_EQ(ti1 >= ti1, true); + Base::TimeInfo ti2(ti1); + ti2 += std::chrono::seconds(1); + EXPECT_TRUE(ti1 == ti1); + EXPECT_TRUE(ti1 != ti2); + EXPECT_TRUE(ti1 < ti2); + EXPECT_FALSE(ti1 > ti2); + EXPECT_TRUE(ti1 <= ti1); + EXPECT_TRUE(ti1 >= ti1); } TEST(TimeInfo, TestDiffTime) { Base::TimeInfo ti1; - Base::TimeInfo ti2; - ti2.setTime_t(ti1.getSeconds() + 1); - EXPECT_EQ(Base::TimeInfo::diffTimeF(ti1, ti2), 1.0); + Base::TimeInfo ti2(ti1); + ti2 += std::chrono::seconds(1000); + EXPECT_FLOAT_EQ(Base::TimeInfo::diffTimeF(ti1, ti2), 1000.0); } From d95b56137b3bfac9ff13550fe2ec66b3665a2c99 Mon Sep 17 00:00:00 2001 From: Ladislav Michl Date: Sun, 21 Jan 2024 19:00:57 +0100 Subject: [PATCH 3/4] Base: Implement TimeElapsed Some instances of TimeInfo serve the sole purpose of measuring time duration. Using system time is unfortunate as it returns wall clock, which is not guaranteed to be monotonic. Replace such a usage with the new TimeElapsed class based on steady clock. --- src/Base/TimeInfo.h | 34 ++++++++++++++++++++ src/Gui/DAGView/DAGModel.cpp | 4 +-- src/Mod/Fem/App/FemMesh.cpp | 26 ++++++++------- src/Mod/Fem/App/FemVTKTools.cpp | 21 ++++++------ src/Mod/Fem/Gui/ViewProviderFemMesh.cpp | 20 ++++++------ src/Mod/Fem/Gui/ViewProviderFemMeshPyImp.cpp | 6 ++-- src/Mod/Part/Gui/TaskCheckGeometry.cpp | 4 +-- src/Mod/Part/Gui/ViewProviderExt.cpp | 4 +-- src/Mod/Sketcher/App/Sketch.cpp | 14 ++++---- src/Mod/Sketcher/App/planegcs/GCS.cpp | 12 +++---- 10 files changed, 93 insertions(+), 52 deletions(-) diff --git a/src/Base/TimeInfo.h b/src/Base/TimeInfo.h index b8cf9c90f6..433fb7c764 100644 --- a/src/Base/TimeInfo.h +++ b/src/Base/TimeInfo.h @@ -94,6 +94,40 @@ public: } }; // class TimeInfo +using Ticks = std::chrono::steady_clock; + +class TimeElapsed: public std::chrono::time_point +{ +public: + TimeElapsed() + { + setCurrent(); + } + + TimeElapsed(const TimeElapsed&) = default; + TimeElapsed(TimeElapsed&&) = default; + ~TimeElapsed() = default; + + void setCurrent() + { + static_cast&>(*this) = Ticks::now(); + } + + static float diffTimeF(const TimeElapsed& start, const TimeElapsed& end = TimeElapsed()) + { + const std::chrono::duration duration = end - start; + return duration.count(); + } + + static std::string diffTime(const TimeElapsed& start, const TimeElapsed& end = TimeElapsed()) + { + std::stringstream ss; + const std::chrono::duration secs = end - start; + ss << secs.count(); + return ss.str(); + } +}; // class TimeElapsed + } // namespace Base #endif // BASE_TIMEINFO_H diff --git a/src/Gui/DAGView/DAGModel.cpp b/src/Gui/DAGView/DAGModel.cpp index 5b9833924d..b005fc4453 100644 --- a/src/Gui/DAGView/DAGModel.cpp +++ b/src/Gui/DAGView/DAGModel.cpp @@ -460,7 +460,7 @@ void Model::updateSlot() //for speed. Not doing yet, as I want a simple algorithm until //a more complete picture is formed. - Base::TimeInfo startTime; + Base::TimeElapsed startTime; //here we will cycle through the graph updating edges. //we have to do this first and in isolation because everything is dependent on an up to date graph. @@ -761,7 +761,7 @@ void Model::updateSlot() //Modeling_Challenge_Casting_ta4 with 59 features: "Initialize DAG View time: 0.007" //keeping algo simple with extra loops only added 0.002 to above number. -// std::cout << "Initialize DAG View time: " << Base::TimeInfo::diffTimeF(startTime, Base::TimeInfo()) << std::endl; +// std::cout << "Initialize DAG View time: " << Base::TimeElapsed::diffTimeF(startTime, Base::TimeElapsed()) << std::endl; // outputGraphviz(*theGraph, "./graphviz.dot"); graphDirty = false; diff --git a/src/Mod/Fem/App/FemMesh.cpp b/src/Mod/Fem/App/FemMesh.cpp index 008412acb3..8ab5d1eb1a 100644 --- a/src/Mod/Fem/App/FemMesh.cpp +++ b/src/Mod/Fem/App/FemMesh.cpp @@ -1621,7 +1621,7 @@ class CHEXA2Element: public NastranElement void FemMesh::readNastran(const std::string& Filename) { - Base::TimeInfo Start; + Base::TimeElapsed Start; Base::Console().Log("Start: FemMesh::readNastran() =================================\n"); _Mtrx = Base::Matrix4D(); @@ -1699,7 +1699,7 @@ void FemMesh::readNastran(const std::string& Filename) inputfile.close(); Base::Console().Log(" %f: File read, start building mesh\n", - Base::TimeInfo::diffTimeF(Start, Base::TimeInfo())); + Base::TimeElapsed::diffTimeF(Start, Base::TimeElapsed())); // Now fill the SMESH datastructure SMESHDS_Mesh* meshds = this->myMesh->GetMeshDS(); @@ -1709,12 +1709,13 @@ void FemMesh::readNastran(const std::string& Filename) it->addToMesh(meshds); } - Base::Console().Log(" %f: Done \n", Base::TimeInfo::diffTimeF(Start, Base::TimeInfo())); + Base::Console().Log(" %f: Done \n", + Base::TimeElapsed::diffTimeF(Start, Base::TimeElapsed())); } void FemMesh::readNastran95(const std::string& Filename) { - Base::TimeInfo Start; + Base::TimeElapsed Start; Base::Console().Log("Start: FemMesh::readNastran95() =================================\n"); _Mtrx = Base::Matrix4D(); @@ -1825,7 +1826,7 @@ void FemMesh::readNastran95(const std::string& Filename) inputfile.close(); Base::Console().Log(" %f: File read, start building mesh\n", - Base::TimeInfo::diffTimeF(Start, Base::TimeInfo())); + Base::TimeElapsed::diffTimeF(Start, Base::TimeElapsed())); // Now fill the SMESH datastructure SMESHDS_Mesh* meshds = this->myMesh->GetMeshDS(); @@ -1839,12 +1840,13 @@ void FemMesh::readNastran95(const std::string& Filename) it->addToMesh(meshds); } - Base::Console().Log(" %f: Done \n", Base::TimeInfo::diffTimeF(Start, Base::TimeInfo())); + Base::Console().Log(" %f: Done \n", + Base::TimeElapsed::diffTimeF(Start, Base::TimeElapsed())); } void FemMesh::readAbaqus(const std::string& FileName) { - Base::TimeInfo Start; + Base::TimeElapsed Start; Base::Console().Log("Start: FemMesh::readAbaqus() =================================\n"); /* @@ -1878,12 +1880,13 @@ void FemMesh::readAbaqus(const std::string& FileName) catch (Py::Exception& e) { e.clear(); } - Base::Console().Log(" %f: Done \n", Base::TimeInfo::diffTimeF(Start, Base::TimeInfo())); + Base::Console().Log(" %f: Done \n", + Base::TimeElapsed::diffTimeF(Start, Base::TimeElapsed())); } void FemMesh::readZ88(const std::string& FileName) { - Base::TimeInfo Start; + Base::TimeElapsed Start; Base::Console().Log("Start: FemMesh::readZ88() =================================\n"); /* @@ -1917,7 +1920,8 @@ void FemMesh::readZ88(const std::string& FileName) catch (Py::Exception& e) { e.clear(); } - Base::Console().Log(" %f: Done \n", Base::TimeInfo::diffTimeF(Start, Base::TimeInfo())); + Base::Console().Log(" %f: Done \n", + Base::TimeElapsed::diffTimeF(Start, Base::TimeElapsed())); } void FemMesh::read(const char* FileName) @@ -2416,7 +2420,7 @@ void FemMesh::writeABAQUS(const std::string& Filename, int elemParam, bool group void FemMesh::writeZ88(const std::string& FileName) const { - Base::TimeInfo Start; + Base::TimeElapsed Start; Base::Console().Log("Start: FemMesh::writeZ88() =================================\n"); /* diff --git a/src/Mod/Fem/App/FemVTKTools.cpp b/src/Mod/Fem/App/FemVTKTools.cpp index 0a3b42de86..ac88e59518 100644 --- a/src/Mod/Fem/App/FemVTKTools.cpp +++ b/src/Mod/Fem/App/FemVTKTools.cpp @@ -267,7 +267,7 @@ void FemVTKTools::importVTKMesh(vtkSmartPointer dataset, FemMesh* me FemMesh* FemVTKTools::readVTKMesh(const char* filename, FemMesh* mesh) { - Base::TimeInfo Start; + Base::TimeElapsed Start; Base::Console().Log("Start: read FemMesh from VTK unstructuredGrid ======================\n"); Base::FileInfo f(filename); @@ -301,7 +301,8 @@ FemMesh* FemVTKTools::readVTKMesh(const char* filename, FemMesh* mesh) } // Mesh should link to the part feature, in order to set up FemConstraint - Base::Console().Log(" %f: Done \n", Base::TimeInfo::diffTimeF(Start, Base::TimeInfo())); + Base::Console().Log(" %f: Done \n", + Base::TimeElapsed::diffTimeF(Start, Base::TimeElapsed())); return mesh; } @@ -543,7 +544,7 @@ void FemVTKTools::exportVTKMesh(const FemMesh* mesh, void FemVTKTools::writeVTKMesh(const char* filename, const FemMesh* mesh) { - Base::TimeInfo Start; + Base::TimeElapsed Start; Base::Console().Log("Start: write FemMesh from VTK unstructuredGrid ======================\n"); Base::FileInfo f(filename); @@ -561,7 +562,8 @@ void FemVTKTools::writeVTKMesh(const char* filename, const FemMesh* mesh) Base::Console().Error("file name extension is not supported to write VTK\n"); } - Base::Console().Log(" %f: Done \n", Base::TimeInfo::diffTimeF(Start, Base::TimeInfo())); + Base::Console().Log(" %f: Done \n", + Base::TimeElapsed::diffTimeF(Start, Base::TimeElapsed())); } @@ -611,7 +613,7 @@ App::DocumentObject* createObjectByType(const Base::Type type) App::DocumentObject* FemVTKTools::readResult(const char* filename, App::DocumentObject* res) { - Base::TimeInfo Start; + Base::TimeElapsed Start; Base::Console().Log( "Start: read FemResult with FemMesh from VTK file ======================\n"); Base::FileInfo f(filename); @@ -667,7 +669,8 @@ App::DocumentObject* FemVTKTools::readResult(const char* filename, App::Document } pcDoc->recompute(); - Base::Console().Log(" %f: Done \n", Base::TimeInfo::diffTimeF(Start, Base::TimeInfo())); + Base::Console().Log(" %f: Done \n", + Base::TimeElapsed::diffTimeF(Start, Base::TimeElapsed())); Base::Console().Log("End: read FemResult with FemMesh from VTK file ======================\n"); return result; @@ -689,7 +692,7 @@ void FemVTKTools::writeResult(const char* filename, const App::DocumentObject* r return; } - Base::TimeInfo Start; + Base::TimeElapsed Start; Base::Console().Log("Start: write FemResult to VTK unstructuredGrid dataset =======\n"); Base::FileInfo f(filename); @@ -702,7 +705,7 @@ void FemVTKTools::writeResult(const char* filename, const App::DocumentObject* r FemVTKTools::exportVTKMesh(&fmesh, grid); Base::Console().Log(" %f: vtk mesh builder finished\n", - Base::TimeInfo::diffTimeF(Start, Base::TimeInfo())); + Base::TimeElapsed::diffTimeF(Start, Base::TimeElapsed())); // result FemVTKTools::exportFreeCADResult(res, grid); @@ -719,7 +722,7 @@ void FemVTKTools::writeResult(const char* filename, const App::DocumentObject* r } Base::Console().Log(" %f: writing result object to vtk finished\n", - Base::TimeInfo::diffTimeF(Start, Base::TimeInfo())); + Base::TimeElapsed::diffTimeF(Start, Base::TimeElapsed())); Base::Console().Log("End: write FemResult to VTK unstructuredGrid dataset =======\n"); } diff --git a/src/Mod/Fem/Gui/ViewProviderFemMesh.cpp b/src/Mod/Fem/Gui/ViewProviderFemMesh.cpp index b7829b9521..97832c4ec5 100644 --- a/src/Mod/Fem/Gui/ViewProviderFemMesh.cpp +++ b/src/Mod/Fem/Gui/ViewProviderFemMesh.cpp @@ -796,7 +796,7 @@ void ViewProviderFEMMeshBuilder::createMesh(const App::Property* prop, lines->coordIndex.setNum(0); return; } - Base::TimeInfo Start; + Base::TimeElapsed Start; Base::Console().Log( "Start: ViewProviderFEMMeshBuilder::createMesh() =================================\n"); @@ -834,7 +834,7 @@ void ViewProviderFEMMeshBuilder::createMesh(const App::Property* prop, std::vector facesHelper(numTries); Base::Console().Log(" %f: Start build up %i face helper\n", - Base::TimeInfo::diffTimeF(Start, Base::TimeInfo()), + Base::TimeElapsed::diffTimeF(Start, Base::TimeElapsed()), facesHelper.size()); Base::BoundBox3d BndBox; @@ -1359,7 +1359,7 @@ void ViewProviderFEMMeshBuilder::createMesh(const App::Property* prop, if (FaceSize < MaxFacesShowInner) { Base::Console().Log(" %f: Start eliminate internal faces SIMPLE\n", - Base::TimeInfo::diffTimeF(Start, Base::TimeInfo())); + Base::TimeElapsed::diffTimeF(Start, Base::TimeElapsed())); // search for double (inside) faces and hide them if (!ShowInner) { @@ -1376,7 +1376,7 @@ void ViewProviderFEMMeshBuilder::createMesh(const App::Property* prop, } else { Base::Console().Log(" %f: Start eliminate internal faces GRID\n", - Base::TimeInfo::diffTimeF(Start, Base::TimeInfo())); + Base::TimeElapsed::diffTimeF(Start, Base::TimeElapsed())); BndBox.Enlarge(BndBox.CalcDiagonalLength() / 10000.0); // calculate grid properties double edge = pow(FaceSize, 1.0 / 3.0); @@ -1444,7 +1444,7 @@ void ViewProviderFEMMeshBuilder::createMesh(const App::Property* prop, Base::Console().Log(" %f: Start build up node map\n", - Base::TimeInfo::diffTimeF(Start, Base::TimeInfo())); + Base::TimeElapsed::diffTimeF(Start, Base::TimeElapsed())); // sort out double nodes and build up index map std::map mapNodeIndex; @@ -1477,7 +1477,7 @@ void ViewProviderFEMMeshBuilder::createMesh(const App::Property* prop, } } Base::Console().Log(" %f: Start set point vector\n", - Base::TimeInfo::diffTimeF(Start, Base::TimeInfo())); + Base::TimeElapsed::diffTimeF(Start, Base::TimeElapsed())); // set the point coordinates coords->point.setNum(mapNodeIndex.size()); @@ -1495,7 +1495,7 @@ void ViewProviderFEMMeshBuilder::createMesh(const App::Property* prop, // count triangle size Base::Console().Log(" %f: Start count triangle size\n", - Base::TimeInfo::diffTimeF(Start, Base::TimeInfo())); + Base::TimeElapsed::diffTimeF(Start, Base::TimeElapsed())); int triangleCount = 0; for (int l = 0; l < FaceSize; l++) { if (!facesHelper[l].hide) { @@ -1551,7 +1551,7 @@ void ViewProviderFEMMeshBuilder::createMesh(const App::Property* prop, } Base::Console().Log(" %f: Start build up triangle vector\n", - Base::TimeInfo::diffTimeF(Start, Base::TimeInfo())); + Base::TimeElapsed::diffTimeF(Start, Base::TimeElapsed())); // set the triangle face indices faces->coordIndex.setNum(4 * triangleCount); vFaceElementIdx.resize(triangleCount); @@ -2971,7 +2971,7 @@ void ViewProviderFEMMeshBuilder::createMesh(const App::Property* prop, faces->coordIndex.finishEditing(); Base::Console().Log(" %f: Start build up edge vector\n", - Base::TimeInfo::diffTimeF(Start, Base::TimeInfo())); + Base::TimeElapsed::diffTimeF(Start, Base::TimeElapsed())); // std::map > EdgeMap; // count edges int EdgeSize = 0; @@ -3000,7 +3000,7 @@ void ViewProviderFEMMeshBuilder::createMesh(const App::Property* prop, Base::Console().Log( " %f: Finish =========================================================\n", - Base::TimeInfo::diffTimeF(Start, Base::TimeInfo())); + Base::TimeElapsed::diffTimeF(Start, Base::TimeElapsed())); } diff --git a/src/Mod/Fem/Gui/ViewProviderFemMeshPyImp.cpp b/src/Mod/Fem/Gui/ViewProviderFemMeshPyImp.cpp index 030e262dee..0c1a73660c 100644 --- a/src/Mod/Fem/Gui/ViewProviderFemMeshPyImp.cpp +++ b/src/Mod/Fem/Gui/ViewProviderFemMeshPyImp.cpp @@ -186,7 +186,7 @@ void ViewProviderFemMeshPy::setNodeColor(Py::Dict arg) this->getViewProviderFemMeshPtr()->resetColorByNodeId(); } else { - Base::TimeInfo Start; + Base::TimeElapsed Start; Base::Console().Log( "Start: ViewProviderFemMeshPy::setNodeColor() =================================\n"); // std::map NodeColorMap; @@ -209,12 +209,12 @@ void ViewProviderFemMeshPy::setNodeColor(Py::Dict arg) App::Color(Py::Float(color[0]), Py::Float(color[1]), Py::Float(color[2]), 0); } Base::Console().Log(" %f: Start ViewProviderFemMeshPy::setNodeColor() call \n", - Base::TimeInfo::diffTimeF(Start, Base::TimeInfo())); + Base::TimeElapsed::diffTimeF(Start, Base::TimeElapsed())); // this->getViewProviderFemMeshPtr()->setColorByNodeId(NodeColorMap); this->getViewProviderFemMeshPtr()->setColorByNodeId(NodeIds, NodeColors); Base::Console().Log(" %f: Finish ViewProviderFemMeshPy::setNodeColor() call \n", - Base::TimeInfo::diffTimeF(Start, Base::TimeInfo())); + Base::TimeElapsed::diffTimeF(Start, Base::TimeElapsed())); } } diff --git a/src/Mod/Part/Gui/TaskCheckGeometry.cpp b/src/Mod/Part/Gui/TaskCheckGeometry.cpp index 4599219825..fb0333edb6 100644 --- a/src/Mod/Part/Gui/TaskCheckGeometry.cpp +++ b/src/Mod/Part/Gui/TaskCheckGeometry.cpp @@ -678,13 +678,13 @@ int TaskCheckGeometryResults::goBOPSingleCheck(const TopoDS_Shape& shapeIn, Resu BOPCheck.CurveOnSurfaceMode() = curveOnSurfaceMode; #ifdef FC_DEBUG - Base::TimeInfo start_time; + Base::TimeElapsed start_time; #endif BOPCheck.Perform(); #ifdef FC_DEBUG - float bopAlgoTime = Base::TimeInfo::diffTimeF(start_time,Base::TimeInfo()); + float bopAlgoTime = Base::TimeElapsed::diffTimeF(start_time, Base::TimeElapsed()); std::cout << std::endl << "BopAlgo check time is: " << bopAlgoTime << std::endl << std::endl; #endif diff --git a/src/Mod/Part/Gui/ViewProviderExt.cpp b/src/Mod/Part/Gui/ViewProviderExt.cpp index 8b425d3b99..e0fd102b58 100644 --- a/src/Mod/Part/Gui/ViewProviderExt.cpp +++ b/src/Mod/Part/Gui/ViewProviderExt.cpp @@ -921,7 +921,7 @@ void ViewProviderPartExt::updateVisual() } // time measurement and book keeping - Base::TimeInfo start_time; + Base::TimeElapsed start_time; int numTriangles=0,numNodes=0,numNorms=0,numFaces=0,numEdges=0,numLines=0; std::set faceEdges; @@ -1281,7 +1281,7 @@ void ViewProviderPartExt::updateVisual() # ifdef FC_DEBUG // printing some information - Base::Console().Log("ViewProvider update time: %f s\n",Base::TimeInfo::diffTimeF(start_time,Base::TimeInfo())); + Base::Console().Log("ViewProvider update time: %f s\n",Base::TimeElapsed::diffTimeF(start_time,Base::TimeElapsed())); Base::Console().Log("Shape tria info: Faces:%d Edges:%d Nodes:%d Triangles:%d IdxVec:%d\n",numFaces,numEdges,numNodes,numTriangles,numLines); # else (void)numEdges; diff --git a/src/Mod/Sketcher/App/Sketch.cpp b/src/Mod/Sketcher/App/Sketch.cpp index 315676f99c..bf68f40fae 100644 --- a/src/Mod/Sketcher/App/Sketch.cpp +++ b/src/Mod/Sketcher/App/Sketch.cpp @@ -197,7 +197,7 @@ int Sketch::setUpSketch(const std::vector& GeoList, const std::vector& ConstraintList, int extGeoCount) { - Base::TimeInfo start_time; + Base::TimeElapsed start_time; clear(); @@ -339,10 +339,10 @@ int Sketch::setUpSketch(const std::vector& GeoList, calculateDependentParametersElements(); if (debugMode == GCS::Minimal || debugMode == GCS::IterationLevel) { - Base::TimeInfo end_time; + Base::TimeElapsed end_time; Base::Console().Log("Sketcher::setUpSketch()-T:%s\n", - Base::TimeInfo::diffTime(start_time, end_time).c_str()); + Base::TimeElapsed::diffTime(start_time, end_time).c_str()); } return GCSsys.dofsNumber(); @@ -4538,21 +4538,21 @@ bool Sketch::updateNonDrivingConstraints() int Sketch::solve() { - Base::TimeInfo start_time; + Base::TimeElapsed start_time; std::string solvername; auto result = internalSolve(solvername); - Base::TimeInfo end_time; + Base::TimeElapsed end_time; if (debugMode == GCS::Minimal || debugMode == GCS::IterationLevel) { Base::Console().Log("Sketcher::Solve()-%s-T:%s\n", solvername.c_str(), - Base::TimeInfo::diffTime(start_time, end_time).c_str()); + Base::TimeElapsed::diffTime(start_time, end_time).c_str()); } - SolveTime = Base::TimeInfo::diffTimeF(start_time, end_time); + SolveTime = Base::TimeElapsed::diffTimeF(start_time, end_time); return result; } diff --git a/src/Mod/Sketcher/App/planegcs/GCS.cpp b/src/Mod/Sketcher/App/planegcs/GCS.cpp index b5b7600189..cb87fc5892 100644 --- a/src/Mod/Sketcher/App/planegcs/GCS.cpp +++ b/src/Mod/Sketcher/App/planegcs/GCS.cpp @@ -5043,7 +5043,7 @@ int System::diagnose(Algorithm alg) if (qrAlgorithm == EigenDenseQR) { #ifdef PROFILE_DIAGNOSE - Base::TimeInfo DenseQR_start_time; + Base::TimeElapsed DenseQR_start_time; #endif if (J.rows() > 0) { int rank = 0; // rank is not cheap to retrieve from qrJT in DenseQR @@ -5101,9 +5101,9 @@ int System::diagnose(Algorithm alg) } } #ifdef PROFILE_DIAGNOSE - Base::TimeInfo DenseQR_end_time; + Base::TimeElapsed DenseQR_end_time; - auto SolveTime = Base::TimeInfo::diffTimeF(DenseQR_start_time, DenseQR_end_time); + auto SolveTime = Base::TimeElapsed::diffTimeF(DenseQR_start_time, DenseQR_end_time); Base::Console().Log("\nDenseQR - Lapsed Time: %f seconds\n", SolveTime); #endif @@ -5112,7 +5112,7 @@ int System::diagnose(Algorithm alg) #ifdef EIGEN_SPARSEQR_COMPATIBLE else if (qrAlgorithm == EigenSparseQR) { #ifdef PROFILE_DIAGNOSE - Base::TimeInfo SparseQR_start_time; + Base::TimeElapsed SparseQR_start_time; #endif if (J.rows() > 0) { int rank = 0; @@ -5178,9 +5178,9 @@ int System::diagnose(Algorithm alg) } #ifdef PROFILE_DIAGNOSE - Base::TimeInfo SparseQR_end_time; + Base::TimeElapsed SparseQR_end_time; - auto SolveTime = Base::TimeInfo::diffTimeF(SparseQR_start_time, SparseQR_end_time); + auto SolveTime = Base::TimeElapsed::diffTimeF(SparseQR_start_time, SparseQR_end_time); Base::Console().Log("\nSparseQR - Lapsed Time: %f seconds\n", SolveTime); #endif From 57ffa2427ea0750406a56826a5811129b90fdd7d Mon Sep 17 00:00:00 2001 From: Ladislav Michl Date: Sun, 21 Jan 2024 19:17:04 +0100 Subject: [PATCH 4/4] Base: Remove StopWatch StopWatch is now used on single place only, remove it in favour of TimeElapsed --- src/Base/Tools.cpp | 60 ------------------------------------------- src/Base/Tools.h | 23 ----------------- src/Gui/AutoSaver.cpp | 7 +++-- 3 files changed, 3 insertions(+), 87 deletions(-) diff --git a/src/Base/Tools.cpp b/src/Base/Tools.cpp index 6875fa8f4f..b164164489 100644 --- a/src/Base/Tools.cpp +++ b/src/Base/Tools.cpp @@ -27,7 +27,6 @@ #include #include #include -#include #endif #include "PyExport.h" @@ -373,62 +372,3 @@ std::string Base::Tools::currentDateTimeString() .toString(Qt::ISODate) .toStdString(); } - -// ---------------------------------------------------------------------------- - -using namespace Base; - -struct StopWatch::Private -{ - QElapsedTimer t; -}; - -StopWatch::StopWatch() - : d(new Private) -{} - -StopWatch::~StopWatch() -{ - delete d; -} - -void StopWatch::start() -{ - d->t.start(); -} - -int StopWatch::restart() -{ - return d->t.restart(); -} - -int StopWatch::elapsed() -{ - return d->t.elapsed(); -} - -std::string StopWatch::toString(int ms) const -{ - int total = ms; - int msec = total % 1000; - total = total / 1000; - int secs = total % 60; - total = total / 60; - int mins = total % 60; - int hour = total / 60; - std::stringstream str; - str << "Needed time: "; - if (hour > 0) { - str << hour << "h " << mins << "m " << secs << "s"; - } - else if (mins > 0) { - str << mins << "m " << secs << "s"; - } - else if (secs > 0) { - str << secs << "s"; - } - else { - str << msec << "ms"; - } - return str.str(); -} diff --git a/src/Base/Tools.h b/src/Base/Tools.h index d45777c962..b17907bbc4 100644 --- a/src/Base/Tools.h +++ b/src/Base/Tools.h @@ -145,29 +145,6 @@ inline T fmod(T numerator, T denominator) // ---------------------------------------------------------------------------- -class BaseExport StopWatch -{ -public: - StopWatch(); - ~StopWatch(); - - void start(); - int restart(); - int elapsed(); - std::string toString(int ms) const; - - StopWatch(const StopWatch&) = delete; - StopWatch(StopWatch&&) = delete; - StopWatch& operator=(const StopWatch&) = delete; - StopWatch& operator=(StopWatch&&) = delete; - -private: - struct Private; - Private* d; -}; - -// ---------------------------------------------------------------------------- - // NOLINTBEGIN template struct FlagToggler diff --git a/src/Gui/AutoSaver.cpp b/src/Gui/AutoSaver.cpp index 9e89ab081b..8ff9a9013f 100644 --- a/src/Gui/AutoSaver.cpp +++ b/src/Gui/AutoSaver.cpp @@ -38,6 +38,7 @@ #include #include #include +#include #include #include @@ -171,9 +172,8 @@ void AutoSaver::saveDocument(const std::string& name, AutoSaveProperty& saver) getMainWindow()->showMessage(tr("Please wait until the AutoRecovery file has been saved..."), 5000); //qApp->processEvents(); + Base::TimeElapsed startTime; // open extra scope to close ZipWriter properly - Base::StopWatch watch; - watch.start(); { if (!this->compressed) { RecoveryWriter writer(saver); @@ -220,8 +220,7 @@ void AutoSaver::saveDocument(const std::string& name, AutoSaveProperty& saver) } } - std::string str = watch.toString(watch.elapsed()); - Base::Console().Log("Save AutoRecovery file: %s\n", str.c_str()); + Base::Console().Log("Save AutoRecovery file in %fs\n", Base::TimeElapsed::diffTimeF(startTime,Base::TimeElapsed())); hGrp->SetBool("SaveThumbnail",save); } }