gpt4 book ai didi

performance - Boost.Variant 与虚拟接口(interface)性能

转载 作者:行者123 更新时间:2023-12-04 00:47:27 25 4
gpt4 key购买 nike

我正在尝试测量使用 Boost.Variant 和使用虚拟接口(interface)之间的性能差异。例如,假设我想统一增加不同类型的数字,使用 Boost.Variant 我将使用 boost::variant over int 和 float 以及一个增加每个数字的静态访问者。使用类接口(interface),我将使用一个纯虚拟类 number 和 number_int 和 number_float 类,它们派生自它并实现“增量”方法。
根据我的测试,使用接口(interface)比使用 Boost.Variant 快得多。
我在底部运行代码并收到以下结果:
虚拟:00:00:00.001028
变体:00:00:00.012081

你认为为什么会有这种差异?我认为 Boost.Variant 会快很多。
** 注意:通常 Boost.Variant 使用堆分配来保证变体总是非空的。但是我在 Boost.Variant 文档中读到,如果 boost::has_nothrow_copy 为真,那么它不会使用堆分配,这应该会使事情变得更快。对于 int 和 float boost::has_nothrow_copy 为真。

这是我用于衡量这两种方法的代码。

#include <iostream>

#include <boost/variant/variant.hpp>
#include <boost/variant/static_visitor.hpp>
#include <boost/variant/apply_visitor.hpp>

#include <boost/date_time/posix_time/ptime.hpp>
#include <boost/date_time/posix_time/posix_time_types.hpp>
#include <boost/date_time/posix_time/posix_time_io.hpp>

#include <boost/format.hpp>

const int iterations_count = 100000;

// a visitor that increments a variant by N
template <int N>
struct add : boost::static_visitor<> {
template <typename T>
void operator() (T& t) const {
t += N;
}
};

// a number interface
struct number {
virtual void increment() = 0;
};

// number interface implementation for all types
template <typename T>
struct number_ : number {
number_(T t = 0) : t(t) {}
virtual void increment() {
t += 1;
}
T t;
};

void use_virtual() {
number_<int> num_int;
number* num = &num_int;

for (int i = 0; i < iterations_count; i++) {
num->increment();
}
}

void use_variant() {
typedef boost::variant<int, float, double> number;
number num = 0;

for (int i = 0; i < iterations_count; i++) {
boost::apply_visitor(add<1>(), num);
}
}

int main() {
using namespace boost::posix_time;

ptime start, end;
time_duration d1, d2;

// virtual
start = microsec_clock::universal_time();
use_virtual();
end = microsec_clock::universal_time();

// store result
d1 = end - start;

// variant
start = microsec_clock::universal_time();
use_variant();
end = microsec_clock::universal_time();

// store result
d2 = end - start;

// output
std::cout <<
boost::format(
"Virtual: %1%\n"
"Variant: %2%\n"
) % d1 % d2;
}

最佳答案

对于那些感兴趣的人,在我有点沮丧之后,我将选项 -O2 传递给了编译器,并且 boost::variant 比虚拟调用要快得多。
谢谢

关于performance - Boost.Variant 与虚拟接口(interface)性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11906741/

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