2

WCF サービスに接続するクライアント アプリケーションがあり、サーバーからファイル サイズをlong値として取得し、クライアントでそれを変換して、次のstringように表示します。52.21 MB

ユーザーが現在のディレクトリ パスを変更するたびに、アプリケーションが取得するファイル サイズが多すぎます。

私の質問: WCF サービス アプリから値をstringフォーマットに変換してクライアントに返すか、サイズを値として返し、クライアントにフォーマットに変換させるかstringlongstring

他の方法では、どちらの値がメモリ内でより多くのバイトを必要としますか:

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値を必要とするのはどれですか?

4

3 に答える 3

5

「より多くのメモリ、文字列値、または長い値を必要とするもの」

C#の文字列は、Unicode文字(すべての文字は2バイト)+そのアドレスへのポインター(最小4バイト、x64 .NETアプリケーションでは8バイト)です。

Longは8バイトです。x86で2文字を超えるか、x64で任意の文字を超えると、長いよりも多くのメモリを消費します。

文字列は不変ですが、同じサイズのファイルを多数送信する場合、文字列はメモリの消費量が少なくなります。

実際の質問では、基礎となるオブジェクトを真に表すためにlongを使用する必要があります。

編集:文字列のポインタサイズを考慮に入れるように修正されました。

于 2012-04-16T10:23:11.820 に答える
4

フォーマットされた値を出力するサービス層を持つことは、非常に悪い考えです。要件が変更され、 GBサフィックスではなく、クライアント アプリケーションの UI がバイト単位で出力する必要がある場合はどうなりますか? 例えば56,371,445,760?これには、クライアント アプリケーションが解析し、サーバーから送信されたデータを再フォーマットする必要があります。

また、個々の変数を格納するために必要なメモリを決定するのは簡単です。それほど簡単ではないのは、アプリケーションへの全体的な影響を計算することです。型が異なれば、コード内での処理も異なります。その結果、変数が小さいほどコストが高くなる可能性があります。

于 2012-04-16T10:22:19.927 に答える
3

.NET文字列は、それぞれ2バイト長のUTF-16コードユニットの配列です。したがって、「52.5 MB」は、文字列(プロセスの「ビット数」に応じて4または8バイト)および文字列の長さなどの補助フィールドへの参照を無視しても、7 * 2=14バイトを使用します。はlong8バイトなので、文字列がかなり「太い」ことは明らかです。

また、あなたの例は同じ情報を伝えていないので(文字列の「精度」を失っています)、それはリンゴとオレンジを比較するようなものです。

SOAPメッセージでエンコードされている場合でも、longは文字列よりもコンパクトである必要があります。

これらすべての理由から、私はと一緒に行きlongます。

于 2012-04-16T10:24:10.333 に答える