Linux VM, 1,6 i7, . , , . - , , . , , , .
: Linux g++ 4.6.3, -O3. MS Intel, cygwin g++ 4.5.3, -O3. Linux : : Windows 7 - 64-, Linux VM. , cygwin 32- .
elapsed: 0.46 stringstream
elapsed: 0.11 strtod
cygwin :
elapsed: 1.685 stringstream
elapsed: 0.171 strtod
, cygwin Linux MS. , cygwin Linux VM.
I, istringstream.
std::vector<double> parseVals (std::string &s) {
std::istringstream ss(s);
std::vector<double> vals;
vals.reserve(1000000);
double val;
while (ss >> val) vals.push_back(val);
return vals;
}
I, strtod.
std::vector<double> parseVals2 (char *s) {
char *p = 0;
std::vector<double> vals;
vals.reserve(1000000);
do {
double val = strtod(s, &p);
if (s == p) break;
vals.push_back(val);
s = p+1;
} while (*p);
return vals;
}
, .
std::string one_million_doubles () {
std::ostringstream oss;
double x = RAND_MAX/(1.0 + rand()) + rand();
oss << x;
for (int i = 1; i < 1000000; ++i) {
x = RAND_MAX/(1.0 + rand()) + rand();
oss << " " << x;
}
return oss.str();
}
, :
template <typename PARSE, typename S>
void time_parse (PARSE p, S s, const char *m) {
struct tms start;
struct tms finish;
long ticks_per_second;
std::vector<double> vals_vec;
times(&start);
vals_vec = p(s);
times(&finish);
assert(vals_vec.size() == 1000000);
ticks_per_second = sysconf(_SC_CLK_TCK);
std::cout << "elapsed: "
<< ((finish.tms_utime - start.tms_utime
+ finish.tms_stime - start.tms_stime)
/ (1.0 * ticks_per_second))
<< " " << m << std::endl;
}
main:
int main ()
{
std::string vals_str;
vals_str = one_million_doubles();
std::vector<char> s(vals_str.begin(), vals_str.end());
time_parse(parseVals, vals_str, "stringstream");
time_parse(parseVals2, &s[0], "strtod");
}