From ed0752c8e5bafc88b2050035a8eeb71b3abf1640 Mon Sep 17 00:00:00 2001 From: Andrew Morris Date: Fri, 31 Mar 2023 16:34:20 +1100 Subject: [PATCH] Add measure_bytecode_size --- Cargo.lock | 7 + Cargo.toml | 1 + inputs/passing/projEuler/p13.ts | 206 +++++++++++++++--------------- measure_bytecode_size/Cargo.toml | 9 ++ measure_bytecode_size/src/main.rs | 104 +++++++++++++++ 5 files changed, 224 insertions(+), 103 deletions(-) create mode 100644 measure_bytecode_size/Cargo.toml create mode 100644 measure_bytecode_size/src/main.rs diff --git a/Cargo.lock b/Cargo.lock index 29a3818..498823b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -665,6 +665,13 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" +[[package]] +name = "measure_bytecode_size" +version = "0.1.0" +dependencies = [ + "valuescript_compiler", +] + [[package]] name = "memchr" version = "2.4.1" diff --git a/Cargo.toml b/Cargo.toml index 2e6faeb..bc2ab15 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,4 +8,5 @@ members = [ "valuescript_wasm", "vstc", "swc_demo", + "measure_bytecode_size", ] diff --git a/inputs/passing/projEuler/p13.ts b/inputs/passing/projEuler/p13.ts index 0e8da02..d25915e 100644 --- a/inputs/passing/projEuler/p13.ts +++ b/inputs/passing/projEuler/p13.ts @@ -2,112 +2,112 @@ export default function main() { const numStrs = [ - '37107287533902102798797998220837590246510135740250', - '46376937677490009712648124896970078050417018260538', - '74324986199524741059474233309513058123726617309629', - '91942213363574161572522430563301811072406154908250', - '23067588207539346171171980310421047513778063246676', - '89261670696623633820136378418383684178734361726757', - '28112879812849979408065481931592621691275889832738', - '44274228917432520321923589422876796487670272189318', - '47451445736001306439091167216856844588711603153276', - '70386486105843025439939619828917593665686757934951', - '62176457141856560629502157223196586755079324193331', - '64906352462741904929101432445813822663347944758178', - '92575867718337217661963751590579239728245598838407', - '58203565325359399008402633568948830189458628227828', - '80181199384826282014278194139940567587151170094390', - '35398664372827112653829987240784473053190104293586', - '86515506006295864861532075273371959191420517255829', - '71693888707715466499115593487603532921714970056938', - '54370070576826684624621495650076471787294438377604', - '53282654108756828443191190634694037855217779295145', - '36123272525000296071075082563815656710885258350721', - '45876576172410976447339110607218265236877223636045', - '17423706905851860660448207621209813287860733969412', - '81142660418086830619328460811191061556940512689692', - '51934325451728388641918047049293215058642563049483', - '62467221648435076201727918039944693004732956340691', - '15732444386908125794514089057706229429197107928209', - '55037687525678773091862540744969844508330393682126', - '18336384825330154686196124348767681297534375946515', - '80386287592878490201521685554828717201219257766954', - '78182833757993103614740356856449095527097864797581', - '16726320100436897842553539920931837441497806860984', - '48403098129077791799088218795327364475675590848030', - '87086987551392711854517078544161852424320693150332', - '59959406895756536782107074926966537676326235447210', - '69793950679652694742597709739166693763042633987085', - '41052684708299085211399427365734116182760315001271', - '65378607361501080857009149939512557028198746004375', - '35829035317434717326932123578154982629742552737307', - '94953759765105305946966067683156574377167401875275', - '88902802571733229619176668713819931811048770190271', - '25267680276078003013678680992525463401061632866526', - '36270218540497705585629946580636237993140746255962', - '24074486908231174977792365466257246923322810917141', - '91430288197103288597806669760892938638285025333403', - '34413065578016127815921815005561868836468420090470', - '23053081172816430487623791969842487255036638784583', - '11487696932154902810424020138335124462181441773470', - '63783299490636259666498587618221225225512486764533', - '67720186971698544312419572409913959008952310058822', - '95548255300263520781532296796249481641953868218774', - '76085327132285723110424803456124867697064507995236', - '37774242535411291684276865538926205024910326572967', - '23701913275725675285653248258265463092207058596522', - '29798860272258331913126375147341994889534765745501', - '18495701454879288984856827726077713721403798879715', - '38298203783031473527721580348144513491373226651381', - '34829543829199918180278916522431027392251122869539', - '40957953066405232632538044100059654939159879593635', - '29746152185502371307642255121183693803580388584903', - '41698116222072977186158236678424689157993532961922', - '62467957194401269043877107275048102390895523597457', - '23189706772547915061505504953922979530901129967519', - '86188088225875314529584099251203829009407770775672', - '11306739708304724483816533873502340845647058077308', - '82959174767140363198008187129011875491310547126581', - '97623331044818386269515456334926366572897563400500', - '42846280183517070527831839425882145521227251250327', - '55121603546981200581762165212827652751691296897789', - '32238195734329339946437501907836945765883352399886', - '75506164965184775180738168837861091527357929701337', - '62177842752192623401942399639168044983993173312731', - '32924185707147349566916674687634660915035914677504', - '99518671430235219628894890102423325116913619626622', - '73267460800591547471830798392868535206946944540724', - '76841822524674417161514036427982273348055556214818', - '97142617910342598647204516893989422179826088076852', - '87783646182799346313767754307809363333018982642090', - '10848802521674670883215120185883543223812876952786', - '71329612474782464538636993009049310363619763878039', - '62184073572399794223406235393808339651327408011116', - '66627891981488087797941876876144230030984490851411', - '60661826293682836764744779239180335110989069790714', - '85786944089552990653640447425576083659976645795096', - '66024396409905389607120198219976047599490197230297', - '64913982680032973156037120041377903785566085089252', - '16730939319872750275468906903707539413042652315011', - '94809377245048795150954100921645863754710598436791', - '78639167021187492431995700641917969777599028300699', - '15368713711936614952811305876380278410754449733078', - '40789923115535562561142322423255033685442488917353', - '44889911501440648020369068063960672322193204149535', - '41503128880339536053299340368006977710650566631954', - '81234880673210146739058568557934581403627822703280', - '82616570773948327592232845941706525094512325230608', - '22918802058777319719839450180888072429661980811197', - '77158542502016545090413245809786882778948721859617', - '72107838435069186155435662884062257473692284509516', - '20849603980134001723930671666823555245252804609722', - '53503534226472524250874054075591789781264330331690', + "37107287533902102798797998220837590246510135740250", + "46376937677490009712648124896970078050417018260538", + "74324986199524741059474233309513058123726617309629", + "91942213363574161572522430563301811072406154908250", + "23067588207539346171171980310421047513778063246676", + "89261670696623633820136378418383684178734361726757", + "28112879812849979408065481931592621691275889832738", + "44274228917432520321923589422876796487670272189318", + "47451445736001306439091167216856844588711603153276", + "70386486105843025439939619828917593665686757934951", + "62176457141856560629502157223196586755079324193331", + "64906352462741904929101432445813822663347944758178", + "92575867718337217661963751590579239728245598838407", + "58203565325359399008402633568948830189458628227828", + "80181199384826282014278194139940567587151170094390", + "35398664372827112653829987240784473053190104293586", + "86515506006295864861532075273371959191420517255829", + "71693888707715466499115593487603532921714970056938", + "54370070576826684624621495650076471787294438377604", + "53282654108756828443191190634694037855217779295145", + "36123272525000296071075082563815656710885258350721", + "45876576172410976447339110607218265236877223636045", + "17423706905851860660448207621209813287860733969412", + "81142660418086830619328460811191061556940512689692", + "51934325451728388641918047049293215058642563049483", + "62467221648435076201727918039944693004732956340691", + "15732444386908125794514089057706229429197107928209", + "55037687525678773091862540744969844508330393682126", + "18336384825330154686196124348767681297534375946515", + "80386287592878490201521685554828717201219257766954", + "78182833757993103614740356856449095527097864797581", + "16726320100436897842553539920931837441497806860984", + "48403098129077791799088218795327364475675590848030", + "87086987551392711854517078544161852424320693150332", + "59959406895756536782107074926966537676326235447210", + "69793950679652694742597709739166693763042633987085", + "41052684708299085211399427365734116182760315001271", + "65378607361501080857009149939512557028198746004375", + "35829035317434717326932123578154982629742552737307", + "94953759765105305946966067683156574377167401875275", + "88902802571733229619176668713819931811048770190271", + "25267680276078003013678680992525463401061632866526", + "36270218540497705585629946580636237993140746255962", + "24074486908231174977792365466257246923322810917141", + "91430288197103288597806669760892938638285025333403", + "34413065578016127815921815005561868836468420090470", + "23053081172816430487623791969842487255036638784583", + "11487696932154902810424020138335124462181441773470", + "63783299490636259666498587618221225225512486764533", + "67720186971698544312419572409913959008952310058822", + "95548255300263520781532296796249481641953868218774", + "76085327132285723110424803456124867697064507995236", + "37774242535411291684276865538926205024910326572967", + "23701913275725675285653248258265463092207058596522", + "29798860272258331913126375147341994889534765745501", + "18495701454879288984856827726077713721403798879715", + "38298203783031473527721580348144513491373226651381", + "34829543829199918180278916522431027392251122869539", + "40957953066405232632538044100059654939159879593635", + "29746152185502371307642255121183693803580388584903", + "41698116222072977186158236678424689157993532961922", + "62467957194401269043877107275048102390895523597457", + "23189706772547915061505504953922979530901129967519", + "86188088225875314529584099251203829009407770775672", + "11306739708304724483816533873502340845647058077308", + "82959174767140363198008187129011875491310547126581", + "97623331044818386269515456334926366572897563400500", + "42846280183517070527831839425882145521227251250327", + "55121603546981200581762165212827652751691296897789", + "32238195734329339946437501907836945765883352399886", + "75506164965184775180738168837861091527357929701337", + "62177842752192623401942399639168044983993173312731", + "32924185707147349566916674687634660915035914677504", + "99518671430235219628894890102423325116913619626622", + "73267460800591547471830798392868535206946944540724", + "76841822524674417161514036427982273348055556214818", + "97142617910342598647204516893989422179826088076852", + "87783646182799346313767754307809363333018982642090", + "10848802521674670883215120185883543223812876952786", + "71329612474782464538636993009049310363619763878039", + "62184073572399794223406235393808339651327408011116", + "66627891981488087797941876876144230030984490851411", + "60661826293682836764744779239180335110989069790714", + "85786944089552990653640447425576083659976645795096", + "66024396409905389607120198219976047599490197230297", + "64913982680032973156037120041377903785566085089252", + "16730939319872750275468906903707539413042652315011", + "94809377245048795150954100921645863754710598436791", + "78639167021187492431995700641917969777599028300699", + "15368713711936614952811305876380278410754449733078", + "40789923115535562561142322423255033685442488917353", + "44889911501440648020369068063960672322193204149535", + "41503128880339536053299340368006977710650566631954", + "81234880673210146739058568557934581403627822703280", + "82616570773948327592232845941706525094512325230608", + "22918802058777319719839450180888072429661980811197", + "77158542502016545090413245809786882778948721859617", + "72107838435069186155435662884062257473692284509516", + "20849603980134001723930671666823555245252804609722", + "53503534226472524250874054075591789781264330331690", ]; let sum = 0; for (let i = 0; i < numStrs.length; i++) { - let s13 = ''; + let s13 = ""; for (let j = 0; j < 13; j++) { s13 += numStrs[i][j]; @@ -117,8 +117,8 @@ export default function main() { } const sumStr = `${sum}`; - let leadingDigits = ''; - let trailingDigits = ''; + let leadingDigits = ""; + let trailingDigits = ""; for (let i = 0; i < sumStr.length; i++) { if (i < 10) { diff --git a/measure_bytecode_size/Cargo.toml b/measure_bytecode_size/Cargo.toml new file mode 100644 index 0000000..c32d9e5 --- /dev/null +++ b/measure_bytecode_size/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "measure_bytecode_size" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +valuescript_compiler = { path = "../valuescript_compiler" } diff --git a/measure_bytecode_size/src/main.rs b/measure_bytecode_size/src/main.rs new file mode 100644 index 0000000..b9eec2e --- /dev/null +++ b/measure_bytecode_size/src/main.rs @@ -0,0 +1,104 @@ +use std::{ + collections::HashMap, + fs, + path::{Path, PathBuf}, +}; + +use valuescript_compiler::{assemble, compile, resolve_path, ResolvedPath}; + +pub fn main() { + let exe_path = std::env::current_exe().unwrap(); + let mut current_dir = exe_path.parent().unwrap(); + + while current_dir.file_name().unwrap() != "target" { + current_dir = current_dir.parent().unwrap(); + } + + let project_dir = current_dir.parent().unwrap(); // Go up one more level to get the project directory + + let input_dir_path = project_dir.join("inputs"); + + let mut files = get_files_recursively(input_dir_path).expect("Failed to get files"); + files.sort(); + + let mut file_count = 0; + let mut total_len = 0; + + let mut bytecode_sizes = HashMap::::new(); + + for file_path in files { + let file_contents = fs::read_to_string(&file_path).expect("Failed to read file contents"); + + if let Some(first_line) = file_contents.lines().next() { + if !first_line.starts_with("// test_output! ") { + continue; + } + + let resolved_path = resolve_entry_path( + &file_path + .to_str() + .expect("Failed to convert to str") + .to_string(), + ); + + let compile_result = compile(resolved_path, |path| { + fs::read_to_string(path).map_err(|err| err.to_string()) + }); + + let module = compile_result.module.expect("Expected module"); + + let bytecode = assemble(&module); + let bytecode_len = bytecode.len(); + + file_count += 1; + total_len += bytecode_len; + + bytecode_sizes.insert(file_path, bytecode_len); + } + } + + println!("Compiled {} programs into {} bytes", file_count, total_len); + + let mut bytecode_sizes_vec = bytecode_sizes + .into_iter() + .collect::>(); + + bytecode_sizes_vec.sort_by(|a, b| b.1.cmp(&a.1)); + + for (file_path, bytecode_len) in bytecode_sizes_vec { + let path = file_path.strip_prefix(project_dir).unwrap_or(&file_path); + println!("{}: {} bytes", path.display(), bytecode_len); + } +} + +fn get_files_recursively(dir_path: impl AsRef) -> Result, std::io::Error> { + let mut files = vec![]; + for entry in fs::read_dir(dir_path)? { + let entry = entry?; + let path = entry.path(); + if path.is_file() { + files.push(path); + } else if path.is_dir() { + files.extend(get_files_recursively(path)?); + } + } + Ok(files) +} + +fn resolve_entry_path(entry_path: &String) -> ResolvedPath { + // Like cwd (current working dir), but it's cwd/file. + // This is a bit of a hack so we can use resolve_path to get the absolute path of the entry point. + let cwd_file = ResolvedPath { + path: std::env::current_dir() + .expect("Failed to get current directory") + .as_path() + .join("file") + .to_str() + .expect("Failed to convert to str") + .to_string(), + }; + + let resolved_entry_path = resolve_path(&cwd_file, entry_path); + + resolved_entry_path +}