xref: /sqlite-3.40.0/ext/wasm/speedtest1.html (revision 44a87f08)
1100b496dSstephan<!doctype html>
2100b496dSstephan<html lang="en-us">
3100b496dSstephan  <head>
4100b496dSstephan    <meta charset="utf-8">
5100b496dSstephan    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
6100b496dSstephan    <link rel="shortcut icon" href="data:image/x-icon;," type="image/x-icon">
7100b496dSstephan    <link rel="stylesheet" href="common/emscripten.css"/>
8100b496dSstephan    <link rel="stylesheet" href="common/testing.css"/>
9100b496dSstephan    <title>speedtest1.wasm</title>
10100b496dSstephan  </head>
11100b496dSstephan  <body>
12100b496dSstephan    <header id='titlebar'><span>speedtest1.wasm</span></header>
13*44a87f08Sstephan    <div>See also: <a href='speedtest1-worker.html'>A Worker-thread variant of this page.</a></div>
14100b496dSstephan    <!-- emscripten bits -->
15100b496dSstephan    <figure id="module-spinner">
16100b496dSstephan      <div class="spinner"></div>
17100b496dSstephan      <div class='center'><strong>Initializing app...</strong></div>
18100b496dSstephan      <div class='center'>
19100b496dSstephan        On a slow internet connection this may take a moment.  If this
20100b496dSstephan        message displays for "a long time", intialization may have
21100b496dSstephan        failed and the JavaScript console may contain clues as to why.
22100b496dSstephan      </div>
23100b496dSstephan    </figure>
24100b496dSstephan    <div class="emscripten" id="module-status">Downloading...</div>
25100b496dSstephan    <div class="emscripten">
26100b496dSstephan      <progress value="0" max="100" id="module-progress" hidden='1'></progress>
27100b496dSstephan    </div><!-- /emscripten bits -->
28*44a87f08Sstephan    <div class='warning'>This page starts running the main exe when it loads, which will
29*44a87f08Sstephan      block the UI until it finishes! Adding UI controls to manually configure and start it
30*44a87f08Sstephan      are TODO.</div>
31100b496dSstephan    <div>Output is sent to the dev console because we cannot update the UI while the
32100b496dSstephan      speedtest is running unless/until we move the speedtest to a worker thread.</div>
33100b496dSstephan    <hr>
34100b496dSstephan    <div id='test-output'></div>
35100b496dSstephan    <script src="common/whwasmutil.js"></script>
36100b496dSstephan    <script src="common/SqliteTestUtil.js"></script>
37100b496dSstephan    <script src="speedtest1.js"></script>
388fc8b5b3Sstephan    <script>(function(){
398fc8b5b3Sstephan        /**
408fc8b5b3Sstephan           If this environment contains OPFS, this function initializes it and
418fc8b5b3Sstephan           returns the name of the dir on which OPFS is mounted, else it returns
428fc8b5b3Sstephan           an empty string.
438fc8b5b3Sstephan        */
448fc8b5b3Sstephan        const opfsDir = function f(wasmUtil){
458fc8b5b3Sstephan          if(undefined !== f._) return f._;
468fc8b5b3Sstephan          const pdir = '/persistent';
478fc8b5b3Sstephan          if( !self.FileSystemHandle
488fc8b5b3Sstephan              || !self.FileSystemDirectoryHandle
498fc8b5b3Sstephan              || !self.FileSystemFileHandle){
508fc8b5b3Sstephan            return f._ = "";
518fc8b5b3Sstephan          }
528fc8b5b3Sstephan          try{
538fc8b5b3Sstephan            if(0===wasmUtil.xCallWrapped(
548fc8b5b3Sstephan              'sqlite3_wasm_init_opfs', 'i32', ['string'], pdir
558fc8b5b3Sstephan            )){
568fc8b5b3Sstephan              return f._ = pdir;
578fc8b5b3Sstephan            }else{
588fc8b5b3Sstephan              return f._ = "";
598fc8b5b3Sstephan            }
608fc8b5b3Sstephan          }catch(e){
618fc8b5b3Sstephan            // sqlite3_wasm_init_opfs() is not available
628fc8b5b3Sstephan            return f._ = "";
638fc8b5b3Sstephan          }
648fc8b5b3Sstephan        };
658fc8b5b3Sstephan        opfsDir._ = undefined;
668fc8b5b3Sstephan
67100b496dSstephan        const eOut = document.querySelector('#test-output');
688fc8b5b3Sstephan        const log2 = async function(cssClass,...args){
69100b496dSstephan          const ln = document.createElement('div');
70100b496dSstephan          if(cssClass) ln.classList.add(cssClass);
71100b496dSstephan          ln.append(document.createTextNode(args.join(' ')));
72100b496dSstephan          eOut.append(ln);
73100b496dSstephan          //this.e.output.lastElementChild.scrollIntoViewIfNeeded();
74100b496dSstephan        };
75100b496dSstephan        const doHtmlOutput = false
76100b496dSstephan        /* can't update DOM while speedtest is running unless we run
77100b496dSstephan           speedtest in a worker thread. */;
788fc8b5b3Sstephan        const log = (...args)=>{
79100b496dSstephan          console.log(...args);
808fc8b5b3Sstephan          if(doHtmlOutput) log2('', ...args);
81100b496dSstephan        };
82100b496dSstephan        const logErr = function(...args){
83100b496dSstephan          console.error(...args);
848fc8b5b3Sstephan          if(doHtmlOutput) log2('error', ...args);
85100b496dSstephan        };
86100b496dSstephan
87100b496dSstephan        const runTests = function(EmscriptenModule){
888fc8b5b3Sstephan          console.log("Module inited.",EmscriptenModule);
89100b496dSstephan          const wasm = {
90100b496dSstephan            exports: EmscriptenModule.asm,
91100b496dSstephan            alloc: (n)=>EmscriptenModule._malloc(n),
928fc8b5b3Sstephan            dealloc: (m)=>EmscriptenModule._free(m),
938fc8b5b3Sstephan            memory: EmscriptenModule.asm.memory || EmscriptenModule.wasmMemory
94100b496dSstephan          };
95100b496dSstephan          //console.debug('wasm =',wasm);
96100b496dSstephan          self.WhWasmUtilInstaller(wasm);
978fc8b5b3Sstephan          const unlink = wasm.xWrap("sqlite3_wasm_vfs_unlink", "int", ["string"]);
988fc8b5b3Sstephan          const pDir = opfsDir(wasm);
998fc8b5b3Sstephan          if(pDir){
1008fc8b5b3Sstephan            console.warn("Persistent storage:",pDir);
1018fc8b5b3Sstephan          }
102100b496dSstephan          const scope = wasm.scopedAllocPush();
1038fc8b5b3Sstephan          const dbFile = 0 ? "" : pDir+"/speedtest1.db";
104100b496dSstephan          try{
1058fc8b5b3Sstephan            const argv = [
106100b496dSstephan              // TODO: accept flags via URL arguments and/or a
107100b496dSstephan              // UI control. A multi-SELECT element should do
108100b496dSstephan              // nicely.
109100b496dSstephan              "speedtest1",
1108fc8b5b3Sstephan              "--singlethread",
1118fc8b5b3Sstephan              //"--stats",
1128fc8b5b3Sstephan              "--memdb", // note that memdb trumps the filename arg
1138fc8b5b3Sstephan              dbFile
114100b496dSstephan            ];
1158fc8b5b3Sstephan            console.log("argv =",argv);
1168fc8b5b3Sstephan            wasm.xCall('__main_argc_argv', argv.length,
1178fc8b5b3Sstephan                       wasm.scopedAllocMainArgv(argv));
118100b496dSstephan          }finally{
119100b496dSstephan            wasm.scopedAllocPop(scope);
1208fc8b5b3Sstephan            if(pDir) unlink(dbFile);
121100b496dSstephan          }
122100b496dSstephan        };
123100b496dSstephan
1248fc8b5b3Sstephan        self.sqlite3TestModule.print = log;
125100b496dSstephan        self.sqlite3TestModule.printErr = logErr;
126100b496dSstephan        sqlite3Speedtest1InitModule(self.sqlite3TestModule).then(function(M){
127100b496dSstephan          setTimeout(()=>runTests(M), 100);
128100b496dSstephan        });
129100b496dSstephan      })();
130100b496dSstephan    </script>
131100b496dSstephan  </body>
132100b496dSstephan</html>
133