File size: 7,385 Bytes
c19ca42
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <title>SD WebUI Benchmark Data</title>
    <meta name="viewport" content="width=device-width" id="viewport">
    <meta name="keywords" content="benchmark">
    <meta name="application-name" content="SD WebUI Benchmark Data">
    <meta name="description" content="SD WebUI Benchmark Data; Author: Vladimir Mandic <https://github.com/vladmandic>">
    <meta name="theme-color" content="#000000">
    <link rel="manifest" href="manifest.webmanifest">
    <link rel="shortcut icon" href="favicon.ico" type="image/x-icon">
    <link rel="apple-touch-icon" href="favicon.png">
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/theme/mermaid.css">
    <!-- <link rel="stylesheet" href="benchmark.css"> -->
    <style>
      @font-face { font-family: 'Roboto'; font-display: swap; font-style: normal; font-weight: 100; src: local('Roboto'), url('roboto.ttf') }
      html { font-family: 'Roboto', 'Segoe UI'; font-size: 14px; }
      body { margin: 0; background: black; color: white; overflow: hidden; width: 100vw; height: 100vh; line-height: 1.5rem; }
      body::-webkit-scrollbar { display: none; }
      div { margin-bottom: 0.5rem; }
      a { color: #AAA; text-decoration: none; }
      th { top: -2px !important; } /* fix for gridjs header */
      input[type=search] { background-color: #333; font-size: 1.2rem; border-color: #222; color: white; margin-left: 12px; }
      ::-webkit-scrollbar { width: 12px; }
      ::-webkit-scrollbar-track { background: #555; }
      ::-webkit-scrollbar-thumb { background-color: #AAA; border-radius: 2px; border-width: 0; box-shadow: 2px 2px 3px #111111; }
      table td:nth-child(3) { background-color: #555 !important; letter-spacing: 1px; text-align: right; }
      td.gridjs-td:last-child { white-space: nowrap; }
      .gridjs-footer { background-color: unset !important; border-top: unset !important; }
      .gridjs-pagination { color: white; }
    </style>
  </head>
  <body>
    <div style="margin: 12px">
      <h1>SD WebUI Benchmark Data</h1>
      <div>
        Benchmark data is created using | <b>SD WebUI Extension <a href="https://github.com/vladmandic/sd-extension-system-info" style="color: #67d2d2">System Info</a></b>
      </div>
      Last modified | <span id="modified" style="color: #CCC"></span>
      <span id="modified" style="color: #AAA"> (page is updated automatically hourly if new data is found) <a href="https://github.com/vladmandic/sd-data/actions" target="_blank"> | STATUS</a></span>
      <div>Download 
        | <a href="https://vladmandic.github.io/sd-data/pages/benchmark-data.json" style="color: #AAA" target="_blank">DATA</a></b>
        | <a href="https://vladmandic.github.io/sd-data/input/benchmark-raw.json" style="color: #AAA" target="_blank">RAW</a></b>
      </div>
      <div style="color: #CCC"><i>Note | Performance is measured as iterations per second for different batch sizes (1, 2, 4, 8 ...) and using standardized txt2img settings</i></div>
      <br>
      <div id="table"></div> 
      <div id="log" style="color: #AAA; position: absolute; bottom: 0"></div>
    </div>
    <script type="module">
      import { Grid, html } from 'https://cdn.jsdelivr.net/npm/[email protected]/dist/gridjs.module.js'; // eslint-disable-line import/no-unresolved, node/no-missing-import, import/extensions

      const currentUrl = new URL(location.href);
      const dataUrl = 'https://vladmandic.github.io/sd-data/pages/benchmark-data.json';

      const log = (...msg) => {
        console.log('benchmark', ...msg); // eslint-disable-line no-console
        const el = document.getElementById('log');
        el.innerHTML = Array.isArray(msg) ? msg.join(' ') : msg;
        el.style.display = 'block';
        setTimeout(() => el.style.display = 'none', 2500);
      };

      async function main() {
        let data = [];
        const res = await fetch(dataUrl);
        if (res.ok) {
          data = await res.json();
          const modified = res.headers.get('last-modified');
          document.getElementById('modified').innerHTML = `${new Date(modified).toLocaleString()}`;
          log('benchmark data loaded records:', data.length);
        } else {
          log('benchmark data load failed:', res.status, res.statusText);
        }

        const text2url = (text) => text.replace(/((|http|https|ftp):\/\/[\w?=&./-;#~%-]+(?![\w\s?&./;#~%"=-]*>))/g, "<a href='$1' target='_blank'>$1</a>").replace(/(url:)/g, '').replace('updated:', '');
        const attrs = (text) => text.replace(/(\w*:\b)/g, "<span style='color: #AAA'>$1 </span>");
        const perfSort = (a, b) => {
          const a0 = a.split('/').map((v) => v.trim());
          const b0 = b.split('/').map((v) => v.trim());
          const amax = a0.reduce((acc, cur) => Math.max(acc, isNaN(cur) ? 0 : parseFloat(cur)), 0);
          const bmax = b0.reduce((acc, cur) => Math.max(acc, isNaN(cur) ? 0 : parseFloat(cur)), 0);
          if (amax > bmax) return 1;
          if (bmax > amax) return -1;
          return 0;
        };

        const grid = new Grid({
          columns: [
            { name: '', id: 'id', width: '50px', formatter: (cell) => html(`<span style="color: #67d2d2">${cell}</span>`) },
            { name: 'Date', width: '130px', formatter: (cell) => `${new Date(cell).toLocaleString()}` },
            { name: 'Performance', formatter: (cell) => html(`<b>${cell.replace(/\//g, 'it/s<br>')} it/s</b>`), sort: { compare: (a, b) => perfSort(a, b) } },
            { name: 'Version', width: '260px', formatter: (cell) => html(`${text2url(cell)}`) },
            { name: 'System', width: '400px', formatter: (cell) => html(attrs(cell)) },
            { name: 'Libraries', width: '300px', formatter: (cell) => html(attrs(cell)) },
            { name: 'GPU', width: '260px', formatter: (cell) => html(`${attrs(cell.replace('device:', ''))}`) },
            { name: 'Optimizations', formatter: (cell) => html(cell.replace(/ /g, '<br>').toLowerCase()) },
            { name: 'Model', width: '260px', formatter: (cell) => html(`<span style="color: bisque">${cell.split(/\/|\\/).pop().replace(/\[/g, '<br>[')}</span>`) },
            { name: 'Username' },
            { name: 'Note', formatter: (cell) => html(`<span style="font-size: 0.9rem">${attrs(cell?.replace('device:', '') || '')}</span>`) },
          ],
          pagination: {
            limit: 200,
            summary: true,
          },
          search: {
            keyword: currentUrl.searchParams.get('keyword') || '',
            debounceTimeout: 1500,
            ignoreHiddenColumns: true
          },
          sort: { multiColumn: false },
          resizable: true,
          fixedHeader: true,
          height: '75vh',
          style: {
            table: { 'line-break': 'strict' },
            th: { 'background-color': '#67d2d2', color: '#000', border: '2px solid #111', padding: '12px' },
            td: { overflow: 'hidden', padding: '6px 10px', 'line-height': '1.5rem', 'background-color': '#333', color: '#FFF', border: '2px solid #111' },
          },
          data,
        });
        grid.render(document.getElementById('table'));
        grid.on('rowClick', (...args) => log('row:', args));
        grid.on('cellClick', (...args) => log('cell:', args));
      }

      window.onload = main;
  </script>
  </body>
</html>