让我们计算一下数字:
2022 年编辑:
使用带有 GCC 10.3 的 Quick-Bench 并使用 C++20 进行编译(对常量进行了一些小的更改)表明 std::string 是 now faster,几乎是 3 倍:
原始答案(2014 年)
代码(我用PAPITimers)
main.cpp
#include <iostream>
#include <string>
#include <stdio.h>
#include "papi.h"
#include <vector>
#include <cmath>
#define TRIALS 10000000
class Clock
{
public:
typedef long_long time;
time start;
Clock() : start(now()){}
void restart(){ start = now(); }
time usec() const{ return now() - start; }
time now() const{ return PAPI_get_real_usec(); }
};
int main()
{
int eventSet = PAPI_NULL;
PAPI_library_init(PAPI_VER_CURRENT);
if(PAPI_create_eventset(&eventSet)!=PAPI_OK)
{
std::cerr << "Failed to initialize PAPI event" << std::endl;
return 1;
}
Clock clock;
std::vector<long_long> usecs;
const char* baseLocation = "baseLocation";
//std::string baseLocation = "baseLocation";
char fname[255] = {};
for (int i=0;i<TRIALS;++i)
{
clock.restart();
snprintf(fname, 255, "%s_test_no.%d.txt", baseLocation, i);
//std::string fname = baseLocation + "_test_no." + std::to_string(i) + ".txt";
usecs.push_back(clock.usec());
}
long_long sum = 0;
for(auto vecIter = usecs.begin(); vecIter != usecs.end(); ++vecIter)
{
sum+= *vecIter;
}
double average = static_cast<double>(sum)/static_cast<double>(TRIALS);
std::cout << "Average: " << average << " microseconds" << std::endl;
//compute variance
double variance = 0;
for(auto vecIter = usecs.begin(); vecIter != usecs.end(); ++vecIter)
{
variance += (*vecIter - average) * (*vecIter - average);
}
variance /= static_cast<double>(TRIALS);
std::cout << "Variance: " << variance << " microseconds" << std::endl;
std::cout << "Std. deviation: " << sqrt(variance) << " microseconds" << std::endl;
double CI = 1.96 * sqrt(variance)/sqrt(static_cast<double>(TRIALS));
std::cout << "95% CI: " << average-CI << " usecs to " << average+CI << " usecs" << std::endl;
}
与 cmets 一起玩以获得一种或另一种方式。
在我的机器上使用编译行对这两种方法进行了 1000 万次迭代:
g++ main.cpp -lpapi -DUSE_PAPI -std=c++0x -O3
使用字符数组:
Average: 0.240861 microseconds
Variance: 0.196387microseconds
Std. deviation: 0.443156 microseconds
95% CI: 0.240586 usecs to 0.241136 usecs
使用字符串方法:
Average: 0.365933 microseconds
Variance: 0.323581 microseconds
Std. deviation: 0.568842 microseconds
95% CI: 0.365581 usecs to 0.366286 usecs
所以至少在我的机器上使用我的代码和我的编译器设置,我看到在移动到字符串时速度降低了大约 50%。 使用以下公式,字符数组的速度比字符串快 34% :
((字符串时间)-(字符数组时间))/(字符串时间)
这将方法之间的时间差异作为单独字符串的时间百分比给出。我原来的百分比是正确的;我改为使用字符数组方法作为参考点,它显示在移动到字符串时会减慢 52%,但我发现它具有误导性。
我会因为我做错的事情而接受任何和所有的 cmets :)
2015 年编辑
使用 GCC 4.8.4 编译:
字符串
Average: 0.338876 microseconds
Variance: 0.853823 microseconds
Std. deviation: 0.924026 microseconds
95% CI: 0.338303 usecs to 0.339449 usecs
字符数组
Average: 0.239083 microseconds
Variance: 0.193538 microseconds
Std. deviation: 0.439929 microseconds
95% CI: 0.238811 usecs to 0.239356 usecs
因此,字符数组方法的速度仍然明显更快,尽管速度较慢。在这些测试中,它的速度提高了大约 29%。