[英]C++ Performance: template vs boost.any
我想知道如果使用boost.any(沒有RTTI)類,可以使用任何模板都會降低程序的速度。 由於boost any實際上是模板類的包裝器,可以說現代編譯器優化它會產生相同的效果,我是對的嗎?
#include <iostream>
#include <vector>
using namespace std;
template<class T> class tpl
{
T content;
public:
tpl(const T& value) : content(value) {}
operator T() const
{
return content;
}
};
class any
{
public:
any() : content(0) {}
any(const any& other) : content(other.content -> clone()) {}
template<class T> any(const T& value) : content(new holder<T>(value))
{
}
~any()
{
delete content;
}
class placeholder
{
public:
placeholder() {}
virtual placeholder* clone() const = 0;
};
template<class T> class holder : public placeholder
{
public:
T content;
holder(const T& value) : content(value) {}
~holder() {}
placeholder* clone() const
{
return new holder<T>(content);
}
};
template<class T> operator T () const
{
return dynamic_cast<holder<T>*>(content)->content;
}
placeholder* content;
};
template<class T> void test()
{
for (int i = 0; i < 10000; ++i)
{
vector<T> a;
a.push_back(23.23);
a.push_back(3.14);
double x = (double)a[0];
}
}
所以這樣說是正確的:
test<any>();
完全一樣快:
test<tpl<double>>();
假設您知道,就像編譯器在第二個示例中所做的那樣, boost::any
僅在這種情況下用作double? (任何課程都沒有RTTI)。
我更想知道支持和反對這一論點的論點。
此外,是否存在這些方法之間存在差異的特定情況?
編輯:性能測試2:
似乎存在相對較大的差異。
編輯2:由於將主要數據類型double
與類比較any
我做了一個新測試是不公平的:
#include "tpl_vs_any.hpp"
int main()
{
test<any>();
return 0;
}
速度:1,794.54毫秒
#include "tpl_vs_any.hpp"
int main()
{
test<tpl<double>>();
return 0;
}
速度:1,715.57毫秒
多次測試,幾乎相同的基准測試。
所以這樣說是正確的:
...
完全一樣快:
...
假設您知道,就像編譯器在第二個示例中所做的那樣,boost :: any僅在這種情況下用作double?
不是。當前的編譯器遠沒有那種內省程度。 boost::any
會慢一些。
當然,您可以運行代碼並自行查找。
boost::any
內部保存一個指向對象的指針,它用new
分配。 使std::vector
明顯快於std::list
就是該向量將所有對象保存在單個分配中的連續存儲中,除了明顯減少內存分配開銷外,還有更多緩存友好。
還有將RTTI添加到分配的細節,這通常是微不足道的開銷,但是在像double
這樣的非常小的類型的情況下,顯着增加了存儲開銷。
boost::any
不是標准的一部分; 它是特定模板的特定實現。 所以你不妨只是對它進行基准測試; 沒有一堆其他競爭的“標准實施”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.