作者NDark (溺於黑暗)
看板C_and_CPP
标题[问题] vector与array效能问题
时间Mon Nov 16 14:54:56 2009
已获得解答,外加一些测试结果比较请看最後面
原问题:
开发平台 VC++ ( 专案为clr专案,但此部分为un-managed )
不好意思我想询问一个std::vector与c array效能问题.
我在google上查过这个问题,一般看到的说法都是表示两者之间效能是一样好的.
(不管阵列长度会变化这件事情)
但是在我自己的一个专案中测试却发现c array的花费时间较短.不知道问题是出在哪里?
说明如下:
1.
我宣告一个class,内含一个std::vector,如下-
class Class
{
public : std::vector< bool > m_vbParam ;
} ;
2.
我宣告一个上述类别的全域变数物件
Class gsObj ;
3.
[此物件已经resize完成,大小大约是10万左右.(因此是一个10万长度的bool vector)]
在一个全域函式中透过回圈access此全域变数的vector,回圈的index都没有超过长度
void Func1( void )
{
for( i = 0 ... )
{
gsObj.m_vbParam[ i ] ; // (操作取值及存值)
}
}
计算开始及结束的时间
4.
在另一个全域函式中传入一个C Array,然後作相同的事情
void Func2( bool *_cArray )
{
for( i = 0 ... )
{
_cArray[ i ] ; // (操作取值及存值)
}
}
计算开始及结束的时间
5.
将bool vector的内容复制给一个c array,并呼叫Func2()
bool *cArray = NULL ;
cArray = new bool[ gsObj.m_vbParam.size() ] ;
for( i = 0 ; i < gsObj.m_vbParam.size() ; i++ )
cArray[ i ] = gsObj.m_vbParam[ i ] ;
// 这边我本来想用memcpy,可是执行的时候会出错,烦请指点
void Func2( cArray ) ;
delete [] cArray ;
6.比较Fun1. Fun2.的花费时间(不考虑取得记忆体,复制的时间)
c array的时间 比 std vector快7倍左右.
可能的原因有
A global vs. local : Func1是去使用global变数,Func2是使用传入的array ptr.
B vector in class : Func1的global物件内部的vector,较array来的麻烦.
C vector vs. array : 长度很长的index下,效能真的有差别.
D 其他.
虽然我觉得是不应该是这些原因,但结果确实如此.不知问题比较可能出在哪里?
感谢holymars说明,我改用unsigned char vector,就有提升效能了.我分别用
几种不同的函式参数,测试结果如下:
A.使用std::vector<bool>(原来的旧方法)
B.函式中使用全域物件内的std::vector< unsigned char >成员
FuncB(){ gsObj.m_vParam[ ... ] ... }
C.函式呼叫时传入std::vector的reference
FuncC( std::vector< unsigned char >& _param ){ _param[ ... ] ... }
D.函式呼叫时传入由std::vector转型的unsigned char*
FuncD( unsigned char* _param ){ _param[ ... ] ... }
E.先将std::vector用memcpy复制为unsigned char array.然後传入
FuncE( unsigned char* _param ){ _param[ ... ] ... }
阵列长度大约在十万左右,回圈两层(游走总数不超过阵列长度),
回圈内共有三次取值,三次判断,一次assign.
花费时间 参考比例
A. 14.93 ms 7.35
B. 3.98 ms 1.96
C. 4.31 ms 2.12
D. 2.03 ms 1
E. 2.26 ms* 1.11
*E方法的时间包含记忆体宣告,复制过去,复制回来,记忆体释放
--
"May the Balance be with U"(愿平衡与你同在)
视窗介面游戏设计教学(
http://0rz.tw/V28It ),讨论,分享。欢迎来信。
视窗程式设计(Windows CLR Form)游戏架构设计(Game Application Framework)
游戏工具设计(Game App. Tool Design )
电脑图学架构及研究(Computer Graphics)论文代读(含投影片制作)
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.96.77.176
1F:推 holymars:答案是vector<bool>不是一般的std::vector,是特化过的 11/16 15:09
2F:→ holymars:为了节省空间,牺牲了效率 11/16 15:09
3F:→ holymars:vector<bool>是用一个bit一个bit去存bool的 11/16 15:10
4F:→ holymars:喔对了 Effective C++里面有告诉你不要用vector<bool> 11/16 15:11
5F:→ holymars:因为它其实不符合作为一个STL容器的定义 11/16 15:12
6F:→ NDark:这样的话.我应该改用其他类别vector来达到我目的? 11/16 15:15
7F:推 holymars:对 你换成vector<int>和int[]再试一次吧 11/16 15:21
8F:→ holymars:vector<bool>是个美丽的错误,就和Valarray一样 11/16 15:22
9F:→ NDark:了解了....我会试看看的, 3q 11/16 15:30
10F:→ NDark:我加一些测试结果...请勿推文 11/16 16:08
11F:→ NDark:完毕.谢谢 11/16 16:29
※ 编辑: NDark 来自: 140.96.77.176 (11/16 16:30)
12F:推 holymars:测试程式是debug build还是release build? optimization 11/16 18:44
13F:→ holymars:的设定参数分别是? 11/16 18:44
14F:→ NDark:通通都是release,没有另外设定参数 11/16 19:05
15F:推 yoco315:然後如果你真的很坚持要 bool 的话请用 deque<bool> 11/16 21:16
16F:推 softwind:"std::vector转型的unsigned char*"? howto? 11/17 00:04
17F:→ NDark:(unsigned char*) &(*ucharvector.begin()) 11/17 09:24