// run_native.ce — load a module both interpreted and native, compare speed // // Usage: // cell --dev run_native.ce // // Loads .cm via use() (interpreted) and .cm.dylib (native), // runs both and compares results and timing. var os = use('os') if (length(args) < 1) { print('usage: cell --dev run_native.ce ') print(' e.g. cell --dev run_native.ce num_torture') return } var name = args[0] if (ends_with(name, '.cm')) { name = text(name, 0, length(name) - 3) } var safe = replace(replace(name, '/', '_'), '-', '_') var symbol = 'js_' + safe + '_use' var dylib_path = './' + name + '.cm.dylib' var fd = use('fd') // --- Test argument for function-returning modules --- var test_arg = 5000000 if (length(args) > 1) { test_arg = number(args[1]) } // --- Interpreted run --- print('--- interpreted ---') var t1 = os.now() var mod_interp = use(name) var t2 = os.now() var result_interp = null if (is_function(mod_interp)) { print('module returns a function, calling with ' + text(test_arg)) t1 = os.now() result_interp = mod_interp(test_arg) t2 = os.now() } result_interp = result_interp != null ? result_interp : mod_interp var ms_interp = (t2 - t1) / 1000000 print('result: ' + text(result_interp)) print('time: ' + text(ms_interp) + ' ms') // --- Native run --- if (!fd.is_file(dylib_path)) { print('\nno ' + dylib_path + ' found — run compile.ce first') return } print('\n--- native ---') var t3 = os.now() var lib = os.dylib_open(dylib_path) var t4 = os.now() var mod_native = os.dylib_symbol(lib, symbol) var t5 = os.now() var result_native = null if (is_function(mod_native)) { print('module returns a function, calling with ' + text(test_arg)) t4 = os.now() result_native = mod_native(test_arg) t5 = os.now() } result_native = result_native != null ? result_native : mod_native var ms_load = (t4 - t3) / 1000000 var ms_exec = (t5 - t4) / 1000000 var ms_native = (t5 - t3) / 1000000 print('result: ' + text(result_native)) print('load: ' + text(ms_load) + ' ms') print('exec: ' + text(ms_exec) + ' ms') print('total: ' + text(ms_native) + ' ms') // --- Comparison --- print('\n--- comparison ---') var match = result_interp == result_native var speedup = 0 var speedup_exec = 0 print('match: ' + text(match)) if (ms_native > 0) { speedup = ms_interp / ms_native print('speedup: ' + text(speedup) + 'x (total)') } if (ms_exec > 0) { speedup_exec = ms_interp / ms_exec print('speedup: ' + text(speedup_exec) + 'x (exec only)') }