gpt4 book ai didi

c++ - 如何使用自定义库的 boost 库进行性能测试

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:29:30 24 4
gpt4 key购买 nike

我需要对用 C++ 编写的库进行性能测试。该库由几组结构组成。我已经对这些类进行了序列化测试,但不确定如何对这些类进行性能测试。下面是库中结构的示例

struct X
{
public:
int p;
double q;

X();
~X();
}

struct Y
{
float m;
double n;

Y();
~Y();
}

struct Z
{
public:
std::map<std::string,boost::shared_ptr<X>> Xtype;
std::map<std::string,boost::shared_ptr<Y>> Ytype;

int i;
string name;

Z();
~Z();

}

如果提供任何示例,那将是非常好的。

最佳答案

好的,所以我为类型添加了序列化(你为什么不加它?)

struct X
{
int p;
double q;
private:
friend boost::serialization::access;
template <typename Ar>
void serialize(Ar& ar, unsigned) {
ar & BOOST_SERIALIZATION_NVP(p);
ar & BOOST_SERIALIZATION_NVP(q);
}
};

struct Y
{
float m;
double n;
private:
friend boost::serialization::access;
template <typename Ar>
void serialize(Ar& ar, unsigned) {
ar & BOOST_SERIALIZATION_NVP(m);
ar & BOOST_SERIALIZATION_NVP(n);
}
};

struct Z
{
std::map<std::string, boost::shared_ptr<X>> Xtype;
std::map<std::string, boost::shared_ptr<Y>> Ytype;

int i;
std::string name;
private:
friend boost::serialization::access;
template <typename Ar>
void serialize(Ar& ar, unsigned) {
ar & BOOST_SERIALIZATION_NVP(i);
ar & BOOST_SERIALIZATION_NVP(name);
ar & BOOST_SERIALIZATION_NVP(Xtype);
ar & BOOST_SERIALIZATION_NVP(Ytype);
}
};

现在,使用 the Nonius benchmarking mini-framework ,编写以下基准:

Z const& fixture(); // forward

#include <nonius/main.h++>
#include <sstream>

NONIUS_BENCHMARK("text archive", [](nonius::chronometer meter) {
auto const& z = fixture();
meter.measure([&](int /*i*/) {
std::stringstream ss;
boost::archive::text_oarchive oa(ss);
oa << z;

Z clone;
boost::archive::text_iarchive ia(ss);
ia >> clone;

return ss.str().size(); // something observable to thwart the overly smart optimizer
});
})

NONIUS_BENCHMARK("binary archive", [](nonius::chronometer meter) {
auto const& z = fixture();
meter.measure([&](int /*i*/) {
std::stringstream ss;
boost::archive::binary_oarchive oa(ss);
oa << z;

Z clone;
boost::archive::binary_iarchive ia(ss);
ia >> clone;

return ss.str().size(); // something observable to thwart the overly smart optimizer
});
})

NONIUS_BENCHMARK("xml archive", [](nonius::chronometer meter) {
auto const& z = fixture();
meter.measure([&](int /*i*/) {
std::stringstream ss;
boost::archive::xml_oarchive oa(ss);
oa << boost::serialization::make_nvp("root", z);

Z clone;
boost::archive::xml_iarchive ia(ss);
ia >> boost::serialization::make_nvp("root", clone);

return ss.str().size(); // something observable to thwart the overly smart optimizer
});
})

原始输出是(对于 1000 个随机 X 和 3000 个随机 Y 值的夹具):

text archive
mean: 236.069 μs
std dev: 2.54923 μs
variance is unaffected by outliers

binary archive
mean: 92.9736 μs
std dev: 3.35504 μs
variance is moderately inflated by outliers

xml archive
mean: 786.746 μs
std dev: 4.676 μs
variance is unaffected by outliers

enter image description here

互动情节: click here


test fixture其实多了很多工作,定义如下:

#include <boost/random.hpp> // for test data
#include <boost/bind.hpp>
#include <boost/make_shared.hpp>
#include <algorithm>

Z const& fixture()
{
static Z const z = [] {
Z z;

boost::random::mt19937 engine;
auto fgen = boost::bind(boost::random::uniform_real_distribution<float>(), engine);
auto dgen = boost::bind(boost::random::uniform_real_distribution<double>(), engine);
auto cgen = boost::bind(boost::random::uniform_int_distribution<char>('a', 'z'), engine);
auto igen = boost::bind(boost::random::uniform_int_distribution<int>(), engine);

auto sgen = [&] (int maxlen) { std::string s; std::generate_n(back_inserter(s), igen() % maxlen, cgen); return s; };

std::generate_n(inserter(z.Ytype, z.Ytype.end()), 1000, [&] {
auto py = boost::make_shared<Y>();
py->m = fgen();
py->n = dgen();
return std::make_pair(sgen(32), py);
});
std::generate_n(inserter(z.Xtype, z.Xtype.end()), 3000, [&] {
auto px = boost::make_shared<X>();
px->p = igen();
px->q = dgen();
return std::make_pair(sgen(32), px);
});

z.i = igen();
z.name = sgen(8);

return z;
}();
return z;
}

完整代码 list

关于 Coliru

关于c++ - 如何使用自定义库的 boost 库进行性能测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23571355/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com