Skip to content

Commit 3eda4ba

Browse files
authored
[CORE] Reduce cost of XferCRC::xferImplementation by 60% (#1228)
1 parent 3477320 commit 3eda4ba

File tree

2 files changed

+24
-35
lines changed

2 files changed

+24
-35
lines changed

Core/GameEngine/Include/Common/XferCRC.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ class XferCRC : public Xfer
6464

6565
virtual void xferImplementation( void *data, Int dataSize );
6666

67-
void addCRC( UnsignedInt val ); ///< CRC a 4-byte block
67+
inline void addCRC( UnsignedInt val ); ///< CRC a 4-byte block
6868

6969
UnsignedInt m_crc;
7070

Core/GameEngine/Source/Common/System/XferCRC.cpp

Lines changed: 23 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
#include "Common/XferDeepCRC.h"
3535
#include "Common/crc.h"
3636
#include "Common/Snapshot.h"
37-
#include "winsock2.h" // for htonl
37+
#include "utility/endian_compat.h"
3838

3939
//-------------------------------------------------------------------------------------------------
4040
//-------------------------------------------------------------------------------------------------
@@ -97,22 +97,8 @@ void XferCRC::endBlock( void )
9797
//-------------------------------------------------------------------------------------------------
9898
void XferCRC::addCRC( UnsignedInt val )
9999
{
100-
int hibit;
101100

102-
val = htonl(val);
103-
104-
if (m_crc & 0x80000000)
105-
{
106-
hibit = 1;
107-
}
108-
else
109-
{
110-
hibit = 0;
111-
}
112-
113-
m_crc <<= 1;
114-
m_crc += val;
115-
m_crc += hibit;
101+
m_crc = (m_crc << 1) + htobe(val) + ((m_crc >> 31) & 0x01);
116102

117103
} // end addCRC
118104

@@ -139,30 +125,33 @@ void XferCRC::xferSnapshot( Snapshot *snapshot )
139125
//-------------------------------------------------------------------------------------------------
140126
void XferCRC::xferImplementation( void *data, Int dataSize )
141127
{
142-
143-
if (!data || dataSize < 1)
144-
{
145-
return;
146-
}
147-
148128
const UnsignedInt *uintPtr = (const UnsignedInt *) (data);
129+
dataSize *= (data != NULL);
130+
131+
int dataBytes = (dataSize / 4);
149132

150-
for (Int i=0 ; i<dataSize/4 ; i++)
133+
for (Int i=0 ; i<dataBytes; ++i)
151134
{
152135
addCRC (*uintPtr++);
153136
}
154137

155-
int leftover = dataSize & 3;
156-
if (leftover)
138+
UnsignedInt val = 0;
139+
const unsigned char *c = (const unsigned char *)uintPtr;
140+
141+
switch(dataSize & 3)
157142
{
158-
UnsignedInt val = 0;
159-
const unsigned char *c = (const unsigned char *)uintPtr;
160-
for (Int i=0; i<leftover; i++)
161-
{
162-
val += (c[i] << (i*8));
163-
}
164-
val = htonl(val);
165-
addCRC (val);
143+
case 3:
144+
val += (c[2] << 16);
145+
FALLTHROUGH;
146+
case 2:
147+
val += (c[1] << 8);
148+
FALLTHROUGH;
149+
case 1:
150+
val += c[0];
151+
m_crc = (m_crc << 1) + val + ((m_crc >> 31) & 0x01);
152+
FALLTHROUGH;
153+
default:
154+
break;
166155
}
167156

168157
} // end xferImplementation
@@ -179,7 +168,7 @@ void XferCRC::skip( Int dataSize )
179168
UnsignedInt XferCRC::getCRC( void )
180169
{
181170

182-
return htonl(m_crc);
171+
return htobe(m_crc);
183172

184173
} // end skip
185174

0 commit comments

Comments
 (0)