From b70aba6bae2635e03f2d31d5a79e85312cbffb64 Mon Sep 17 00:00:00 2001 From: HasanAlrimawi <141642411+HasanAlrimawi@users.noreply.github.com> Date: Thu, 23 Jan 2025 18:55:50 +0200 Subject: [PATCH] feat(compile): show remote modules and metadata size when compiling (#27415) Co-authored-by: David Sherret --- cli/standalone/binary.rs | 43 +++++++++++++++++-- cli/standalone/virtual_fs.rs | 6 +-- .../case_insensitive_building/compile.out | 4 +- .../compile/env_vars_support/compile.out | 4 +- .../compile.out | 4 +- .../compile/include/symlink_twice/compile.out | 4 +- tests/specs/compile/npm_fs/compile.out | 4 +- .../main_compile_folder.out | 4 +- 8 files changed, 59 insertions(+), 14 deletions(-) diff --git a/cli/standalone/binary.rs b/cli/standalone/binary.rs index 4cb30316c1..59744a0c72 100644 --- a/cli/standalone/binary.rs +++ b/cli/standalone/binary.rs @@ -1,6 +1,7 @@ // Copyright 2018-2025 the Deno authors. MIT license. use std::borrow::Cow; +use std::cell::Cell; use std::collections::HashMap; use std::collections::VecDeque; use std::env; @@ -699,7 +700,7 @@ impl<'a> DenoCompileBinaryWriter<'a> { vfs_case_sensitivity: vfs.case_sensitivity, }; - let data_section_bytes = serialize_binary_data_section( + let (data_section_bytes, section_sizes) = serialize_binary_data_section( &metadata, npm_snapshot.map(|s| s.into_serialized()), &specifier_store.for_serialization(&root_dir_url), @@ -709,6 +710,22 @@ impl<'a> DenoCompileBinaryWriter<'a> { ) .context("Serializing binary data section.")?; + log::info!( + "\n{} {}", + crate::colors::bold("Files:"), + crate::util::display::human_size(section_sizes.vfs as f64) + ); + log::info!( + "{} {}", + crate::colors::bold("Metadata:"), + crate::util::display::human_size(section_sizes.metadata as f64) + ); + log::info!( + "{} {}\n", + crate::colors::bold("Remote modules:"), + crate::util::display::human_size(section_sizes.remote_modules as f64) + ); + write_binary_bytes(writer, original_bin, data_section_bytes, compile_flags) .context("Writing binary bytes") } @@ -912,6 +929,12 @@ fn write_binary_bytes( Ok(()) } +struct BinaryDataSectionSizes { + metadata: usize, + remote_modules: usize, + vfs: usize, +} + /// Binary format: /// * d3n0l4nd /// * @@ -930,12 +953,16 @@ fn serialize_binary_data_section( redirects: &SpecifierDataStore, remote_modules: &SpecifierDataStore>, vfs: &BuiltVfs, -) -> Result, AnyError> { +) -> Result<(Vec, BinaryDataSectionSizes), AnyError> { let metadata = serde_json::to_string(metadata)?; let npm_snapshot = npm_snapshot.map(serialize_npm_snapshot).unwrap_or_default(); let serialized_vfs = serde_json::to_string(&vfs.entries)?; + let remote_modules_len = Cell::new(0); + let metadata_len = Cell::new(0); + let vfs_len = Cell::new(0); + let bytes = capacity_builder::BytesBuilder::build(|builder| { builder.append(MAGIC_BYTES); // 1. Metadata @@ -948,12 +975,14 @@ fn serialize_binary_data_section( builder.append_le(npm_snapshot.len() as u64); builder.append(&npm_snapshot); } + metadata_len.set(builder.len()); // 3. Specifiers builder.append(specifiers); // 4. Redirects redirects.serialize(builder); // 5. Remote modules remote_modules.serialize(builder); + remote_modules_len.set(builder.len() - metadata_len.get()); // 6. VFS { builder.append_le(serialized_vfs.len() as u64); @@ -964,13 +993,21 @@ fn serialize_binary_data_section( builder.append(file); } } + vfs_len.set(builder.len() - remote_modules_len.get()); // write the magic bytes at the end so we can use it // to make sure we've deserialized correctly builder.append(MAGIC_BYTES); })?; - Ok(bytes) + Ok(( + bytes, + BinaryDataSectionSizes { + metadata: metadata_len.get(), + remote_modules: remote_modules_len.get(), + vfs: vfs_len.get(), + }, + )) } fn serialize_npm_snapshot( diff --git a/cli/standalone/virtual_fs.rs b/cli/standalone/virtual_fs.rs index fa79b784dc..a3e023620f 100644 --- a/cli/standalone/virtual_fs.rs +++ b/cli/standalone/virtual_fs.rs @@ -30,11 +30,7 @@ pub fn output_vfs(vfs: &BuiltVfs, executable_name: &str) { let display_tree = vfs_as_display_tree(vfs, executable_name); display_tree.print(&mut text).unwrap(); // unwrap ok because it's writing to a string log::info!("\n{}\n", deno_terminal::colors::bold("Embedded Files")); - log::info!("{}\n", text.trim()); - log::info!( - "Size: {}\n", - human_size(vfs.files.iter().map(|f| f.len() as f64).sum()) - ); + log::info!("{}", text.trim()); } fn vfs_as_display_tree( diff --git a/tests/specs/compile/case_insensitive_building/compile.out b/tests/specs/compile/case_insensitive_building/compile.out index 895c2f1d46..2f63dabf70 100644 --- a/tests/specs/compile/case_insensitive_building/compile.out +++ b/tests/specs/compile/case_insensitive_building/compile.out @@ -6,5 +6,7 @@ main[WILDLINE] ├── file.txt ([WILDLINE]) └── main.js ([WILDLINE]) -Size: [WILDLINE] +Files: [WILDLINE] +Metadata: [WILDLINE] +Remote modules: [WILDLINE] diff --git a/tests/specs/compile/env_vars_support/compile.out b/tests/specs/compile/env_vars_support/compile.out index cba114b1f7..c8646d49c0 100644 --- a/tests/specs/compile/env_vars_support/compile.out +++ b/tests/specs/compile/env_vars_support/compile.out @@ -8,5 +8,7 @@ Embedded Files out[WILDLINE] └── main.ts ([WILDLINE]) -Size: [WILDLINE] +Files: [WILDLINE] +Metadata: [WILDLINE] +Remote modules: [WILDLINE] diff --git a/tests/specs/compile/global_npm_cache_implicit_read_permission/compile.out b/tests/specs/compile/global_npm_cache_implicit_read_permission/compile.out index fa1dd2bf9f..0bbc1ab3af 100644 --- a/tests/specs/compile/global_npm_cache_implicit_read_permission/compile.out +++ b/tests/specs/compile/global_npm_cache_implicit_read_permission/compile.out @@ -45,5 +45,7 @@ main[WILDLINE] │ └── yargs-parser/18.1.3/* ([WILDLINE]) └── main.ts ([WILDLINE]) -Size: [WILDLINE] +Files: [WILDLINE] +Metadata: [WILDLINE] +Remote modules: [WILDLINE] diff --git a/tests/specs/compile/include/symlink_twice/compile.out b/tests/specs/compile/include/symlink_twice/compile.out index 6ae93bf1cb..a862d5d326 100644 --- a/tests/specs/compile/include/symlink_twice/compile.out +++ b/tests/specs/compile/include/symlink_twice/compile.out @@ -7,5 +7,7 @@ main[WILDLINE] ├── link.js --> index.js └── setup.js ([WILDLINE]) -Size: [WILDLINE] +Files: [WILDLINE] +Metadata: [WILDLINE] +Remote modules: [WILDLINE] diff --git a/tests/specs/compile/npm_fs/compile.out b/tests/specs/compile/npm_fs/compile.out index c2ecef4015..71067090a6 100644 --- a/tests/specs/compile/npm_fs/compile.out +++ b/tests/specs/compile/npm_fs/compile.out @@ -6,5 +6,7 @@ main[WILDLINE] ├── main.ts ([WILDLINE]) └── node_modules/* ([WILDLINE]) -Size: [WILDLINE] +Files: [WILDLINE] +Metadata: [WILDLINE] +Remote modules: [WILDLINE] diff --git a/tests/testdata/compile/node_modules_symlink_outside/main_compile_folder.out b/tests/testdata/compile/node_modules_symlink_outside/main_compile_folder.out index 538aaa414c..b6083bdd6d 100644 --- a/tests/testdata/compile/node_modules_symlink_outside/main_compile_folder.out +++ b/tests/testdata/compile/node_modules_symlink_outside/main_compile_folder.out @@ -13,5 +13,7 @@ bin[WILDLINE] │ └── node_modules/* ([WILDLINE]) └── some_folder/* ([WILDLINE]) -Size: [WILDLINE] +Files: [WILDLINE] +Metadata: [WILDLINE] +Remote modules: [WILDLINE]