티스토리 뷰

직렬화 버퍼를 구현하는 중에 Memcpy를 쓰는게 빠른지,

Shift 연산자로 대입하는 것이 좋은지 궁금해 이전에 제작했던 프로파일러를 통해 시간을 확인해 봤다.

 

Memcpy 코드

//넣기
CMessageBuffer& CMessageBuffer::operator <<(float fValue)
{
	memcpy_s((m_chBuffer + m_iWritePos), m_iBufferSize, &fValue, 4);
	m_iWritePos += 4;
	return *this;
}

//빼기
CMessageBuffer& CMessageBuffer::operator >>(float& fValue)
{
	memcpy(&(fValue),  (m_chBuffer + m_iReadPos), 4);
	m_iReadPos += 4;
	return *this;
}

Shift 연산자 코드

//넣기
CMessageBuffer& CMessageBuffer::operator <<(int iValue)
{
	//memcpy_s((m_chBuffer + m_iWritePos), m_iBufferSize,  &iValue, 4 );
	m_chBuffer[m_iWritePos++] = iValue;
	m_chBuffer[m_iWritePos++] = iValue >> 8;
	m_chBuffer[m_iWritePos++] = iValue >> 16;
	m_chBuffer[m_iWritePos++] = iValue >> 24;
	//m_iWritePos += 4;
	return *this;
}

//빼기
CMessageBuffer& CMessageBuffer::operator >>(int& iValue)
{
	iValue = *(m_chBuffer + m_iReadPos) + (*(m_chBuffer + (m_iReadPos + 1)) << 8) + 
		(*(m_chBuffer + (m_iReadPos + 2)) << 16) + (*(m_chBuffer + (m_iReadPos + 3)) << 24);
	m_iReadPos += 4;
	return *this;
}

Test 코드

void Test1()
{
    float fVal = 0.1f;
    float fOut;
    PRO_BEGIN(L"Memcpy");

    for (int j = 0; j < 1000; j++)
    {
        _buffer << fVal;
        _buffer >> fOut;
    }
    PRO_END(L"Memcpy");
}

void Test2()
{
    int iVal = 10;
    int iOut;
    PRO_BEGIN(L"Shift");
    for (int j = 0; j < 1000; j++)
    {
        _buffer << iVal;
        _buffer >> iOut;
    }
    PRO_END(L"Shift");
}
////
main()
    for (int i = 0; i < 1000; i++)
    {      
        Test1();        
    }
    _buffer.Clear();
    for (int j = 0; j < 1000; j++)
    {
        Test2();
    }

결과

Max값은 10에 1번 정도는 Shift가 가끔 높게 나올 때가 있다.

하지만 평균치는 항상 일정하게 20마이크로 세컨드 정도 더 빠르다.

shift 연산자가 보기에는 더 불편해도 쓸 수 있으면 shift 연산자를 쓰는게 더 좋다는 결과가 나왔다.

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함