正如已经指出的那样,除非您已经将其隔离为速度问题,否则您不应该尝试手动优化它。从您提交的代码看来,您有更大的外围问题。
当您填充数组时,看起来您首先是从无符号字符的数组或向量中执行此操作的。
m_ByteContainer.Content.resize(iByteCount);
memcpy(&m_ByteContainer.Content[0], &((unsigned char*)(m_pVoiceData))[iStartPos],iByteCount);
写一般会更好
typedef unsigned char uchar_t;
const uchar_t* voiceData = (uchar_t*)m_pVoiceData + iStartPos;
m_ByteContainer.assign(voiceData, voiceData + iByteCount);
并让容器操心优化。
在下一段代码中,for 循环中有一个令人担忧的常量:
double dblRes = 0;
for (int i = 0; i < 50; i++)
从我们看到的代码来看,没有理由认为任何一个容器中都有 50 个字节。您应该将其设为枚举或具有描述性名称的 const 变量,或者您应该使用 m_ByteContainer 或 uTargetFeatureVector 之类的访问器。
// in the class:
const size_t MaxTargetFeatures = 50;
// in the code:
if (m_ByteContainer.empty() || m_byteContainer.size() < iStartPos)
return ...;
const size_t containerBytes = std::min(m_byteContainer.size() - MaxTargetFeatures, iStartPos);
const size_t vectorBytes = std::min(uTargetFeatureVector_Bytes.size(), MaxTargetFeatures);
const size_t maxCompare = std::min(containerEnd, vectorEnd);
const uchar_t* const begin = &m_ByteContainer[iStartPos];
const uchar_t* const end = &m_ByteContainer[iStartPos + maxCompare];
const uchar_t* feat = &uTargetFeatureVector_Bytes.Values[i];
for (const uchar_t* p = begin; p != end; ++p, ++feat)
{
if (*p != *feat)
dblRes += 1;
}
此外,如果这不是您正在为其他人工作的项目,请停止像这样混合应用程序和系统符号。应用程序符号在变量前面加上描述角色/用途/事物种类的信息,例如将“m_”放在成员前面或“countInput”用于递增的变量,而系统在类型前面加上变量,例如“lpszPtr”。现代 IDE 或多或少地使系统符号变得多余,并且可以说,在具有模板和重载的语言中,存在潜在危险。