[英]Why stoi is much slower than stringstream without -O3?
今天我在談論C ++ 11中的新聞,如線程,to_string和stoi。
但事實上,所有這些在C ++ 98中已經成為可能。
然后我決定比較舊庫和新聞庫:
C ++ 11:
g ++ -std = c ++ 11 main.cpp
#include <iostream>
#include <string>
#include <ctime>
using namespace std;
int main()
{
clock_t tStart = clock();
string input = "50";
for (int i = 0; i < 50000; i++)
{
int number = stoi(input);
}
cout << (double)(clock() - tStart) << endl;
return 0;
}
C ++ 98
g ++ 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;
}
屏幕截圖:
Windows 7輕型服務器:
Ubuntu 14.04:
Slackware Server 14.1通過SSH:
隨着優化
Windows 7輕型服務器:
Ubuntu 14.04:
Slackware Server 14.1通過SSH:
配置:
Windows 7輕型服務器: Intel(R)Core(TM)i5-4590 CPU @ 3.30GHz
Ubuntu 14.04: Intel(R)Core(TM)i7-2670QM CPU @ 2.20GHz
Slackware Server 14.1通過SSH: Intel(R)Core(TM)i3-4150 CPU @ 3.50GHz
問題:
stoi和stringstream有什么區別?
為什么以及何時在字符串lib(stoi,to_string)中使用新聞函數?
最后......使用-O3,stoi速度要快得多,而sstream則不然。 那么,-O3對stoi的作用比對sstream沒有做的更多?
我剛剛檢查過以下內容:
gcc -v:
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
while true; do ./stoi_perf; done
while true; do ./stoi_perf; done
並重復幾次后停止:
stringstream_test completed in 10449080 nanoseconds.
stoi_test completed in 10437559 nanoseconds.
stringstream_test completed in 9074869 nanoseconds.
stoi_test completed in 9895661 nanoseconds.
stringstream_test completed in 11516788 nanoseconds.
stoi_test completed in 12266627 nanoseconds.
stringstream_test completed in 10017085 nanoseconds.
stoi_test completed in 9468441 nanoseconds.
stringstream_test completed in 9957401 nanoseconds.
stoi_test completed in 9483004 nanoseconds.
stringstream_test completed in 10069845 nanoseconds.
stoi_test completed in 9657653 nanoseconds.
stringstream_test completed in 9568359 nanoseconds.
stoi_test completed in 9162406 nanoseconds.
stringstream_test completed in 9868536 nanoseconds.
stoi_test completed in 9166439 nanoseconds.
stringstream_test completed in 9059762 nanoseconds.
stoi_test completed in 11558076 nanoseconds.
stringstream_test completed in 11673084 nanoseconds.
stoi_test completed in 13432386 nanoseconds.
...
正如您可能看到,兩個測試都給出了可比較的結果,有時候一個測試稍微好一點。 我的工作站很繁忙(有一個后台進程完全吃掉了六個中的一個或兩個核心)但即使在這樣的條件下,測試結果看起來也令我滿意。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.