xref: /sqlite-3.40.0/ext/wasm/speedtest1.html (revision 8fc8b5b3)
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>
13100b496dSstephan    <!-- emscripten bits -->
14100b496dSstephan    <figure id="module-spinner">
15100b496dSstephan      <div class="spinner"></div>
16100b496dSstephan      <div class='center'><strong>Initializing app...</strong></div>
17100b496dSstephan      <div class='center'>
18100b496dSstephan        On a slow internet connection this may take a moment.  If this
19100b496dSstephan        message displays for "a long time", intialization may have
20100b496dSstephan        failed and the JavaScript console may contain clues as to why.
21100b496dSstephan      </div>
22100b496dSstephan    </figure>
23100b496dSstephan    <div class="emscripten" id="module-status">Downloading...</div>
24100b496dSstephan    <div class="emscripten">
25100b496dSstephan      <progress value="0" max="100" id="module-progress" hidden='1'></progress>
26100b496dSstephan    </div><!-- /emscripten bits -->
27100b496dSstephan    <div>Output is sent to the dev console because we cannot update the UI while the
28100b496dSstephan      speedtest is running unless/until we move the speedtest to a worker thread.</div>
29100b496dSstephan    <hr>
30100b496dSstephan    <div id='test-output'></div>
31100b496dSstephan    <script src="common/whwasmutil.js"></script>
32100b496dSstephan    <script src="common/SqliteTestUtil.js"></script>
33100b496dSstephan    <script src="speedtest1.js"></script>
34*8fc8b5b3Sstephan    <script>(function(){
35*8fc8b5b3Sstephan        /**
36*8fc8b5b3Sstephan           If this environment contains OPFS, this function initializes it and
37*8fc8b5b3Sstephan           returns the name of the dir on which OPFS is mounted, else it returns
38*8fc8b5b3Sstephan           an empty string.
39*8fc8b5b3Sstephan        */
40*8fc8b5b3Sstephan        const opfsDir = function f(wasmUtil){
41*8fc8b5b3Sstephan          if(undefined !== f._) return f._;
42*8fc8b5b3Sstephan          const pdir = '/persistent';
43*8fc8b5b3Sstephan          if( !self.FileSystemHandle
44*8fc8b5b3Sstephan              || !self.FileSystemDirectoryHandle
45*8fc8b5b3Sstephan              || !self.FileSystemFileHandle){
46*8fc8b5b3Sstephan            return f._ = "";
47*8fc8b5b3Sstephan          }
48*8fc8b5b3Sstephan          try{
49*8fc8b5b3Sstephan            if(0===wasmUtil.xCallWrapped(
50*8fc8b5b3Sstephan              'sqlite3_wasm_init_opfs', 'i32', ['string'], pdir
51*8fc8b5b3Sstephan            )){
52*8fc8b5b3Sstephan              return f._ = pdir;
53*8fc8b5b3Sstephan            }else{
54*8fc8b5b3Sstephan              return f._ = "";
55*8fc8b5b3Sstephan            }
56*8fc8b5b3Sstephan          }catch(e){
57*8fc8b5b3Sstephan            // sqlite3_wasm_init_opfs() is not available
58*8fc8b5b3Sstephan            return f._ = "";
59*8fc8b5b3Sstephan          }
60*8fc8b5b3Sstephan        };
61*8fc8b5b3Sstephan        opfsDir._ = undefined;
62*8fc8b5b3Sstephan
63100b496dSstephan        const eOut = document.querySelector('#test-output');
64*8fc8b5b3Sstephan        const log2 = async function(cssClass,...args){
65100b496dSstephan          const ln = document.createElement('div');
66100b496dSstephan          if(cssClass) ln.classList.add(cssClass);
67100b496dSstephan          ln.append(document.createTextNode(args.join(' ')));
68100b496dSstephan          eOut.append(ln);
69100b496dSstephan          //this.e.output.lastElementChild.scrollIntoViewIfNeeded();
70100b496dSstephan        };
71100b496dSstephan        const doHtmlOutput = false
72100b496dSstephan        /* can't update DOM while speedtest is running unless we run
73100b496dSstephan           speedtest in a worker thread. */;
74*8fc8b5b3Sstephan        const log = (...args)=>{
75100b496dSstephan          console.log(...args);
76*8fc8b5b3Sstephan          if(doHtmlOutput) log2('', ...args);
77100b496dSstephan        };
78100b496dSstephan        const logErr = function(...args){
79100b496dSstephan          console.error(...args);
80*8fc8b5b3Sstephan          if(doHtmlOutput) log2('error', ...args);
81100b496dSstephan        };
82100b496dSstephan
83100b496dSstephan        const runTests = function(EmscriptenModule){
84*8fc8b5b3Sstephan          console.log("Module inited.",EmscriptenModule);
85100b496dSstephan          const wasm = {
86100b496dSstephan            exports: EmscriptenModule.asm,
87100b496dSstephan            alloc: (n)=>EmscriptenModule._malloc(n),
88*8fc8b5b3Sstephan            dealloc: (m)=>EmscriptenModule._free(m),
89*8fc8b5b3Sstephan            memory: EmscriptenModule.asm.memory || EmscriptenModule.wasmMemory
90100b496dSstephan          };
91100b496dSstephan          //console.debug('wasm =',wasm);
92100b496dSstephan          self.WhWasmUtilInstaller(wasm);
93*8fc8b5b3Sstephan          const unlink = wasm.xWrap("sqlite3_wasm_vfs_unlink", "int", ["string"]);
94*8fc8b5b3Sstephan          const pDir = opfsDir(wasm);
95*8fc8b5b3Sstephan          if(pDir){
96*8fc8b5b3Sstephan            console.warn("Persistent storage:",pDir);
97*8fc8b5b3Sstephan          }
98100b496dSstephan          const scope = wasm.scopedAllocPush();
99*8fc8b5b3Sstephan          const dbFile = 0 ? "" : pDir+"/speedtest1.db";
100100b496dSstephan          try{
101*8fc8b5b3Sstephan            const argv = [
102100b496dSstephan              // TODO: accept flags via URL arguments and/or a
103100b496dSstephan              // UI control. A multi-SELECT element should do
104100b496dSstephan              // nicely.
105100b496dSstephan              "speedtest1",
106*8fc8b5b3Sstephan              "--singlethread",
107*8fc8b5b3Sstephan              //"--stats",
108*8fc8b5b3Sstephan              "--memdb", // note that memdb trumps the filename arg
109*8fc8b5b3Sstephan              dbFile
110100b496dSstephan            ];
111*8fc8b5b3Sstephan            console.log("argv =",argv);
112*8fc8b5b3Sstephan            wasm.xCall('__main_argc_argv', argv.length,
113*8fc8b5b3Sstephan                       wasm.scopedAllocMainArgv(argv));
114100b496dSstephan          }finally{
115100b496dSstephan            wasm.scopedAllocPop(scope);
116*8fc8b5b3Sstephan            if(pDir) unlink(dbFile);
117100b496dSstephan          }
118100b496dSstephan        };
119100b496dSstephan
120*8fc8b5b3Sstephan        self.sqlite3TestModule.print = log;
121100b496dSstephan        self.sqlite3TestModule.printErr = logErr;
122100b496dSstephan        sqlite3Speedtest1InitModule(self.sqlite3TestModule).then(function(M){
123100b496dSstephan          setTimeout(()=>runTests(M), 100);
124100b496dSstephan        });
125100b496dSstephan      })();
126100b496dSstephan    </script>
127100b496dSstephan  </body>
128100b496dSstephan</html>
129