JavaScriptオブジェクトのサイズを取得する方法は?


296

JavaScriptオブジェクトが占めるサイズを知りたい。

次の関数を取ります:

function Marks(){
  this.maxMarks = 100;
}

function Student(){
  this.firstName = "firstName";
  this.lastName = "lastName";
  this.marks = new Marks();
}

今私はインスタンス化しますstudent

var stud = new Student();

私ができることをできるように

stud.firstName = "new Firstname";

alert(stud.firstName);

stud.marks.maxMarks = 200;

これで、studオブジェクトはメモリ内である程度のサイズを占有します。いくつかのデータとより多くのオブジェクトがあります。

studオブジェクトが使用しているメモリ量を確認するにはどうすればよいですか?sizeof()JavaScriptのようなものですか?のような単一の関数呼び出しでそれを見つけることができれば、それは本当に素晴らしいでしょうsizeof(stud)

私は何ヶ月もインターネットを検索してきましたが、見つかりませんでした(いくつかのフォーラムで質問されました-返信はありません)。


41
JavaScriptでオブジェクトのサイズを調べる必要がある理由はたくさんあります(発生します)。私はJavaScriptを初めて使用するため、ベストプラクティスに従いません。私はまだそれらを学んでいます。Firefoxの拡張機能を開発しましたが、必要以上に多くのメモリを使用しています。私は(うまくいけば)メモリ使用量を減らすいくつかの方法に取り組んでいます。タブごとに何千ものインスタンスと多くのオブジェクトについて話しているので、メモリは重要です!重要なのは、私のメモリ削減の取り組みが実際にメモリの削減に役立つかどうか、そしてその量を知りたいということです。

1
FF拡張機能を作成した場合は、JSよりも高い言語レベルで調査することをお勧めします。FF自体への影響を確認してください。
アンナカタ09

2
JSより高いレベルの言語?この場合、それは何でしょうか?

24
とにかく重要なのはサイズではありません。それはあなたがそれを使う方法です。PS:なんてスタッドだ!
Thomas Eding、2011年

13
@SpencerRuportオブジェクトサイズを知る最大の理由の1つは、ストレージ容量が限られているhtml5オフライン対応アプリケーションの場合です(データ集約型アプリケーションの場合、5-10Mbはすぐに使い果たされる可能性があります)。
デビッド

回答:


181

元の回答でコードをリファクタリングしました。再帰を削除し、想定される存在のオーバーヘッドを削除しました。

function roughSizeOfObject( object ) {

    var objectList = [];
    var stack = [ object ];
    var bytes = 0;

    while ( stack.length ) {
        var value = stack.pop();

        if ( typeof value === 'boolean' ) {
            bytes += 4;
        }
        else if ( typeof value === 'string' ) {
            bytes += value.length * 2;
        }
        else if ( typeof value === 'number' ) {
            bytes += 8;
        }
        else if
        (
            typeof value === 'object'
            && objectList.indexOf( value ) === -1
        )
        {
            objectList.push( value );

            for( var i in value ) {
                stack.push( value[ i ] );
            }
        }
    }
    return bytes;
}

35
オブジェクトキーについても考えることができます
zupa

8
false / trueの目的で最小の型を探してここに上陸した人は、未定義/ nullのようです。
zupa 2013年

3
"よんもじ".lengthJavascriptでは4ですが、コードがそれを返すので、8バイトでよろしいですか?
syockit 2013

8
うん。JavaScriptの文字は、ECMA-262 3rd Edition仕様に従って保存されます-bclary.com/2004/11/07/#a-4.3.16
-peter

4
この関数は、クロージャーに隠されている参照をカウントしません。たとえば、var a={n:1}; var b={a:function(){return a}}; roughSizeOfObject(b)ここでbはへの参照を保持してaroughSizeOfObject()ますが、を返します0
ローマポミノフ2014年

117

