在对我的应用程序进行分析时,我意识到很多时间都花费在字符串比较上。因此,我编写了一个简单的基准测试,我惊讶地发现'=='比string::compare和strcmp慢得多!这是代码,有人能解释为什么吗?或者我的代码有什么问题吗?因为根据标准,'=='只是一个运算符重载,简单地返回!lhs.compare(rhs)。
#include <iostream>
#include <vector>
#include <string>
#include <stdint.h>
#include "Timer.h"
#include <random>
#include <time.h>
#include <string.h>
using namespace std;
uint64_t itr = 10000000000;//10 Billion
int len = 100;
int main() {
srand(time(0));
string s1(len,random()%128);
string s2(len,random()%128);
uint64_t a = 0;
Timer t;
t.begin();
for(uint64_t i =0;i<itr;i++){
if(s1 == s2)
a = i;
}
t.end();
cout<<"== took:"<<t.elapsedMillis()<<endl;
t.begin();
for(uint64_t i =0;i<itr;i++){
if(s1.compare(s2)==0)
a = i;
}
t.end();
cout<<".compare took:"<<t.elapsedMillis()<<endl;
t.begin();
for(uint64_t i =0;i<itr;i++){
if(strcmp(s1.c_str(),s2.c_str()))
a = i;
}
t.end();
cout<<"strcmp took:"<<t.elapsedMillis()<<endl;
return a;
}
以下是运行结果:
== took:5986.74
.compare took:0.000349
strcmp took:0.000778
我的编译标志:
CXXFLAGS = -O3 -Wall -fmessage-length=0 -std=c++1y
我在一台x86_64的Linux机器上使用gcc 4.9。
显然,使用-o3会进行一些优化,我猜最后两个循环被完全排除了;然而,即使使用-o2,结果仍然很奇怪:
对于10亿次迭代:
== took:19591
.compare took:8318.01
strcmp took:6480.35
附注:Timer只是一个测量花费时间的包装类;我对此非常确定:D
Timer类的代码:
#include <chrono>
#ifndef SRC_TIMER_H_
#define SRC_TIMER_H_
class Timer {
std::chrono::steady_clock::time_point start;
std::chrono::steady_clock::time_point stop;
public:
Timer(){
start = std::chrono::steady_clock::now();
stop = std::chrono::steady_clock::now();
}
virtual ~Timer() {}
inline void begin() {
start = std::chrono::steady_clock::now();
}
inline void end() {
stop = std::chrono::steady_clock::now();
}
inline double elapsedMillis() {
auto diff = stop - start;
return std::chrono::duration<double, std::milli> (diff).count();
}
inline double elapsedMicro() {
auto diff = stop - start;
return std::chrono::duration<double, std::micro> (diff).count();
}
inline double elapsedNano() {
auto diff = stop - start;
return std::chrono::duration<double, std::nano> (diff).count();
}
inline double elapsedSec() {
auto diff = stop - start;
return std::chrono::duration<double> (diff).count();
}
};
#endif /* SRC_TIMER_H_ */
strcmp
代码是错误的。你应该在那里使用== 0
。 - Rapptz==
的基准测试替换为.compare
,你会得到相同的结果吗? - Pedro Gimeno==
代码,之后过了6分钟我终止了程序。将十亿改成一百万,得到这些结果:==所用时间为:37.5232秒
,compare所用时间为:19.3218秒
,strcmp所用时间为:12.3108秒
。 - Jonny Henly