为什么stoi比没有-O3的stringstream慢得多?

时间:2016-02-10 05:01:58

标签: c++ c++11 stringstream c++98

今天我在谈论C ++ 11中的新闻,如线程,to_string和stoi。

但实际上,所有这些在C ++ 98中已经成为可能。

然后我决定比较旧库和新闻库:

C ++ 11:

  

g ++ -std = c ++ 11 main.cpp

#include <iostream>
#include <string>
#include <sstream>
#include <ctime>

using namespace std;

int main()
{
    clock_t tStart = clock();
    string input = "50";
    stringstream ss;

    for (int i = 0; i < 50000; i++)
    {
        int number;
        ss << input;
        ss >> number;
    }

    cout << (double)(clock() - tStart) << endl;
    return 0;
}

C ++ 98

  

g ++ main.cpp

WindowState = FormWindowState.Minimized;

屏幕截图:

Windows 7 light-server:

enter image description here

enter image description here

Ubuntu 14.04:

enter image description here

enter image description here

通过SSH

Slackware Server 14.1:

enter image description here

enter image description here

有优化

Windows 7 light-server:

enter image description here

enter image description here

Ubuntu 14.04:

enter image description here

enter image description here

通过SSH

Slackware Server 14.1:

enter image description here

enter image description here

配置:

Windows 7 light-server: Intel(R)Core(TM)i5-4590 CPU @ 3.30GHz

Ubuntu 14.04: Intel(R)Core(TM)i7-2670QM CPU @ 2.20GHz

通过SSH

Slackware Server 14.1: Intel(R)Core(TM)i3-4150 CPU @ 3.50GHz

问题:

stoi和stringstream有什么区别?

为什么以及何时在字符串lib(stoi,to_string)中使用新闻函数?

最后......使用-O3,stoi速度要快得多,而sstream则不然。那么,-O3对stoi的作用比对sstream没有做的那样?

1 个答案:

答案 0 :(得分:7)

我刚刚检查过以下内容:

gcc -v:

meta/dont_redirect/http_status_list

代码:

Using built-in specs.
COLLECT_GCC=x86_64-alt-linux-gcc
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-alt-linux/5/lto-wrapper
Target: x86_64-alt-linux
Configured with: ../configure --host=x86_64-alt-linux --build=x86_64-alt-linux --target=x86_64-alt-linux --prefix=/usr --exec-prefix=/usr --bindir=/usr/bin --sbindir=/usr/sbin --sysconfdir=/etc --datadir=/usr/share --includedir=/usr/include --libdir=/usr/lib64 --libexecdir=/usr/libexec --localstatedir=/var/lib --sharedstatedir=/var/lib --mandir=/usr/share/man --infodir=/usr/share/info --disable-dependency-tracking --without-included-gettext --enable-shared --program-suffix=-5 --with-slibdir=/lib64 --with-bugurl=http://bugzilla.altlinux.org --enable-__cxa_atexit --enable-threads=posix --enable-checking=release --with-system-zlib --without-included-gettext --enable-multilib --enable-gnu-unique-object --enable-linker-build-id --with-linker-hash-style=gnu --with-arch_32=i586 --with-tune_32=generic --with-multilib-list=m64,m32,mx32 --enable-bootstrap --enable-languages=c,c++,fortran,objc,obj-c++,java,ada,go,lto --enable-plugin --enable-java-awt=gtk --with-native-libdir=/usr/lib64/gcj-5 --with-ecj-jar=/usr/share/java/ecj.jar --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-5-1.5.0.0/jre --enable-libgcj-multifile --disable-libjava-multilib --enable-java-maintainer-mode
Thread model: posix
gcc version 5.3.1 20151207 (ALT Linux 5.3.1-alt1) (GCC)

编译为#include <iostream> #include <string> #include <chrono> #include <sstream> using namespace std; using namespace chrono; void stringstream_test(const string& input, int repetitions) { stringstream ss; auto start = steady_clock::now(); for (int i = 0; i < repetitions; i++) { int number; ss << input; ss >> number; } auto end = steady_clock::now(); auto dur = duration_cast<nanoseconds>(end - start); cout << "stringstream_test completed in " << dur.count() << " nanoseconds." << endl; } void stoi_test(const string& input, int repetitions) { auto start = steady_clock::now(); for (int i = 0; i < repetitions; i++) { int number = stoi(input); } auto end = steady_clock::now(); auto dur = duration_cast<nanoseconds>(end - start); cout << "stoi_test completed in " << dur.count() << " nanoseconds." << endl; } int main() { stringstream_test("50", 500000); stoi_test("50", 500000); return 0; }

结果,收到c++ -std=c++11 -O3 -o stoi_perf stoi_perf.cc并在重复几次后停止:

while true; do ./stoi_perf; done

正如您可能会看到两个测试都给出了可比较的结果,有时候会比另一个略好。我的工作站很繁忙(背景过程完全占用六个中的一个或两个核心)但即使在这样的条件下,测试结果对我来说也是令人满意的。