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

本文关键字:字符串 内存 | 更新日期: 2023-09-27 18:31:26

我有一个连接到 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";

更新:

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

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值?

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

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

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

Long 为 8 个字节。 一旦 x86 上的字符超过 2 个,或者 x64 上的任何字符都超过 2 个字符,您将占用比 long 更多的内存。

字符串是不可变的,如果您要发送大量相同大小的文件,字符串最终会消耗更少的内存。

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

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

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

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

.

NET 字符串是 UTF-16 代码单元的数组,每个代码单元长 2 个字节。因此,"52.5 MB"将占用 7*2=14 字节,即使忽略对字符串(4 或 8 个字节,取决于进程"位")和辅助字段(如字符串长度)的引用。long是 8 个字节,所以很明显字符串要"胖"得多。

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

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

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