Saya ingin tahu ukuran yang ditempati oleh objek JavaScript.
Ambil fungsi berikut:
function Marks(){
this.maxMarks = 100;
}
function Student(){
this.firstName = "firstName";
this.lastName = "lastName";
this.marks = new Marks();
}
Sekarang saya instantiate student
:
var stud = new Student();
sehingga saya bisa melakukan hal-hal seperti
stud.firstName = "new Firstname";
alert(stud.firstName);
stud.marks.maxMarks = 200;
dll.
Sekarang, stud
objek akan menempati beberapa ukuran dalam memori. Ini memiliki beberapa data dan lebih banyak objek.
Bagaimana cara mengetahui berapa banyak memori yang stud
ditempati objek? Sesuatu seperti sizeof()
di JavaScript? Akan sangat luar biasa jika saya bisa mengetahuinya dalam satu panggilan fungsi saja sizeof(stud)
.
Saya telah mencari di Internet selama berbulan-bulan - tidak dapat menemukannya (diminta di beberapa forum - tidak ada balasan).
javascript
memory
object
sizeof
pengguna4642212
sumber
sumber
Jawaban:
Saya telah memfaktorkan ulang kode dalam jawaban asli saya . Saya telah menghapus rekursi dan menghapus keberadaan yang ada di atas.
sumber
"よんもじ".length
adalah 4 dalam Javascript, tetapi apakah Anda yakin itu 8 byte, karena kode Anda mengembalikannya?var a={n:1}; var b={a:function(){return a}}; roughSizeOfObject(b)
- di sinib
memiliki referensia
, tetapiroughSizeOfObject()
kembali0
.Google Chrome Heap Profiler memungkinkan Anda memeriksa penggunaan memori objek.
Anda harus dapat menemukan objek dalam jejak yang bisa rumit. Jika Anda menyematkan objek ke Window global, cukup mudah untuk menemukan dari mode listing "Containment".
Pada tangkapan layar terlampir, saya membuat objek yang disebut "testObj" di jendela. Saya kemudian terletak di profiler (setelah membuat rekaman) dan itu menunjukkan ukuran penuh objek dan semua yang ada di bawah "ukuran dipertahankan".
Rincian lebih lanjut tentang kerusakan memori .
Pada tangkapan layar di atas, objek menunjukkan ukuran tetap 60. Saya percaya unit ini byte di sini.
sumber
comparison
tampilan di bagian bawah. Itu memperjelas objek apa yang dibuat antara kedua snapshot.Shallow size
tampaknya 40 untuk keduanya{ a:"55c2067aee27593c03b7acbe", b:"55c2067aee27593c03b7acbe", c:null, d:undefined }
dan{ c:null, d:undefined }
objek. Apakah itu oke?node --inspect
dan di Chrome masukkanabout:inspect
di bilah URL dan cari untuk membuka pengawas Node. Buat objek Anda di node CLI dan kemudian ambil snapshot tumpukan.Saya baru saja menulis ini untuk memecahkan masalah yang serupa. Itu tidak persis melakukan apa yang Anda cari, yaitu tidak memperhitungkan bagaimana penerjemah menyimpan objek.
Tapi, jika Anda menggunakan V8, itu akan memberi Anda perkiraan yang cukup ok karena prototipe yang mengagumkan dan kelas tersembunyi menjilat sebagian besar overhead.
sumber
Kadang-kadang saya menggunakan ini untuk menandai objek yang sangat besar yang mungkin pergi ke klien dari server. Itu tidak mewakili jejak memori. Itu hanya memberi Anda kira-kira berapa biaya untuk mengirimnya, atau menyimpannya.
Juga perhatikan, lambat, hanya dev. Tetapi untuk mendapatkan jawaban kasar dengan satu baris kode itu bermanfaat bagi saya.
sumber
VM1409:1 Uncaught TypeError: Converting circular structure to JSON
:( masih bergunaInilah solusi yang sedikit lebih ringkas untuk masalah ini:
sumber
typeof ...
tidak , tidak akan berhasil.Ada modul NPM untuk mendapatkan ukuran objek , Anda dapat menginstalnya
npm install object-sizeof
sumber
Ini adalah metode hacky, tetapi saya mencobanya dua kali dengan angka yang berbeda dan tampaknya konsisten.
Yang dapat Anda lakukan adalah mencoba dan mengalokasikan sejumlah besar objek, seperti satu atau dua juta objek dari jenis yang Anda inginkan. Letakkan objek dalam array untuk mencegah pengumpul sampah melepaskannya (perhatikan bahwa ini akan menambah sedikit overhead memori karena array, tetapi saya harap ini tidak masalah dan selain itu jika Anda akan khawatir tentang objek yang ada di memori , Anda menyimpannya di suatu tempat). Tambahkan lansiran sebelum dan sesudah alokasi dan di setiap lansiran periksa berapa banyak memori yang diambil oleh proses Firefox. Sebelum Anda membuka halaman dengan tes, pastikan Anda memiliki contoh Firefox baru. Buka halaman, catat penggunaan memori setelah peringatan "sebelum" ditampilkan. Tutup peringatan, tunggu memori dialokasikan. Kurangi memori baru dari yang lebih lama dan bagi dengan jumlah alokasi.
Saya mencoba ini di komputer saya dan proses memiliki memori 48352K ketika peringatan "sebelum" ditampilkan. Setelah alokasi, Firefox memiliki memori 440236K. Untuk alokasi 2 juta, ini adalah sekitar 200 byte untuk setiap objek.
Saya mencobanya lagi dengan alokasi 1 juta dan hasilnya serupa: 196 byte per objek (saya kira data tambahan dalam 2mill digunakan untuk Array).
Jadi, inilah metode hacky yang mungkin bisa membantu Anda. JavaScript tidak menyediakan metode "sizeof" karena suatu alasan: setiap implementasi JavaScript berbeda. Di Google Chrome misalnya, halaman yang sama menggunakan sekitar 66 byte untuk setiap objek (setidaknya dilihat dari task manager).
sumber
Maaf saya tidak bisa berkomentar, jadi saya hanya melanjutkan pekerjaan dari tomwrong. Versi yang disempurnakan ini tidak akan menghitung objek lebih dari sekali, sehingga tidak ada loop tanpa batas. Plus, saya rasa kunci dari suatu objek juga harus dihitung, kira-kira.
sumber
typeof value === 'object'
tidak cukup dan Anda akan memiliki pengecualian jika nilainyanull
.level
berisi data tetapiroughSizeOfObject(level)
mengembalikan nol. (Level variabel saya tidak harus bingung dengan argumen Anda, tentu saja. Saya tidak berpikir bahwa variabel shadowing dapat menyebabkan masalah di sini, dan juga ketika saya mengganti nama 'level' dalam skrip Anda, saya mendapatkan hasil yang sama.) Screenshot : snipboard.io/G7E5yj.jpgMemiliki masalah yang sama. Saya mencari di Google dan saya ingin berbagi dengan komunitas stackoverflow solusi ini.
Penting :
Apa yang Anda pikirkan?
sumber
Menindaklanjuti komentar ini, inilah yang harus Anda lakukan: Cobalah untuk menghasilkan masalah memori - Tulis kode yang membuat semua objek ini dan secara besar meningkatkan batas atas hingga Anda mengalami masalah (Peramban peramban, Pembekuan peramban, atau Di luar- kesalahan memori). Idealnya Anda harus mengulang percobaan ini dengan browser yang berbeda dan sistem operasi yang berbeda.
Sekarang ada dua opsi: opsi 1 - Anda tidak berhasil menghasilkan masalah memori. Karenanya, Anda tidak perlu khawatir. Anda tidak memiliki masalah memori dan program Anda baik-baik saja.
opsi 2- Anda memang mendapatkan masalah memori. Sekarang tanyakan pada diri Anda apakah batas di mana masalah terjadi masuk akal (dengan kata lain: apakah mungkin jumlah objek ini akan dibuat pada penggunaan normal kode Anda). Jika jawabannya 'Tidak' maka Anda baik-baik saja. Kalau tidak, Anda sekarang tahu berapa banyak objek yang dapat dibuat oleh kode Anda. Mengolah algoritma sedemikian rupa sehingga tidak melanggar batas ini.
sumber
Jika masalah utama Anda adalah penggunaan memori ekstensi Firefox Anda, saya sarankan untuk memeriksa dengan pengembang Mozilla.
Mozilla memberikan daftar alat untuk menganalisis kebocoran memori pada wiki-nya .
sumber
Pustaka Javascript ini
sizeof.js
melakukan hal yang sama. Sertakan seperti iniFungsi sizeof mengambil objek sebagai parameter dan mengembalikan ukuran perkiraannya dalam byte. Sebagai contoh:
Fungsi sizeof dapat menangani objek yang berisi banyak referensi ke objek lain dan referensi rekursif.
Awalnya diterbitkan di sini .
sumber
Alat pengembang Chrome memiliki fungsi ini. Saya menemukan artikel ini sangat membantu dan melakukan persis seperti yang Anda inginkan: https://developers.google.com/chrome-developer-tools/docs/heap-profiling
sumber
Terima kasih banyak kepada semua orang yang telah mengerjakan kode untuk ini!
Saya hanya ingin menambahkan bahwa saya telah mencari hal yang persis sama, tetapi dalam kasus saya ini adalah untuk mengelola cache objek yang diproses untuk menghindari keharusan mem-parsing dan memproses objek dari panggilan ajax yang mungkin atau mungkin belum di-cache oleh browser. Ini sangat berguna untuk objek yang membutuhkan banyak pemrosesan, biasanya segala sesuatu yang tidak dalam format JSON, tetapi bisa sangat mahal untuk menyimpan hal-hal ini dalam cache dalam proyek besar atau aplikasi / ekstensi yang dibiarkan berjalan untuk waktu yang lama waktu.
Bagaimanapun, saya menggunakannya untuk sesuatu seperti:
Ini adalah contoh sederhana dan mungkin memiliki beberapa kesalahan, tetapi memberikan ide, karena Anda dapat menggunakannya untuk memegang objek statis (konten tidak akan berubah) dengan tingkat kecerdasan tertentu. Hal ini dapat secara signifikan mengurangi persyaratan pemrosesan yang mahal yang harus dilakukan oleh objek.
sumber
sumber
Saya menggunakan tab Timeline alat dev Chrome , instantiate objek dalam jumlah yang semakin besar, dan mendapatkan perkiraan yang baik seperti itu. Anda dapat menggunakan html seperti ini di bawah ini, sebagai boilerplate, dan memodifikasinya untuk lebih mensimulasikan karakteristik objek Anda (jumlah dan jenis properti, dll ...). Anda mungkin ingin mengeklik ikon bit sampah di bagian bawah tab alat dev, sebelum dan sesudah menjalankan.
Instantiasi 2 juta objek masing-masing hanya satu properti (seperti dalam kode ini di atas) mengarah ke perhitungan kasar 50 byte per objek, pada Chromium saya, sekarang. Mengubah kode untuk membuat string acak per objek menambahkan sekitar 30 byte per objek, dll. Semoga ini bisa membantu.
sumber
Jika Anda perlu secara sistematis memeriksa aprox. ukuran objek Anda juga dapat memeriksa perpustakaan ini http://code.stephenmorley.org/javascript/finding-the-memory-usage-of-objects/ yang saya dapat gunakan untuk ukuran objek.
Kalau tidak, saya sarankan untuk menggunakan Profiler Chrome / Firefox Heap.
sumber
Saya yakin Anda lupa memasukkan 'array'.
sumber
Saya tahu ini sama sekali bukan cara yang tepat untuk melakukannya, namun ini telah membantu saya beberapa kali di masa lalu untuk mendapatkan ukuran file objek kira-kira:
Tulis objek / respons Anda ke konsol atau tab baru, salin hasilnya ke file notepad baru, simpan, dan periksa ukuran file. File notepad itu sendiri hanya beberapa byte, sehingga Anda akan mendapatkan ukuran file objek yang cukup akurat.
sumber