website/blog/pow-performance/index.html

411 lines
15 KiB
HTML

<!doctype html>
<html lang="en-US">
<head>
<meta charset="utf-8">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<link rel="preload" as="font" href="/fonts/vendor/jost/jost-v4-latin-regular.woff2" type="font/woff2" crossorigin>
<link rel="preload" as="font" href="/fonts/vendor/jost/jost-v4-latin-700.woff2" type="font/woff2" crossorigin>
<link rel="stylesheet" href="/main.4492eacff4110697cd6162326bce4ee59e92315bf9acc357594066968669326dc80b75b1a39e6cea81c4f8898bd1d294fcc657a9cb61baed14c7dee6f9e2b2d6.css" integrity="sha512-RJLqz/QRBpfNYWIya85O5Z6SMVv5rMNXWUBmloZpMm3IC3Wxo55s6oHE&#43;ImL0dKU/MZXqcthuu0Ux97m&#43;eKy1g==" crossorigin="anonymous">
<noscript><style>img.lazyload { display: none; }</style></noscript>
<meta name="robots" content="index, follow">
<meta name="googlebot" content="index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1">
<meta name="bingbot" content="index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1">
<title>PoW performance - mCaptcha</title>
<meta name="description" content="PoW performance of native and WASM implementations. Does the native implementation have and edge over the WASM library?">
<link rel="canonical" href="/blog/pow-performance/">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:image" content="/blog/pow-performance/icon.png">
<meta name="twitter:title" content="PoW performance">
<meta name="twitter:description" content="PoW performance of native and WASM implementations. Does the native implementation have and edge over the WASM library?">
<meta name="twitter:site" content="@">
<meta name="twitter:creator" content="@">
<meta property="og:title" content="PoW performance">
<meta property="og:description" content="PoW performance of native and WASM implementations. Does the native implementation have and edge over the WASM library?">
<meta property="og:type" content="article">
<meta property="og:url" content="/blog/pow-performance/">
<meta property="og:image" content="/blog/pow-performance/icon.png">
<meta property="article:published_time" content="2021-09-01T00:00:00+00:00">
<meta property="article:modified_time" content="2023-03-08T17:28:52+05:30">
<meta property="og:site_name" content="mCaptcha">
<meta property="article:publisher" content="https://www.facebook.com/">
<meta property="article:author" content="https://www.facebook.com/">
<meta property="og:locale" content="en_US">
<script type="application/ld+json">
{
"@context": "http://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [{
"@type": "ListItem",
"position": 1 ,
"name": "Home",
"item": "\/"
},{
"@type": "ListItem",
"position": 2 ,
"name": "Blogpow Performance",
"item": "\/blogpow-performance\/"
}]
}
</script>
<meta name="theme-color" content="#fff">
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png">
<link rel="manifest" href="/site.webmanifest">
</head>
<body class="blog single">
<div class="header-bar fixed-top"></div>
<header class="navbar fixed-top navbar-expand-md navbar-light">
<div class="container">
<input class="menu-btn order-0" type="checkbox" id="menu-btn">
<label class="menu-icon d-md-none" for="menu-btn"><span class="navicon"></span></label>
<a class="navbar-brand order-1 order-md-0 me-auto" href="/">mCaptcha</a>
<button id="mode" class="btn btn-link order-2 order-md-4" type="button" aria-label="Toggle mode">
<span class="toggle-dark"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-moon"><path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"></path></svg></span>
<span class="toggle-light"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-sun"><circle cx="12" cy="12" r="5"></circle><line x1="12" y1="1" x2="12" y2="3"></line><line x1="12" y1="21" x2="12" y2="23"></line><line x1="4.22" y1="4.22" x2="5.64" y2="5.64"></line><line x1="18.36" y1="18.36" x2="19.78" y2="19.78"></line><line x1="1" y1="12" x2="3" y2="12"></line><line x1="21" y1="12" x2="23" y2="12"></line><line x1="4.22" y1="19.78" x2="5.64" y2="18.36"></line><line x1="18.36" y1="5.64" x2="19.78" y2="4.22"></line></svg></span>
</button>
<ul class="navbar-nav social-nav order-3 order-md-5">
<li class="nav-item">
<a class="nav-link" href="https://github.com/mCaptcha"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-github"><path d="M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22"></path></svg><span class="ms-2 visually-hidden">GitHub</span></a>
</li>
</ul>
<div class="collapse navbar-collapse order-4 order-md-1">
<ul class="navbar-nav main-nav me-auto order-5 order-md-2"><li class="nav-item active">
<a class="nav-link" href="/blog/">Blog</a>
</li>
<li class="nav-item">
<a class="nav-link" href="/community/">Community</a>
</li>
<li class="nav-item">
<a class="nav-link" href="/contact/">Contact</a>
</li>
<li class="nav-item">
<a class="nav-link" href="/about/">About</a>
</li>
<li class="nav-item">
<a class="nav-link" href="/docs/introduction/installing-captcha/">Docs</a>
</li>
</ul>
<div class="break order-6 d-md-none"></div>
<form class="navbar-form flex-grow-1 order-7 order-md-3">
<input id="userinput" class="form-control is-search" type="search" placeholder="Search docs..." aria-label="Search docs..." autocomplete="off">
<div id="suggestions" class="shadow bg-white rounded"></div>
</form>
</div>
</div>
</header>
<div class="wrap container" role="document">
<div class="content">
<div class="row flex-xl-nowrap">
<nav class="docs-toc d-none d-xl-block col-xl-3" aria-label="Secondary navigation">
<div class="page-links">
<h3>On this page</h3>
<nav id="TableOfContents">
<ul>
<li><a href="#benchmark-tools">Benchmark tools</a></li>
<li><a href="#results">Results</a>
<ul>
<li><a href="#native">Native</a></li>
<li><a href="#browser">Browser</a></li>
<li><a href="#firefox">Firefox</a></li>
</ul>
</li>
<li><a href="#conclusion">Conclusion</a></li>
</ul>
</nav>
</div>
</nav>
<main class="docs-content col-lg-11 col-xl-9 mx-xl-auto">
<article>
<div class="blog-header">
<h1>PoW performance</h1>
<p><small>Posted September 1, 2021 by <a class="stretched-link position-relative" href="/contributors/aravinth-manivannan/">Aravinth Manivannan</a>&nbsp;&hyphen;&nbsp;<strong>2&nbsp;min read</strong></small><p>
<p><small>Last Edited March 8, 2023</small><p>
</div>
<p class="lead">We are mCaptcha. We build kickass CAPTCHA systems that give (DDoS) attackers a run for their money. And we do all of this without tracking your users. Oh and did I mention our UX is great?</p>
<p>mCaptcha uses a
<a href="https://en.wikipedia.org/wiki/Proof_of_work">proof-of-work(PoW)</a> mechanism
to rate limit users or potential bots. In order for this to be
effective, the PoW should be configured properly. The difficulty
requirement can&rsquo;t be too high, as it could cause accessibility issues on
the client-side while at the same time, it shouldn&rsquo;t be too low, as it
wouldn&rsquo;t offer proper protection against bots.</p>
<p>Malicious bots(the ones that wreak havoc), run native code which is
capable of running in a multi-threaded context. This creates an unfair
advantage for crackers using these bots over legitimate users, who
usually use browsers to access a website.</p>
<p>I wanted to see how much of an advantage a native program would have
over our WASM library.</p>
<h2 id="benchmark-tools">Benchmark tools</h2>
<p>So I wrote these to compare native and WASM performances:</p>
<ul>
<li>Browser benchmark: <a href="https://mCaptcha.github.io/benches">https://mCaptcha.github.io/benches</a></li>
<li>Native benchmark: <a href="https://github.com/mCaptcha/cli/blob/master/scripts/bench.sh">mCaptcha/cli managed by scripts/bench.sh</a></li>
</ul>
<div class="alert alert-warning d-flex" role="alert">
<div class="flex-shrink-1 alert-icon"></div>
<div class="w-100">Feel free to reproduce the results!</div>
</div>
<h2 id="results">Results</h2>
<p>The tests were run on my development machine featuring an Intel Core
i7-9750h.</p>
<h3 id="native">Native</h3>
<table>
<thead>
<tr>
<th>Difficulty</th>
<th>Real</th>
<th>User</th>
<th>Sys</th>
</tr>
</thead>
<tbody>
<tr>
<td>500000</td>
<td>0m0.220s</td>
<td>0m0.197s</td>
<td>0m0.006s</td>
</tr>
<tr>
<td>1000000</td>
<td>0m0.203s</td>
<td>0m0.203s</td>
<td>0m0.000s</td>
</tr>
<tr>
<td>1500000</td>
<td>0m0.198s</td>
<td>0m0.198s</td>
<td>0m0.000s</td>
</tr>
<tr>
<td>2000000</td>
<td>0m0.203s</td>
<td>0m0.203s</td>
<td>0m0.000s</td>
</tr>
<tr>
<td>2500000</td>
<td>0m0.758s</td>
<td>0m0.752s</td>
<td>0m0.003s</td>
</tr>
<tr>
<td>3000000</td>
<td>0m0.776s</td>
<td>0m0.769s</td>
<td>0m0.003s</td>
</tr>
<tr>
<td>3500000</td>
<td>0m2.010s</td>
<td>0m1.998s</td>
<td>0m0.000s</td>
</tr>
<tr>
<td>4000000</td>
<td>0m2.038s</td>
<td>0m2.033s</td>
<td>0m0.003s</td>
</tr>
<tr>
<td>4500000</td>
<td>0m2.014s</td>
<td>0m2.013s</td>
<td>0m0.000s</td>
</tr>
</tbody>
</table>
<h3 id="browser">Browser</h3>
<p>I ran the tests on both Firefox and Chromium to compare results</p>
<h3 id="firefox">Firefox</h3>
<ul>
<li><strong>User Agent:</strong> <code>Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Firefox/91.0</code></li>
<li><strong>Hardware concurrency:</strong> 12</li>
</ul>
<table>
<thead>
<tr>
<th>Difficulty</th>
<th>Duration(in ms)</th>
</tr>
</thead>
<tbody>
<tr>
<td>500000</td>
<td>401</td>
</tr>
<tr>
<td>1000000</td>
<td>413</td>
</tr>
<tr>
<td>1500000</td>
<td>398</td>
</tr>
<tr>
<td>2000000</td>
<td>394</td>
</tr>
<tr>
<td>2500000</td>
<td>1495</td>
</tr>
<tr>
<td>3000000</td>
<td>1556</td>
</tr>
<tr>
<td>3500000</td>
<td>3971</td>
</tr>
<tr>
<td>4000000</td>
<td>4235</td>
</tr>
<tr>
<td>4500000</td>
<td>4116</td>
</tr>
</tbody>
</table>
<blockquote>
<p>To be fair, my Firefox installation is loaded with a gazillion
extensions while the Chromium instance is clean, as I don&rsquo;t use it
much</p>
</blockquote>
<h4 id="chromium">Chromium</h4>
<ul>
<li><strong>User Agent:</strong> <code>Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36</code></li>
<li><strong>Hardware concurrency:</strong> 12</li>
</ul>
<table>
<thead>
<tr>
<th>Difficulty</th>
<th>Duration(in ms)</th>
</tr>
</thead>
<tbody>
<tr>
<td>500000</td>
<td>399.40000000037253</td>
</tr>
<tr>
<td>1000000</td>
<td>354.6000000014901</td>
</tr>
<tr>
<td>1500000</td>
<td>351.19999999925494</td>
</tr>
<tr>
<td>2000000</td>
<td>353.80000000074506</td>
</tr>
<tr>
<td>2500000</td>
<td>1337.800000000745</td>
</tr>
<tr>
<td>3000000</td>
<td>1311.199999999255</td>
</tr>
<tr>
<td>3500000</td>
<td>3417.5999999996275</td>
</tr>
<tr>
<td>4000000</td>
<td>3488.800000000745</td>
</tr>
<tr>
<td>4500000</td>
<td>3458.2999999988824</td>
</tr>
</tbody>
</table>
<h2 id="conclusion">Conclusion</h2>
<p>At the highest difficulty factor, the native implementation was a almost second
faster than the WASM library. But the fact that both of them were able
to run to completion in under 5 seconds is impressive!</p>
<p>So, in my opinion, native implementation is only slightly faster than
the WASM library and for all intents and purposes, this shouldn&rsquo;t matter
much.</p>
<hr>
<p>P.S Work is underway to benchmark multiple platforms. A detailed report
will be published when that data is available.</p>
<p>For this post, I asked some of my friends to run the tests on their
computers. The results slightly varied but even the slowest case
generated proof for 4500000 difficulty(the highest in this test), in under
15 seconds!</p>
</article>
<div class="docs-navigation d-flex justify-content-between">
<a href="/blog/survey/">
<div class="card my-1">
<div class="card-body py-2">
&larr; Survey
</div>
</div>
</a>
<a class="ms-auto" href="/blog/say-hello-to-mcaptcha/">
<div class="card my-1">
<div class="card-body py-2">
Say hello to mCaptcha &rarr;
</div>
</div>
</a>
</div>
<p class="edit-page"><a href="https://github.com/mCaptcha/website/blob/master/content/blog/pow-performance/index.md"><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-edit-2"><path d="M17 3a2.828 2.828 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5L17 3z"></path></svg>Edit this page on GitHub</a></p>
</main>
</div>
</div>
</div>
<footer class="footer text-muted">
<div class="container">
<div class="row">
<div class="col-lg-8 order-last order-lg-first">
<ul class="list-inline">
<li class="list-inline-item">Powered by <a href="https://gohugo.io/">Hugo</a>, and <a href="https://getdoks.org/">Doks</a></li>
</ul>
</div>
<div class="col-lg-8 order-first order-lg-last text-lg-end">
<ul class="list-inline">
<li class="list-inline-item"><a href="/about/">About</a></li>
<li class="list-inline-item"><a href="/donate">Donate</a></li>
<li class="list-inline-item"><a href="/privacy-policy/">Privacy</a></li>
<li class="list-inline-item"><a href="/security">Security</a></li>
<li class="list-inline-item"><a href="https://stats.uptimerobot.com/GK7VLFJnBl">Status</a></li>
<li class="list-inline-item"><a href="/thanks">Thanks</a></li>
</ul>
</div>
</div>
</div>
</footer>
<script src="/main.min.fc14a6a9dceb7093b6984e33583a45c79e3c960959d75df6b62753b4d1c63a97d25af2b0ca924ed12675f1de34f3fce9ec81668f2d3bee114b9b6357dd2e92cd.js" integrity="sha512-/BSmqdzrcJO2mE4zWDpFx548lglZ1132tidTtNHGOpfSWvKwypJO0SZ18d408/zp7IFmjy077hFLm2NX3S6SzQ==" crossorigin="anonymous" defer></script>
<script src="/index.min.f24b6e33dac74771476dda67fe905af998983abef17f74f74d71228ac8f40f87af8b15bcd9f0da775c90a41395c3d153fb0067cc75ff642c520b3607340014c0.js" integrity="sha512-8ktuM9rHR3FHbdpn/pBa&#43;ZiYOr7xf3T3TXEiisj0D4evixW82fDad1yQpBOVw9FT&#43;wBnzHX/ZCxSCzYHNAAUwA==" crossorigin="anonymous" defer></script>
</body>
</html>