Google Chromeヒーププロファイラーを使用すると、オブジェクトメモリの使用状況を検査できます。

トレースでオブジェクトを見つけられるようにする必要がありますが、これは注意が必要です。オブジェクトをウィンドウグローバルに固定すると、「包含」リストモードから簡単に見つけることができます。

添付のスクリーンショットでは、ウィンドウに「testObj」というオブジェクトを作成しました。次に、(記録を作成した後)プロファイラーに移動すると、オブジェクトのフルサイズとその中のすべてが[保持サイズ]の下に表示されます。

メモリの内訳の詳細

Chromeプロファイラー

上記のスクリーンショットでは、オブジェクトの保持サイズは60です。ここでは単位はバイトであると思います。


13
この回答は私の問題を一緒に解決しました:developers.google.com/chrome-developer-tools/docs/…。クイックヒント:クイックヒープスナップショットを取り、リークしていると思われるタスクを実行し、新しいクイックヒープスナップショットを取りcomparison、下部のビューを選択します。2つのスナップショットの間に作成されたオブジェクトが明らかになります。
Johnride、2014年

1
これはおそらく最もクリーンなソリューションです。
Luca Steeb、2015

@Johnrideによって言及された比較は、上部のプルダウンメニューになりました。
frandroid

Shallow size{ a:"55c2067aee27593c03b7acbe", b:"55c2067aee27593c03b7acbe", c:null, d:undefined }{ c:null, d:undefined }オブジェクトの両方で40のようです。大丈夫ですか?
efkan 2017

1
ノードからもGoogle Chromeヒーププロファイラを使用できます。ノードv8以降がある場合は、それから開始しnode --inspect、Chrome about:inspectでURLバーに入力して、ノードインスペクタを開いているかどうかを確認します。ノードCLIでオブジェクトを作成し、ヒープのスナップショットを作成します。
グレゴール

74

これを書いて、同様の(問題のある)問題を解決しました。それはあなたが探しているものを正確に実行するわけではありません。つまり、インタプリタがオブジェクトを保存する方法を考慮していません。

しかし、V8を使用している場合は、素晴らしいプロトタイピングと非表示のクラスがほとんどのオーバーヘッドを吸収するため、かなり大まかな近似が得られます。

function roughSizeOfObject( object ) {

    var objectList = [];

    var recurse = function( value )
    {
        var bytes = 0;

        if ( typeof value === 'boolean' ) {
            bytes = 4;
        }
        else if ( typeof value === 'string' ) {
            bytes = value.length * 2;
        }
        else if ( typeof value === 'number' ) {
            bytes = 8;
        }
        else if
        (
            typeof value === 'object'
            && objectList.indexOf( value ) === -1
        )
        {
            objectList[ objectList.length ] = value;

            for( i in value ) {
                bytes+= 8; // an assumed existence overhead
                bytes+= recurse( value[i] )
            }
        }

        return bytes;
    }

    return recurse( object );
}

1
@梁梁正-無限ループの素晴らしい点、ありがとう。私がそれを少し再ギグして仕事の後で鉱山を更新してもよろしいですか(?)
thomas-peter

今夜はnode.jsを使用してベンチテストを行い、適切な係数をいくつか取得します。
トーマスピーター

'bytes + = recurse(value [i])'行は、FF 14.01でエラーをスローします:NS_ERROR_FAILURE:コンポーネントがエラーコードを返しました:0x80004005(NS_ERROR_FAILURE)[nsIDOMHTMLInputElement.selectionStart]。オブジェクトの1つで、別のオブジェクトを試しても動作しない、おそらくブラウザーのバグ、またはすべてのオブジェクトに対してコードが機能しない(機能しないオブジェクトには関数が含まれ、機能するオブジェクトは機能しない) t)
TrySpace

1
トムごとに、これはオブジェクトのウエストをトリミングする必要がある場所の大まかな指標として非常に役立ちました。それで、あなたの使者はJavaScriptとの関係について知りましたか?彼女は高いメンテナンスの愛人です。
トムWホール

