在C#中将字符串转换为byte[]数组的最快方法是什么?我正在通过套接字发送大量的字符串数据,并且需要优化每个操作。目前,我使用以下命令将字符串转换为byte[]数组:
private static readonly Encoding encoding = new ASCIIEncoding();
//...
byte[] bytes = encoding.GetBytes(someString);
socket.Send(bytes);
//...
发布于 2009-08-26 14:47:13
如果你所有的数据都是ASCII码,那么你可以比ASCIIEncoding
稍微快一点,它有各种(完全合理的)位错误处理等。你也可以通过避免总是创建新的字节数组来加快速度。假设你有一个上限,你所有的消息都在这个上限下:
void QuickAndDirtyAsciiEncode(string chars, byte[] buffer)
{
int length = chars.Length;
for (int i = 0; i < length; i++)
{
buffer[i] = (byte) (chars[i] & 0x7f);
}
}
然后你会做一些类似这样的事情:
readonly byte[] Buffer = new byte[8192]; // Reuse this repeatedly
...
QuickAndDirtyAsciiEncode(text, Buffer);
// We know ASCII takes one byte per character
socket.Send(Buffer, text.Length, SocketFlags.None);
然而,这是一个非常绝望的优化。我会坚持使用ASCIIEncoding
,直到我证明这是瓶颈(或者至少这种糟糕的黑客攻击没有帮助)。
发布于 2009-08-26 14:34:09
我要说的是,你现在的做法已经足够好了。如果你真的关心像那样的低级优化,我能做的最好的建议是获取Reflector。使用reflector,您可以自己查看代码(大多数时候),并了解算法是什么。如果reflector没有显示,您可以随时下载Microsofts (共享源代码公共语言基础架构)来查看MethodImplOptions.InternalCall方法背后的C++代码。
以下是Encoding.ASCII.GetBytes的实际实现,以供参考:
public override int GetBytes(string chars, int charIndex, int charCount, byte[] bytes, int byteIndex)
{
if ((chars == null) || (bytes == null))
{
throw new ArgumentNullException();
}
if ((charIndex < 0) || (charCount < 0))
{
throw new ArgumentOutOfRangeException();
}
if ((chars.Length - charIndex) < charCount)
{
throw new ArgumentOutOfRangeException();
}
if ((byteIndex < 0) || (byteIndex > bytes.Length))
{
throw new ArgumentOutOfRangeException();
}
if ((bytes.Length - byteIndex) < charCount)
{
throw new ArgumentException();
}
int num = charIndex + charCount;
while (charIndex < num)
{
char ch = chars[charIndex++];
if (ch >= '\x0080')
{
ch = '?';
}
bytes[byteIndex++] = (byte) ch;
}
return charCount;
}
发布于 2009-08-26 14:34:23
我想GetBytes()函数已经为此进行了很好的优化。我想不出任何建议来提高您现有代码的速度。
编辑--你知道,我不知道这是不是更快。但这里有另一种使用BinaryFormatter的方法:
BinaryFormatter bf = new BinaryFormatter();
MemoryStream ms = new MemoryStream();
bf.Serialize(ms, someString);
byte[] bytes = ms.ToArray();
ms.Close();
socket.Send(bytes);
我认为这可能更快的原因是它跳过了编码步骤。我也不能完全确定这是否能正常工作。但是你可以试一试,看看。当然,如果你需要ascii编码,这是没有用的。
我只是有了另一个想法。我相信这段代码返回的字节数是使用ASCII码的GetBytes的两倍。原因是.NET中的所有字符串都在幕后使用unicode。当然,Unicode每个字符使用2个字节,而ASCII只使用1个字节,所以在这种情况下可能不使用BinaryFormatter,因为这样会使通过套接字发送的数据量加倍。
https://stackoverflow.com/questions/1337895
复制相似问题