gpt4 book ai didi

使用模板化函数的 C++ STD::Vector 运行时间异常长

转载 作者:行者123 更新时间:2023-11-30 04:40:35 25 4
gpt4 key购买 nike

以下函数对 T 的两个值进行操作。一个是 4 个字节(与 DWORD 相同)。另一个是 64 字节。 Buffer 旨在将对象存储在其缓存中,并在以后检索它们。

当使用 64 字节结构时,函数中的总时间量急剧增加。 vector 中的寻道时间、memcpy 甚至函数“SELF”部分的时间都急剧上升。

store 函数几乎与下面的代码相反,并且似乎没有遇到相同的不对称时序。

关于原因有什么想法吗?

template <class T>
void Buffer::retrieve ( T& Value )
{
int nTypeSize = sizeof ( T );
int nDWORDSize = sizeof ( DWORD );

/*
* Number of DWORDs needed to store this value.
*/

int nDWORDCount = ( nTypeSize + 3 ) / 4;

if ( m_nReadPosition + nDWORDCount >= m_nSize )
return;

memcpy ( &Value, &m_Cache[m_nReadPosition], nTypeSize ); //m_Cache is a DWORD vector.
m_nReadPosition += nDWORDCount;
}

最佳答案

memcpy 时间的增加可能只是因为复制了更多的字节,因为 memcpy 时间会随着被复制的内存量而缩放(天真地)。它不一定是线性缩放,因为 memcpy 的某些实现将通过一次复制 32 或 64 位进行优化。

std::vector 中的查找不应随对象大小缩放,因为 m_nReadPosition 或 m_Cache 都不依赖于 T。

虽然 4 字节结构可以存储在 32 位处理器上的寄存器中,但任何操作 T 的代码都会变慢,而任何更大的结构都会让编译器处理起来更加复杂。这可能会增加一些开销。

总时间增加了多少?如果它是 16 的倍数,我会把它归结为 T 大小的变化。

关于使用模板化函数的 C++ STD::Vector 运行时间异常长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1075147/

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