4
私が気をつけなければならないのはPHP(一口)です。私はずっと前に彼女を愛するのをやめましたが、彼女は請求書を支払います。とにかく、トムに感謝します。このようなフィードバックは評判ポイントよりもはるかに優れています。
トーマスピーター

55

これを使用して、サーバーからクライアントに送信される可能性のある非常に大きなオブジェクトにフラグを設定する場合があります。メモリ内のフットプリントを表すものではありません。それはそれを送るか、それを保管するのにかかるおよその費用をあなたにちょうど与えます。

また、それは遅い、開発のみです。しかし、1行のコードで大まかな答えを得るには、それが役に立ちました。

roughObjSize = JSON.stringify(bigObject).length;

2
私のテストでは、このメソッドはlodashからの遅い_.isObject()呼び出しがないため、object-sizeofの場合よりもかなり高速です。さらに、返されるサイズは、大まかな見積もりとほぼ同等です。Gist gist.github.com/owenallenaz/ff77fc98081708146495
Nucleon


5
円形構造では使用できませんVM1409:1 Uncaught TypeError: Converting circular structure to JSON:(まだ便利ですが
givanse

これはバイト単位のバイナリサイズではありませんが、おおよそのサイズを取得するために使用するのは簡単です
datdinhquoc '20

これは、1)大まかな見積もりだけが必要な場合2)循環参照がないことを知っている場合3)大きな値を省略して、それらを個別に測定できる場合に非常に便利です。これらはすべて私の場合は当てはまり、完全に機能しました。長さを測定できる大きなストリングは1か所に1つしかありませんでした。
OZZIE

44

この問題に対するもう少しコンパクトな解決策を次に示します。

const typeSizes = {
  "undefined": () => 0,
  "boolean": () => 4,
  "number": () => 8,
  "string": item => 2 * item.length,
  "object": item => !item ? 0 : Object
    .keys(item)
    .reduce((total, key) => sizeOf(key) + sizeOf(item[key]) + total, 0)
};

const sizeOf = value => typeSizes[typeof value](value);

3
これはKBでのサイズですか?またはビット?
vincent thorpe、2017

2
@ vincent-thorpeバイト単位です。
Dan

2
素晴らしいスクリプトですが、循環参照の変更が必要です。
ジムペディッド

1
ノードプロセス内の膨大な数のデータでアルゴリズムをテストしたところ、13 GBと報告されていますが、ノードは22 GBを消費しています。メモリにはこれ以上何もありません。
JosuGoñi2018年

3
@JosuGoñi、彼らはオブジェクト自体がどれだけかかるか計算せず、その値のみを計算します。すべてのオブジェクトは、単なる値よりも多くのスペースを使用します。そうしないtypeof ...と機能しません。
Alexis Wilke、2018

42

オブジェクトsizeofを取得するNPMモジュールがあり、次のようにインストールできますnpm install object-sizeof

  var sizeof = require('object-sizeof');

  // 2B per character, 6 chars total => 12B
  console.log(sizeof({abc: 'def'}));

  // 8B for Number => 8B
  console.log(sizeof(12345));

  var param = { 
    'a': 1, 
    'b': 2, 
    'c': {
      'd': 4
    }
  };
  // 4 one two-bytes char strings and 3 eighth-bytes numbers => 32B
  console.log(sizeof(param));

sizeof(new Date())=== 0およびsizeof({})===0。それは意図されたものですか?
PhilippClaßen18年

1
@PhilippClaßen明らかにそうです。どちらのオブジェクトにもプロパティはありません。
ロバート

18

これはハックな方法ですが、異なる数値で2回試しましたが、一貫しているようです。

