<!doctype html> <html lang="en-us"> <head> <meta charset="utf-8"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <link rel="shortcut icon" href="data:image/x-icon;," type="image/x-icon"> <link rel="stylesheet" href="common/emscripten.css"/> <link rel="stylesheet" href="common/testing.css"/> <title>speedtest1.wasm</title> </head> <body> <header id='titlebar'><span>speedtest1.wasm</span></header> <div>See also: <a href='speedtest1-worker.html'>A Worker-thread variant of this page.</a></div> <!-- emscripten bits --> <figure id="module-spinner"> <div class="spinner"></div> <div class='center'><strong>Initializing app...</strong></div> <div class='center'> On a slow internet connection this may take a moment. If this message displays for "a long time", intialization may have failed and the JavaScript console may contain clues as to why. </div> </figure> <div class="emscripten" id="module-status">Downloading...</div> <div class="emscripten"> <progress value="0" max="100" id="module-progress" hidden='1'></progress> </div><!-- /emscripten bits --> <div class='warning'>This page starts running the main exe when it loads, which will block the UI until it finishes! Adding UI controls to manually configure and start it are TODO.</div> </div> <div class='warning'>Achtung: running it with the dev tools open may <em>drastically</em> slow it down. For faster results, keep the dev tools closed when running it! </div> <div>Output is delayed/buffered because we cannot update the UI while the speedtest is running. Output will appear below when ready... <div id='test-output'></div> <script src="common/SqliteTestUtil.js"></script> <script src="jswasm/speedtest1.js"></script> <script>(function(){ /** If this environment contains WASMFS with OPFS, this function initializes it and returns the name of the dir on which OPFS is mounted, else it returns an empty string. */ const wasmfsDir = function f(wasmUtil){ if(undefined !== f._) return f._; const pdir = '/persistent'; if( !self.FileSystemHandle || !self.FileSystemDirectoryHandle || !self.FileSystemFileHandle){ return f._ = ""; } try{ if(0===wasmUtil.xCallWrapped( 'sqlite3_wasm_init_wasmfs', 'i32', ['string'], pdir )){ return f._ = pdir; }else{ return f._ = ""; } }catch(e){ // sqlite3_wasm_init_wasmfs() is not available return f._ = ""; } }; wasmfsDir._ = undefined; const eOut = document.querySelector('#test-output'); const log2 = function(cssClass,...args){ const ln = document.createElement('div'); if(cssClass) ln.classList.add(cssClass); ln.append(document.createTextNode(args.join(' '))); eOut.append(ln); //this.e.output.lastElementChild.scrollIntoViewIfNeeded(); }; const logList = []; const dumpLogList = function(){ logList.forEach((v)=>log2('',v)); logList.length = 0; }; /* can't update DOM while speedtest is running unless we run speedtest in a worker thread. */; const log = (...args)=>{ console.log(...args); logList.push(args.join(' ')); }; const logErr = function(...args){ console.error(...args); logList.push('ERROR: '+args.join(' ')); }; const runTests = function(sqlite3){ const capi = sqlite3.capi, wasm = sqlite3.wasm; //console.debug('sqlite3 =',sqlite3); const pDir = wasmfsDir(wasm); if(pDir){ console.warn("Persistent storage:",pDir); } const scope = wasm.scopedAllocPush(); let dbFile = pDir+"/speedtest1.db"; const urlParams = new URL(self.location.href).searchParams; const argv = ["speedtest1"]; if(urlParams.has('flags')){ argv.push(...(urlParams.get('flags').split(','))); } let forceSize = 0; let vfs, pVfs = 0; if(urlParams.has('vfs')){ vfs = urlParams.get('vfs'); pVfs = capi.sqlite3_vfs_find(vfs); if(!pVfs){ log2('error',"Unknown VFS:",vfs); return; } argv.push("--vfs", vfs); log2('',"Using VFS:",vfs); if('kvvfs' === vfs){ forceSize = 4 /* 5 uses approx. 4.96mb */; dbFile = 'session'; log2('warning',"kvvfs VFS: forcing --size",forceSize, "and filename '"+dbFile+"'."); capi.sqlite3_js_kvvfs_clear(dbFile); } } if(forceSize){ argv.push('--size',forceSize); }else{ [ 'size' ].forEach(function(k){ const v = urlParams.get(k); if(v) argv.push('--'+k, urlParams[k]); }); } argv.push( "--singlethread", //"--nomutex", //"--nosync", //"--memdb", // note that memdb trumps the filename arg "--nomemstat" ); argv.push("--big-transactions"/*important for tests 410 and 510!*/, dbFile); console.log("argv =",argv); // These log messages are not emitted to the UI until after main() returns. Fixing that // requires moving the main() call and related cleanup into a timeout handler. if(pDir) wasm.sqlite3_wasm_vfs_unlink(pVfs,dbFile); log2('',"Starting native app:\n ",argv.join(' ')); log2('',"This will take a while and the browser might warn about the runaway JS.", "Give it time..."); logList.length = 0; setTimeout(function(){ wasm.xCall('wasm_main', argv.length, wasm.scopedAllocMainArgv(argv)); wasm.scopedAllocPop(scope); if('kvvfs'===vfs){ logList.unshift("KVVFS "+dbFile+" size = "+ capi.sqlite3_js_kvvfs_size(dbFile)); } if(pDir) wasm.sqlite3_wasm_vfs_unlink(pVfs,dbFile); logList.unshift("Done running native main(). Output:"); dumpLogList(); }, 50); }/*runTests()*/; self.sqlite3TestModule.print = log; self.sqlite3TestModule.printErr = logErr; sqlite3InitModule(self.sqlite3TestModule).then(runTests); })();</script> </body> </html>