哪个需要更多内存,字符串值或长值?

时间:2012-04-16 10:15:45

标签: c# vb.net variables memory byte

我有一个连接到WCF服务的客户端应用程序,我从服务器获取文件大小为long值然后我在客户端将其转换为string所以它看起来像ex: 52.21 MB

每次用户更改当前目录路径时,应用程序都会获得太多文件大小。

我的问题:我应该从 WCF服务应用将值转换为string格式,然后将其作为string返回给客户端或者我应该只返回long值的大小,让客户端将其转换为string格式

换句话说,哪个值在内存中占用更多字节:

long size = 55050240;
string size = "52.5 MB"; 

long large_size = 56371445760;
string large_size = "52.5 GB";

更新

我使用此方法将long值转换为字符串格式:

private string ConvertUnit(long source)
    {
        const int byteConversion = 1024;
        double bytes = Convert.ToDouble(source);

        if (bytes >= Math.Pow(byteConversion, 3)) //GB Range
        {
            return string.Concat(Math.Round(bytes / Math.Pow(byteConversion, 3), 2), " GB");
        }
        else if (bytes >= Math.Pow(byteConversion, 2)) //MB Range
        {
            return string.Concat(Math.Round(bytes / Math.Pow(byteConversion, 2), 2), " MB");
        }
        else if (bytes >= byteConversion) //KB Range
        {
            return string.Concat(Math.Round(bytes / byteConversion, 2), " KB");
        }
        else //Bytes
        {
            return string.Concat(bytes, " Bytes");
        }
    }

简短问题:需要更多内存,string值或long值?

3 个答案:

答案 0 :(得分:5)

“哪个需要更多内存,字符串值或长值”

C#中的字符串是unicode字符(每个字符是两个字节)+指向该地址的指针(x64 .net应用程序中最少4个字节,8个字节)。

长是8个字节。一旦你在x86上超过2个字符,或者x64上的任何字符,你将占用更多的内存而不是长。

字符串是不可变的,如果你发送了大量符合规格的文件,字符串最终会占用更少的内存。

对于您的实际问题,您应该使用long来真正表示基础对象。

编辑: 已更正,以考虑字符串的指针大小。

答案 1 :(得分:4)

拥有一个输出格式化值的服务层是一个非常糟糕的主意。如果需求发生变化而不是 GB 后缀,客户端应用程序UI需要以字节为单位输出会发生什么?例如56,371,445,760?这将要求客户端应用程序解析然后重新格式化服务器发送的数据。

此外,确定存储单个变量所需的内存很容易。不那么容易的是找出对您的应用程序的整体影响。在您的代码中,不同类型的处理方式会有所不同,因此较小的变量可能会产生更高的成本。

答案 2 :(得分:1)

.NET字符串是UTF-16代码单元的数组,每个字节长2个字节。因此,“52.5 MB”将占用7 * 2 = 14个字节,甚至忽略对字符串的引用(4或8个字节,取决于进程“bit-ness”)和辅助字段,如字符串长度。 long是8个字节,因此很明显字符串更“胖”。

此外,您的示例不会传达相同的信息(您在字符串中丢失“精度”),因此它就像比较苹果和橙子。

即使在SOAP消息中编码,long也应该比string更紧凑。

由于所有这些原因,我会选择long