あなたができることは、あなたが望む種類の100万または200万のオブジェクトのような膨大な数のオブジェクトを試し、割り当てることです。オブジェクトを配列に入れて、ガベージコレクターがオブジェクトを解放しないようにします(これにより、配列が原因でメモリオーバーヘッドが少し増えることに注意してください。ただし、オブジェクトがメモリ内にあることを心配する場合は、問題にならないことを願っています、どこかに保存します)。割り当ての前後にアラートを追加し、各アラートでFirefoxプロセスが使用しているメモリ量を確認します。テストでページを開く前に、新しいFirefoxインスタンスがあることを確認してください。ページを開き、「before」アラートが表示された後のメモリ使用量を確認します。アラートを閉じ、メモリが割り当てられるのを待ちます。古いメモリから新しいメモリを差し引き、割り当て量で割ります。

function Marks()
{
  this.maxMarks = 100;
}

function Student()
{
  this.firstName = "firstName";
  this.lastName = "lastName";
  this.marks = new Marks();
}

var manyObjects = new Array();
alert('before');
for (var i=0; i<2000000; i++)
    manyObjects[i] = new Student();
alert('after');

私のコンピューターでこれを試してみたところ、「前」の警告が表示されたとき、プロセスには48352Kのメモリがありました。割り当て後、Firefoxのメモリは440236Kでした。200万の割り当ての場合、これはオブジェクトごとに約200バイトです。

100万の割り当てでもう一度試したところ、結果は同様でした。オブジェクトごとに196バイトです(2ミルの余分なデータが配列に使用されたと思います)。

だから、ここにあなたを助けるかもしれないハックな方法があります。JavaScriptには、理由のために「sizeof」メソッドが用意されていません。JavaScriptの実装はそれぞれ異なります。たとえばGoogle Chromeでは、同じページが各オブジェクトに約66バイトを使用します(少なくともタスクマネージャから判断すると)。


ちょっと..テクニックをありがとう。メモリ使用量を測定する直接的な方法がなかった場合に備えて、プランBとしてそれを行っていました。

