From c9180795bbd70fc4eae72dd1e2a9d2634d796edc Mon Sep 17 00:00:00 2001 From: Martin Schultz Date: Fri, 11 Sep 2015 14:34:01 +0200 Subject: [PATCH 1/4] * made Stringstreams in offReader static and reuse them to save performance --- src/OpenMesh/Core/IO/reader/OFFReader.cc | 32 ++++++++++++------------ 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/src/OpenMesh/Core/IO/reader/OFFReader.cc b/src/OpenMesh/Core/IO/reader/OFFReader.cc index c7c47f5d..94e2ccf1 100644 --- a/src/OpenMesh/Core/IO/reader/OFFReader.cc +++ b/src/OpenMesh/Core/IO/reader/OFFReader.cc @@ -182,16 +182,18 @@ _OFFReader_::read_ascii(std::istream& _in, BaseImporter& _bi, Options& _opt) con { - unsigned int i, j, k, l, idx; - unsigned int nV, nF, dummy; - OpenMesh::Vec3f v, n; - OpenMesh::Vec2f t; - OpenMesh::Vec3i c3; - OpenMesh::Vec3f c3f; - OpenMesh::Vec4i c4; - OpenMesh::Vec4f c4f; - BaseImporter::VHandles vhandles; - VertexHandle vh; + unsigned int i, j, k, l, idx; + unsigned int nV, nF, dummy; + OpenMesh::Vec3f v, n; + OpenMesh::Vec2f t; + OpenMesh::Vec3i c3; + OpenMesh::Vec3f c3f; + OpenMesh::Vec4i c4; + OpenMesh::Vec4f c4f; + BaseImporter::VHandles vhandles; + VertexHandle vh; + static std::stringstream stream; + static std::string trash; // read header line std::string header; @@ -227,13 +229,12 @@ _OFFReader_::read_ascii(std::istream& _in, BaseImporter& _bi, Options& _opt) con int colorType = getColorType(line, options_.vertex_has_texcoord() ); - std::stringstream stream( line ); + stream.str(line); + stream.clear(); //perhaps read COLOR if ( options_.vertex_has_color() ){ - std::string trash; - switch (colorType){ case 0 : break; //no color case 1 : stream >> trash; break; //one int (isn't handled atm) @@ -315,9 +316,8 @@ _OFFReader_::read_ascii(std::istream& _in, BaseImporter& _bi, Options& _opt) con int colorType = getColorType(line, false ); - std::stringstream stream( line ); - - std::string trash; + stream.str(line); + stream.clear(); switch (colorType){ case 0 : break; //no color From ebd5180a8fa15979119cb497e05c318cda4a9137 Mon Sep 17 00:00:00 2001 From: Martin Schultz Date: Fri, 11 Sep 2015 14:47:02 +0200 Subject: [PATCH 2/4] * made OBJReader reuse stringstream objects. Should speedup Reading on MS Windows especially with lots of materials. --- src/OpenMesh/Core/IO/reader/OBJReader.cc | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/src/OpenMesh/Core/IO/reader/OBJReader.cc b/src/OpenMesh/Core/IO/reader/OBJReader.cc index cc390245..7c8803fc 100644 --- a/src/OpenMesh/Core/IO/reader/OBJReader.cc +++ b/src/OpenMesh/Core/IO/reader/OBJReader.cc @@ -172,6 +172,8 @@ read_material(std::fstream& _in) std::string keyWrd; std::string textureName; + static std::stringstream stream; + std::string key; Material mat; float f1,f2,f3; @@ -193,7 +195,8 @@ read_material(std::fstream& _in) if ( line.empty() ) continue; - std::stringstream stream(line); + stream.str(line); + stream.clear(); stream >> keyWrd; @@ -305,6 +308,8 @@ read(std::istream& _in, BaseImporter& _bi, Options& _opt) std::string matname; + static std::stringstream stream, lineData, tmp; + // Options supplied by the user Options userOptions = _opt; @@ -329,7 +334,8 @@ read(std::istream& _in, BaseImporter& _bi, Options& _opt) continue; } - std::stringstream stream(line); + stream.str(line); + stream.clear(); stream >> keyWrd; @@ -463,7 +469,8 @@ read(std::istream& _in, BaseImporter& _bi, Options& _opt) // read full line after detecting a face std::string faceLine; std::getline(stream,faceLine); - std::stringstream lineData( faceLine ); + lineData.str( faceLine ); + lineData.clear(); FaceHandle fh; BaseImporter::VHandles faceVertices; @@ -484,7 +491,8 @@ read(std::istream& _in, BaseImporter& _bi, Options& _opt) if( found != std::string::npos ){ // read the index value - std::stringstream tmp( vertex.substr(0,found) ); + tmp.str( vertex.substr(0,found) ); + tmp.clear(); // If we get an empty string this property is undefined in the file if ( vertex.substr(0,found).empty() ) { @@ -507,7 +515,8 @@ read(std::istream& _in, BaseImporter& _bi, Options& _opt) } else { // last component of the vertex, read it. - std::stringstream tmp( vertex ); + tmp.str( vertex ); + tmp.clear(); tmp >> value; // Clear vertex after finished reading the line From 2dce1916c55fa2da6a618ba6961d9ba1a0213929 Mon Sep 17 00:00:00 2001 From: Martin Schultz Date: Fri, 11 Sep 2015 15:41:16 +0200 Subject: [PATCH 3/4] * made STLReader reuse stringstreams --- src/OpenMesh/Core/IO/reader/STLReader.cc | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/OpenMesh/Core/IO/reader/STLReader.cc b/src/OpenMesh/Core/IO/reader/STLReader.cc index d274844f..c75c81f2 100644 --- a/src/OpenMesh/Core/IO/reader/STLReader.cc +++ b/src/OpenMesh/Core/IO/reader/STLReader.cc @@ -249,6 +249,9 @@ read_stla(std::istream& _in, BaseImporter& _bi, Options& _opt) const std::string line; + static std::string garbage; + static std::stringstream strstream; + bool facet_normal(false); while( _in && !_in.eof() ) { @@ -265,9 +268,8 @@ read_stla(std::istream& _in, BaseImporter& _bi, Options& _opt) const // Normal found? if (line.find("facet normal") != std::string::npos) { - std::stringstream strstream(line); - - std::string garbage; + strstream.str(line); + strstream.clear(); // facet strstream >> garbage; @@ -292,9 +294,9 @@ read_stla(std::istream& _in, BaseImporter& _bi, Options& _opt) const std::getline(_in, line); trimStdString(line); - std::stringstream strstream(line); + strstream.str(line); + strstream.clear(); - std::string garbage; strstream >> garbage; strstream >> v[0]; From f28aa26ab2827b3c2675517049687226c9c02c0a Mon Sep 17 00:00:00 2001 From: Martin Date: Mon, 14 Sep 2015 13:26:19 +0200 Subject: [PATCH 4/4] closes #1 refs !1 *changed the static variables to be common variables. If one opens a lot of files, using thread local could be an alternative as long as the compiler supports it. --- src/OpenMesh/Core/IO/reader/OBJReader.cc | 4 ++-- src/OpenMesh/Core/IO/reader/OFFReader.cc | 4 ++-- src/OpenMesh/Core/IO/reader/STLReader.cc | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/OpenMesh/Core/IO/reader/OBJReader.cc b/src/OpenMesh/Core/IO/reader/OBJReader.cc index 7c8803fc..edb66a80 100644 --- a/src/OpenMesh/Core/IO/reader/OBJReader.cc +++ b/src/OpenMesh/Core/IO/reader/OBJReader.cc @@ -172,7 +172,7 @@ read_material(std::fstream& _in) std::string keyWrd; std::string textureName; - static std::stringstream stream; + std::stringstream stream; std::string key; Material mat; @@ -308,7 +308,7 @@ read(std::istream& _in, BaseImporter& _bi, Options& _opt) std::string matname; - static std::stringstream stream, lineData, tmp; + std::stringstream stream, lineData, tmp; // Options supplied by the user diff --git a/src/OpenMesh/Core/IO/reader/OFFReader.cc b/src/OpenMesh/Core/IO/reader/OFFReader.cc index 94e2ccf1..062bbc23 100644 --- a/src/OpenMesh/Core/IO/reader/OFFReader.cc +++ b/src/OpenMesh/Core/IO/reader/OFFReader.cc @@ -192,8 +192,8 @@ _OFFReader_::read_ascii(std::istream& _in, BaseImporter& _bi, Options& _opt) con OpenMesh::Vec4f c4f; BaseImporter::VHandles vhandles; VertexHandle vh; - static std::stringstream stream; - static std::string trash; + std::stringstream stream; + std::string trash; // read header line std::string header; diff --git a/src/OpenMesh/Core/IO/reader/STLReader.cc b/src/OpenMesh/Core/IO/reader/STLReader.cc index c75c81f2..90631c70 100644 --- a/src/OpenMesh/Core/IO/reader/STLReader.cc +++ b/src/OpenMesh/Core/IO/reader/STLReader.cc @@ -249,8 +249,8 @@ read_stla(std::istream& _in, BaseImporter& _bi, Options& _opt) const std::string line; - static std::string garbage; - static std::stringstream strstream; + std::string garbage; + std::stringstream strstream; bool facet_normal(false);