diff options
author | Willem Jan Palenstijn <Willem.Jan.Palenstijn@cwi.nl> | 2017-07-05 15:15:42 +0200 |
---|---|---|
committer | Willem Jan Palenstijn <Willem.Jan.Palenstijn@cwi.nl> | 2017-10-17 20:35:30 +0200 |
commit | 7b25c857ded357c0cb0b481dac6404c27ed0293d (patch) | |
tree | 2b2d61cedfbfd0536a61fcda388030d41c36d57a /src | |
parent | 207e8f099f8004de82ee02fff235e85638ca2223 (diff) | |
download | astra-7b25c857ded357c0cb0b481dac6404c27ed0293d.tar.gz astra-7b25c857ded357c0cb0b481dac6404c27ed0293d.tar.bz2 astra-7b25c857ded357c0cb0b481dac6404c27ed0293d.tar.xz astra-7b25c857ded357c0cb0b481dac6404c27ed0293d.zip |
Reduce stringstream creation/imbue overhead
Diffstat (limited to 'src')
-rw-r--r-- | src/Utilities.cpp | 19 | ||||
-rw-r--r-- | src/XMLNode.cpp | 17 |
2 files changed, 29 insertions, 7 deletions
diff --git a/src/Utilities.cpp b/src/Utilities.cpp index eb06d8b..eb34092 100644 --- a/src/Utilities.cpp +++ b/src/Utilities.cpp @@ -73,7 +73,24 @@ std::vector<float> stringToFloatVector(const std::string &s) std::vector<double> stringToDoubleVector(const std::string &s) { - return stringToVector<double>(s); + std::vector<double> out; + out.reserve(100); + std::istringstream iss; + iss.imbue(std::locale::classic()); + size_t current = 0; + size_t next; + do { + next = s.find_first_of(",;", current); + std::string t = s.substr(current, next - current); + iss.str(t); + iss.clear(); + double f; + iss >> f; + out.push_back(f); + current = next + 1; + } while (next != std::string::npos); + + return out; } template<typename T> diff --git a/src/XMLNode.cpp b/src/XMLNode.cpp index 3b7237f..0ddc511 100644 --- a/src/XMLNode.cpp +++ b/src/XMLNode.cpp @@ -30,6 +30,9 @@ along with the ASTRA Toolbox. If not, see <http://www.gnu.org/licenses/>. #include "rapidxml/rapidxml.hpp" #include "rapidxml/rapidxml_print.hpp" +#include <sstream> +#include <iomanip> + using namespace rapidxml; using namespace astra; @@ -399,8 +402,6 @@ void XMLNode::setContent(double* pfList, int _iSize) template<typename T> static std::string setContentMatrix_internal(T* _pfMatrix, int _iWidth, int _iHeight, bool transposed) { - std::string str = ""; - int s1,s2; if (!transposed) { @@ -411,17 +412,21 @@ static std::string setContentMatrix_internal(T* _pfMatrix, int _iWidth, int _iHe s2 = 1; } + std::ostringstream s; + s.imbue(std::locale::classic()); + s << std::setprecision(17); + for (int y = 0; y < _iHeight; ++y) { if (_iWidth > 0) - str += StringUtil::toString(_pfMatrix[0*s1 + y*s2]); + s << _pfMatrix[0*s1 + y*s2]; for (int x = 1; x < _iWidth; x++) - str += "," + StringUtil::toString(_pfMatrix[x*s1 + y*s2]); + s << "," << _pfMatrix[x*s1 + y*s2]; if (y != _iHeight-1) - str += ";"; + s << ";"; } - return str; + return s.str(); } void XMLNode::setContent(float32* _pfMatrix, int _iWidth, int _iHeight, bool transposed) |