4
CとC ++の実装もそれぞれ異なります。;)CまたはC ++のデータ型のサイズは実装固有です。JavaScriptがこのような演算子をサポートできなかった理由はわかりませんが、CまたはC ++(低レベルの言語であり、fixed-実行時の動的JavaScriptオブジェクトの可変サイズではなく、コンパイル時のデータ型のサイズ。
バンバム2009年

12

コメントできなかったので、tomwrongから作業を続行します。この拡張バージョンでは、オブジェクトが2回以上カウントされないため、無限ループは発生しません。さらに、オブジェクトのキーも大まかにカウントする必要があります。

function roughSizeOfObject( value, level ) {
    if(level == undefined) level = 0;
    var bytes = 0;

    if ( typeof value === 'boolean' ) {
        bytes = 4;
    }
    else if ( typeof value === 'string' ) {
        bytes = value.length * 2;
    }
    else if ( typeof value === 'number' ) {
        bytes = 8;
    }
    else if ( typeof value === 'object' ) {
        if(value['__visited__']) return 0;
        value['__visited__'] = 1;
        for( i in value ) {
            bytes += i.length * 2;
            bytes+= 8; // an assumed existence overhead
            bytes+= roughSizeOfObject( value[i], 1 )
        }
    }

    if(level == 0){
        clear__visited__(value);
    }
    return bytes;
}

function clear__visited__(value){
    if(typeof value == 'object'){
        delete value['__visited__'];
        for(var i in value){
            clear__visited__(value[i]);
        }
    }
}

roughSizeOfObject(a);

「__visited__」キーはカウントされますが、これはキーをカウントするため、より正確だと思います
Sam Hasler

チェックtypeof value === 'object'だけでは不十分で、値がの場合は例外が発生しますnull
フロリオン、2014年

これは、@ tomwrongのだまされた回答のどれと比較しても、私のオブジェクト(5 mbをはるかに超えると確信している)にとっては非常に高速でした。それもより正確でした(それは3mbかそこらについて言ったように)が、まだ現実から遠すぎる。それが数えていないかもしれないものについての手がかりはありますか?
cregox 2015年

うまくいきません。オブジェクトにlevelはデータが含まれていますが、roughSizeOfObject(level)ゼロを返します。(もちろん、変数のレベルを引数と混同しないでください。変数のシャドウイングによって問題が発生することはないと思います。また、スクリプトの「レベル」の名前を変更しても、同じ結果が得られます。)スクリーンショット:snipboard.io/G7E5yj.jpg
Luc

10

同じ問題がある。私はGoogleで検索しましたが、このソリューションをstackoverflowコミュニティと共有したいと思います。

重要

github https://gist.github.com/zensh/4975495でYan Qingが共有する機能を使用しました

function memorySizeOf(obj) {
    var bytes = 0;

    function sizeOf(obj) {
        if(obj !== null && obj !== undefined) {
            switch(typeof obj) {
            case 'number':
                bytes += 8;
                break;
            case 'string':
                bytes += obj.length * 2;
                break;
            case 'boolean':
                bytes += 4;
                break;
            case 'object':
                var objClass = Object.prototype.toString.call(obj).slice(8, -1);
                if(objClass === 'Object' || objClass === 'Array') {
                    for(var key in obj) {
                        if(!obj.hasOwnProperty(key)) continue;
                        sizeOf(obj[key]);
                    }
                } else bytes += obj.toString().length * 2;
                break;
            }
        }
        return bytes;
    };

    function formatByteSize(bytes) {
        if(bytes < 1024) return bytes + " bytes";
        else if(bytes < 1048576) return(bytes / 1024).toFixed(3) + " KiB";
        else if(bytes < 1073741824) return(bytes / 1048576).toFixed(3) + " MiB";
        else return(bytes / 1073741824).toFixed(3) + " GiB";
    };

    return formatByteSize(sizeOf(obj));
};


var sizeOfStudentObject = memorySizeOf({Student: {firstName: 'firstName', lastName: 'lastName', marks: 10}});
console.log(sizeOfStudentObject);

あなたはそれについてどう思いますか?


3
これは機能がありません。関数を追加しても、オブジェクトが大きく表示されません
Don Rhummy

キーをカウントしない
ebg11

7

私のメモリ削減の取り組みが実際にメモリの削減に役立つかどうかを知りたい

このコメントのフォローアップは次のとおりです。メモリの問題を生成する-これらのすべてのオブジェクトを作成するコードを記述し、問題が発生するまで(ブラウザーのクラッシュ、ブラウザーのフリーズ、またはOut-Of-)、上限を徐々に増やしますメモリエラー)。理想的には、異なるブラウザと異なるオペレーティングシステムでこの実験を繰り返す必要があります。

現在、2つのオプションがあります。オプション1-メモリの問題を生成できませんでした。したがって、あなたは何も心配していません。メモリの問題はなく、プログラムは正常です。

オプション2-メモリの問題が発生しました。ここで、問題が発生した制限が妥当であるかどうかを自問してください(つまり、この量のオブジェクトが通常のコードの使用時に作成される可能性が高いですか)。答えが「いいえ」の場合は、問題ありません。そうでなければ、コードで作成できるオブジェクトの数がわかります。この制限に違反しないようにアルゴリズムを作り直してください。


メモリの観点から、私の拡張機能は、Firefoxで開いている各ページ/タブにいくつかのオブジェクトを追加します。「数」はページのサイズに比例します。「パワー」ユーザーが15〜20のタブを開いていると仮定します。Webページに多くのコンテンツがある場合、ブラウザーは遅くなり、しばらくすると応答しなくなります。これは、私が明示的にアプリにストレスをかけようとしなくても起こります。オブジェクトの作成が大幅に減ると思うコードを書き直す予定です。私はそのことを確認したかっただけです。削減されたオブジェクトの数は、それだけの価値があるように何かに達しました

