C# 获取通过编码创建的字节数的最有效方法是什么?

C# 获取通过编码创建的字节数的最有效方法是什么?,c#,.net,encoding,C#,.net,Encoding,我需要一个字节缓冲区通过TCP发送。我需要一种有效地确定通过编码字符串之类的内容创建的字节数的方法 如果我只使用这段代码,就没有必要这样做 byte[] buffer = encoder.GetBytes("Hello Client!"); clientStream.Write(buffer, 0 , buffer.Length); 但问题是,我将一个接一个地发送多条消息,每次我想发送消息时,这段代码都会为字节缓冲区分配内存。我的理解是his效率低/速度慢,因为它每次都分配内存 我要做的是创建

我需要一个字节缓冲区通过TCP发送。我需要一种有效地确定通过编码字符串之类的内容创建的字节数的方法

如果我只使用这段代码,就没有必要这样做

byte[] buffer = encoder.GetBytes("Hello Client!");
clientStream.Write(buffer, 0 , buffer.Length);
但问题是,我将一个接一个地发送多条消息,每次我想发送消息时,这段代码都会为字节缓冲区分配内存。我的理解是his效率低/速度慢,因为它每次都分配内存

我要做的是创建一个大字节缓冲区,将所有消息写入其中,并只发送包含消息的数组的一部分。但是我找不到一个有效的方法来做这件事。ASCII.Encoding.Getbytes(string)将只返回字节数组并将其放入大字节缓冲区,从位置0开始。我需要将消息的字节长度放入字节缓冲区,而不必调用getbytes(string).length,因为这样会再次对其进行编码,效率很低


可能有一些显而易见的解决办法,我找不到

我同意Joachim的观点,你似乎试图在没有任何证据(如分析数据)表明你首先需要这样做的情况下过早地优化你的程序。伟大的Donald Knuth说过“过早优化是万恶之源”——请牢记这一点

除此之外,第二个问题是分配不是一项昂贵的操作。一般来说,分配在O(1)时间内完成。实际的编码操作要昂贵很多倍

第三,是的,你的问题有解决办法;但我看不出有什么意义,因为字符串在给定编码中需要的字节数是不可预测的,这就是为什么(默认情况下)
encoding
子类可以自由分配和返回自己的缓冲区,因为这意味着您将永远不需要使用更大的缓冲区再次调用该方法,以防您的初始调用提供的缓冲区不够大

另一个问题是.NET字符串与以null结尾的C字符串不同,它具有固定的长度,并且缺少终止符(.NET字符串可以包含null字符,而C字符串不能)。因此,您可能需要在每次使用时清除缓冲区,这会进一步降低程序的速度:

您需要使用两种方法:
编码.GetBytesCount(String)
编码.GetBytes(String,Int32,Int32,Byte[],Int32)
,如下所示:

Encoding encoder = ...
Byte[] buffer = new Byte[1024]; // allocating a 1KB-sized buffer which it is hoped is large enough for every possible string

foreach(String str in stringsToEncode) {
    buffer.Initialize(); // reset every byte to zero (your program may need this, or it may not; I don't know enough about it).

    Int32 bytesWritten;
    do {
        try {
            bytesWritten = encoder.GetBytes( str, 0, str.Length, buffer, 0 );
        } catch(ArgumentException) {
            bytesWritten = Int32.MaxValue;
            buffer = new Byte[ buffer.Length * 2 ];
        }
    }
    while( bytesWritten == Int32.MaxValue )
}

当然,这段代码本身也会有问题。但是你应该明白这一点。

在你开始担心效率低下之前,你应该分析和衡量你的代码。你可能会发现这不会是一个瓶颈,但在你测量之前你无法确定。虽然知道编写代码的最佳方式是好的,但我觉得在.net这样的平台上,担心微观优化是浪费时间,因为clr将在编译时优化代码it@VamsiKrishnaCLR不是魔法。您的疏忽会导致代码无法执行。碰巧大多数时候它都没有被注意到。@Asti我从来没有说过它是神奇的,我甚至从来没有说过不需要学习如何编写好的代码,我只是说有时编译器会为您进行优化,可能我并没有这样说,但我就是这么说的meant@VamsiKrishna很公平。现在有一种趋势(大多数是从Java/.Net开始的人)根本不关心性能/GC,因为人们认为编译器/VM/JIT会做一些事情(这种情况很少发生)。就像人们试图通过编写较慢的代码来弥补摩尔定律。