@Senthil:ただし、使用可能なメモリの量がわからない限り、オブジェクトサイズは意味を持ちません。メモリの量は謎のままである可​​能性が高いため、#objectsについて話すことは#bytesについて話すことと同じくらい役に立ちます
Maman


5

このJavaScriptライブラリsizeof.jsは同じことを行います。このように含める

<script type="text/javascript" src="sizeof.js"></script>

sizeof関数はオブジェクトをパラメーターとして取り、そのおおよそのサイズをバイト単位で返します。例えば:

// define an object
var object =
    {
      'boolean' : true,
      'number'  : 1,
      'string'  : 'a',
      'array'   : [1, 2, 3]
    };

// determine the size of the object
var size = sizeof(object);

sizeof関数は、他のオブジェクトへの複数の参照と再帰的な参照を含むオブジェクトを処理できます。

もともとここに公開


これは、私の使用例では、@ liangliangよりも遅く、「精度が低い」ようです。
cregox 2015年


2

このためのコードに取り組んでいるすべての人に感謝します!

まったく同じものを探していたということを追加したかっただけですが、私の場合は、処理されたオブジェクトのキャッシュを管理して、キャッシュされているかどうかに関係なく、ajax呼び出しからオブジェクトを再解析して処理する必要がないようにしますブラウザで。これは、多くの処理を必要とするオブジェクト(通常はJSON形式ではないもの)に特に役立ちますが、大規模なプロジェクトまたは長時間実行されているアプリ/拡張機能にこれらをキャッシュしておくと、非常にコストがかかる可能性があります。時間。

とにかく、私はそれを次のようなものに使用します:

var myCache = {
    cache: {},
    order: [],
    size: 0,
    maxSize: 2 * 1024 * 1024, // 2mb

    add: function(key, object) {
        // Otherwise add new object
        var size = this.getObjectSize(object);
        if (size > this.maxSize) return; // Can't store this object

        var total = this.size + size;

        // Check for existing entry, as replacing it will free up space
        if (typeof(this.cache[key]) !== 'undefined') {
            for (var i = 0; i < this.order.length; ++i) {
                var entry = this.order[i];
                if (entry.key === key) {
                    total -= entry.size;
                    this.order.splice(i, 1);
                    break;
                }
            }
        }

        while (total > this.maxSize) {
            var entry = this.order.shift();
            delete this.cache[entry.key];
            total -= entry.size;
        }

        this.cache[key] = object;
        this.order.push({ size: size, key: key });
        this.size = total;
    },

    get: function(key) {
        var value = this.cache[key];
        if (typeof(value) !== 'undefined') { // Return this key for longer
            for (var i = 0; i < this.order.length; ++i) {
                var entry = this.order[i];
                if (entry.key === key) {
                    this.order.splice(i, 1);
                    this.order.push(entry);
                    break;
                }
            }
        }
        return value;
    },

    getObjectSize: function(object) {
        // Code from above estimating functions
    },
};

これは単純な例であり、いくつかのエラーが発生する可能性がありますが、ある程度のインテリジェンスで静的オブジェクト(コンテンツは変更されません)を保持するために使用できるため、これはアイデアを提供します。これにより、オブジェクトを最初に作成する必要があった高価な処理要件を大幅に削減できます。


1
function sizeOf(parent_data, size)
{
    for (var prop in parent_data)
    {
        let value = parent_data[prop];

        if (typeof value === 'boolean')
        {
            size += 4;
        }
        else if (typeof value === 'string')
        {
            size += value.length * 2;
        }
        else if (typeof value === 'number')
        {
             size += 8;
        }
        else
        {      
            let oldSize = size;
            size += sizeOf(value, oldSize) - oldSize;
        }
    }

    return size;
}


function roughSizeOfObject(object)
{   
    let size = 0;
    for each (let prop in object)
    {    
        size += sizeOf(prop, 0);
    } // for..
    return size;
}

1

私はChrome開発ツールの[タイムライン]タブを使用して、ますます大量のオブジェクトをインスタンス化し、そのような適切な見積もりを取得しています。以下のようなhtmlをボイラープレートとして使用して、オブジェクトの特性(プロパティの数やタイプなど)をよりよくシミュレートするように変更できます。実行の前後に、[開発ツール]タブの下部にあるごみ箱アイコンをクリックすることをお勧めします。

<html>
<script>
var size = 1000*100
window.onload = function() {
  document.getElementById("quantifier").value = size
}

function scaffold()
{
  console.log("processing Scaffold...");
  a = new Array
}

function start()
{
  size = document.getElementById("quantifier").value
  console.log("Starting... quantifier is " + size);
  console.log("starting test")
  for (i=0; i<size; i++){
    a[i]={"some" : "thing"}
  }
  console.log("done...")
}

function tearDown()
{
  console.log("processing teardown");
  a.length=0
}

</script>
<body>
    <span style="color:green;">Quantifier:</span>
    <input id="quantifier" style="color:green;" type="text"></input>
    <button onclick="scaffold()">Scaffold</button>
    <button onclick="start()">Start</button>
    <button onclick="tearDown()">Clean</button>
    <br/>
</body>
</html>

(上記のこのコードのように)プロパティが1つだけの200万のオブジェクトをインスタンス化すると、私のChromiumでは、オブジェクトごとに50バイトの概算になります。オブジェクトごとにランダムな文字列を作成するようにコードを変更すると、オブジェクトごとに約30バイトが追加されます。これが役に立てば幸いです。



-3

「配列」を含めるのを忘れたと思います。

  typeOf : function(value) {
        var s = typeof value;
        if (s === 'object')
        {
            if (value)
            {
                if (typeof value.length === 'number' && !(value.propertyIsEnumerable('length')) && typeof value.splice === 'function')
                {
                    s = 'array';
                }
            }
            else
            {
                s = 'null';
            }
        }
        return s;
    },

   estimateSizeOfObject: function(value, level)
    {
        if(undefined === level)
            level = 0;

        var bytes = 0;

        if ('boolean' === typeOf(value))
            bytes = 4;
        else if ('string' === typeOf(value))
            bytes = value.length * 2;
        else if ('number' === typeOf(value))
            bytes = 8;
        else if ('object' === typeOf(value) || 'array' === typeOf(value))
        {
            for(var i in value)
            {
                bytes += i.length * 2;
                bytes+= 8; // an assumed existence overhead
                bytes+= estimateSizeOfObject(value[i], 1)
            }
        }
        return bytes;
    },

   formatByteSize : function(bytes)
    {
        if (bytes < 1024)
            return bytes + " bytes";
        else
        {
            var floatNum = bytes/1024;
            return floatNum.toFixed(2) + " kb";
        }
    },

1
JSでは、配列はオブジェクトです。実装にはいくつかの最適化があるかもしれませんが、概念的には配列とオブジェクトは同じです。
クリスウォーカー、

-8

知ってる、これは絶対にそれを行うには正しい方法ではありません、まだit'veは約オブジェクト・ファイルのサイズを取得するには、過去に私に数回を助けました:

オブジェクトまたは応答をコンソールまたは新しいタブに書き込み、結果を新しいメモ帳ファイルにコピーして保存し、ファイルサイズを確認します。メモ帳ファイル自体は数バイトなので、かなり正確なオブジェクトファイルサイズが得られます。


4
これは完全に間違っています。たとえば、数値1/3 = 0.3333333333333333を考えます。それはあなたのアプローチを使用して18バイトになります。
korCZis 2016年

2
おおよそだと言った。1MBと1.00001MBのどちらでもかまいませんが、見積もりを知りたいだけの場合は、この方法で十分です。
Jeffrey Roosendaal 2016年

生意気な解決策X]
Lapys
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.