<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Vladislav</title>
    <description>The latest articles on DEV Community by Vladislav (@vladisov).</description>
    <link>https://dev.to/vladisov</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F97588%2Fd2e7b020-fe9f-4aa2-81f9-994e18694a61.jpeg</url>
      <title>DEV Community: Vladislav</title>
      <link>https://dev.to/vladisov</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/vladisov"/>
    <language>en</language>
    <item>
      <title>Bit tricks every programmer should know</title>
      <dc:creator>Vladislav</dc:creator>
      <pubDate>Thu, 02 Jun 2022 19:06:30 +0000</pubDate>
      <link>https://dev.to/vladisov/bit-tricks-every-programmer-should-know-1hlh</link>
      <guid>https://dev.to/vladisov/bit-tricks-every-programmer-should-know-1hlh</guid>
      <description>&lt;h2&gt;
  
  
  Intro
&lt;/h2&gt;

&lt;p&gt;Hey everyone, I bet during a regular day at work you guys rarely shift bits left and right, applying &lt;strong&gt;^&lt;/strong&gt; (&lt;strong&gt;XOR&lt;/strong&gt;) or &lt;strong&gt;&amp;amp;&lt;/strong&gt; (&lt;strong&gt;AND&lt;/strong&gt;). So today I want to shed some light on a few basic bit tricks that you all might find helpful (or maybe not).&lt;/p&gt;

&lt;h3&gt;
  
  
  Left Shift
&lt;/h3&gt;

&lt;p&gt;The basic one, but let's refresh our memories here and look at examples of how the left shift &amp;lt;&amp;lt;&amp;lt; operator works.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;br&gt;
Let's say we want to shift number 3 (11 in binary) by one bit to the left and it gives us 6 (110).&lt;br&gt;
3 &amp;lt;&amp;lt; 1 = 110   = 6&lt;br&gt;
3 &amp;lt;&amp;lt; 2 = 1100  = 12&lt;br&gt;
3 &amp;lt;&amp;lt; 3 = 11000 = 24&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Code:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;left_shift&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;num&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;usize&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;offset&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;usize&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;usize&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;num&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Check if the Nth bit is set
&lt;/h3&gt;

&lt;p&gt;This one is a bit trickier, it tells us whether the Nth bit from the right side is set to 1. And we gonna use &amp;amp; (AND) operator to do so.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;br&gt;
Let's say we want to check if 0 or 3rd bits are set to 1 in number 8 (1000 in binary).&lt;/p&gt;

&lt;p&gt;8 = 1000&lt;br&gt;
if offset == 0:&lt;br&gt;
1000 &amp;amp; 0001 = 0 -&amp;gt; false (not set)&lt;br&gt;
if offset == 3:&lt;br&gt;
1000 &amp;amp; 1000 = 1 -&amp;gt; true  (set)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Code:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;is_set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;num&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;usize&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;offset&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;usize&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;bool&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;num&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;offset&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Set Nth bit to 1
&lt;/h3&gt;

&lt;p&gt;Ok, here we're actually going to set a particular bit to 1 in case it's 0, or keep it as 1 if it's already set to 1.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;br&gt;
Let's continue playing with the number 8 (1000 in binary).&lt;br&gt;
(8) 1000 set 3rd and 0th bit (from right) to 1&lt;br&gt;
1000 | 1000 = 1000 == 8 (nothing changed since it was already 1)&lt;br&gt;
1000 | 0001 = 1001 = 9 (set first bit to 1)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Code:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;set_bit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;num&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;usize&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;offset&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;usize&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;usize&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;num&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;offset&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Flip Nth bit
&lt;/h3&gt;

&lt;p&gt;Here we continue playing with one bit at a time. Similar to the previous one, we do not only set the bit to 1 but actually flip the actual value of a bit. For this, we gonna use &lt;strong&gt;^ (XOR)&lt;/strong&gt;!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;br&gt;
Again 8 is 1000 in binary&lt;br&gt;
1000(8) ^ 1000(8) = 0 (flipped left 1 to 0)&lt;br&gt;
1000 ^ 1001 = 1001 (flipped right 1) &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Code:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;flip_bit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;num&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;usize&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;offset&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;usize&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;usize&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;num&lt;/span&gt; &lt;span class="o"&gt;^&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;offset&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Number complement (NOT)
&lt;/h3&gt;

&lt;p&gt;This is another standard operator many people don't even know what is it for. &lt;strong&gt;! (NOT)&lt;/strong&gt; &lt;em&gt;(in java it would be ~)&lt;/em&gt; inverts all bits of a particular number.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;br&gt;
Let's take 9 as our integer (1001 in binary)&lt;br&gt;
We can represent 9 as u8, u32, etc, let's consider u32 to resolve confusion.&lt;br&gt;
!1001 = 11111111111111111111111111110110 &lt;br&gt;
Because = 1001 in 32-bit representation is actually:&lt;br&gt;
00000000000000000000000000001001, so inverting all bits gives us 11111111111111111111111111110110, which is 4294967286 in decimal. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Code:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;not&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;num&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;u32&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;u32&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;num&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Clear Nth bit
&lt;/h3&gt;

&lt;p&gt;This one is pretty straightforward, though the concept is quite interesting. The goal is to set Nth bit to zero.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;br&gt;
Again the integer is going to be 9 (1001).&lt;br&gt;
Then let's say we want to clear the first bit from the right side.&lt;br&gt;
As we already know ! operator (complement) inverts all the bits for us. So we can shift 1 by offset to find the bit we're looking for.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;1 &amp;lt;&amp;lt; offset = 1 in our case (0th bit)&lt;/li&gt;
&lt;li&gt;!1 = 1111111*&lt;em&gt;0&lt;/em&gt;* (depending on type, let's keep u8)&lt;/li&gt;
&lt;li&gt;return 1001 &amp;amp; 11111110 = 1000 (8)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Code:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;clear_bit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;num&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;usize&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;offset&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;usize&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;usize&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;mask&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;offset&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;num&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;mask&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Calculating Hamming weight
&lt;/h3&gt;

&lt;p&gt;Hamming weight is essentially a number of ones in a binary representation of a number. There is an interesting observation has been made by Brian Kernighan,coauthor of first C language Book, which we're going to use here.&lt;br&gt;
Every time we apply n &amp;amp; (n - 1) where n is 32-bit integer, the rightmost bit becomes 0.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;br&gt;
Let's take binary 01010101.&lt;br&gt;
1st iteration: 01010100&lt;br&gt;
2nd iteration: 01010000&lt;br&gt;
3rd iteration: 01000000&lt;br&gt;
So by counting a number of iterations we can calculate the number of ones.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Code:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;hamming_weight&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;usize&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;usize&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;=&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;count&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Check if exactly one bit is set
&lt;/h3&gt;

&lt;p&gt;Here is another interesting observation. If our number is a power of 2, then we can say that only one bit is set. To check this, we just need to subtract one and apply &amp;amp; operator!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;br&gt;
8 = 1000&lt;br&gt;
8 - 1 = 7 = 0111&lt;br&gt;
1000 &amp;amp; 0111 = 0000 -&amp;gt; TRUE!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Code:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;check_exactly_one_bit_is_set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;num&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;usize&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;bool&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;num&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;num&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;num&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;I hope you find those little tricks as fascinating as I think of them and maybe even apply them in your regular job (but don't forget about code readability!).&lt;/p&gt;

</description>
      <category>rust</category>
      <category>bitwise</category>
      <category>programming</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Back of the Envelope Calculation</title>
      <dc:creator>Vladislav</dc:creator>
      <pubDate>Sun, 10 Apr 2022 19:37:26 +0000</pubDate>
      <link>https://dev.to/vladisov/back-of-the-envelope-calculation-4eal</link>
      <guid>https://dev.to/vladisov/back-of-the-envelope-calculation-4eal</guid>
      <description>&lt;h2&gt;
  
  
  Intro
&lt;/h2&gt;

&lt;p&gt;I found this topic rather misleading and always overcomplicated. Though I cannot disagree the version below is a lot more simplified than real life calculations, it's still covers 99% of the things you can encounter in your interview process.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to estimate?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;QPS&lt;/strong&gt; - queries per second&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;RPS&lt;/strong&gt; - reads per second&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;WPS&lt;/strong&gt; - writes per second&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Peak QPS&lt;/strong&gt; = QPS * 2 (usually)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;RW&lt;/strong&gt; - read write ratio&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Message size&lt;/strong&gt; - size of the message in bytes if not given&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Read&lt;/strong&gt; &lt;strong&gt;Throughput&lt;/strong&gt; - RPS * message size = N bytes per second&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Write&lt;/strong&gt; &lt;strong&gt;Throughput&lt;/strong&gt; - WPS* message size = N bytes per second&lt;/p&gt;

&lt;p&gt;💡 &lt;strong&gt;Throughput&lt;/strong&gt; is how much data actually passed through and &lt;strong&gt;bandwidth&lt;/strong&gt; is how much data CAN be passed through (network configuration)&lt;br&gt;
&lt;strong&gt;Ex:&lt;/strong&gt; 1gbps network &lt;strong&gt;bandwidth&lt;/strong&gt; can pass 125mb/s&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Storage&lt;/strong&gt; - usually storage for N years&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Replica&lt;/strong&gt; &lt;strong&gt;storage&lt;/strong&gt; - storage * 2-3 times&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cache storage&lt;/strong&gt; - usually 20% of storage or so&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cache replica storage&lt;/strong&gt; - cache storage * 2-3 times&lt;/p&gt;

&lt;h2&gt;
  
  
  Basic Numbers
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;seconds in a day&lt;/strong&gt; -  24 * 60 * 60 = 86400, roughly 10^5&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1 ASCI letter&lt;/strong&gt; - 1 char&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;timestamp&lt;/strong&gt; - 8 bytes  (2^64)&lt;/p&gt;

&lt;p&gt;10&lt;sup&gt;3&lt;/sup&gt; - 1kb&lt;/p&gt;

&lt;p&gt;10&lt;sup&gt;6&lt;/sup&gt; - 1mb&lt;/p&gt;

&lt;p&gt;10&lt;sup&gt;9&lt;/sup&gt; - 1gb&lt;/p&gt;

&lt;p&gt;10&lt;sup&gt;12&lt;/sup&gt; - 1tb&lt;/p&gt;

&lt;p&gt;10&lt;sup&gt;15&lt;/sup&gt; - 1pb&lt;/p&gt;

&lt;p&gt;10&lt;sup&gt;18&lt;/sup&gt; - 1eb&lt;/p&gt;

&lt;h3&gt;
  
  
  Powers of two
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="nx"&gt;Power&lt;/span&gt;           &lt;span class="nx"&gt;Exact&lt;/span&gt; &lt;span class="nx"&gt;Value&lt;/span&gt;         &lt;span class="nx"&gt;Approx&lt;/span&gt; &lt;span class="nx"&gt;Value&lt;/span&gt;        &lt;span class="nx"&gt;Bytes&lt;/span&gt;
&lt;span class="o"&gt;---------------------------------------------------------------&lt;/span&gt;
&lt;span class="mi"&gt;7&lt;/span&gt;                             &lt;span class="mi"&gt;128&lt;/span&gt;
&lt;span class="mi"&gt;8&lt;/span&gt;                             &lt;span class="mi"&gt;256&lt;/span&gt;
&lt;span class="mi"&gt;10&lt;/span&gt;                           &lt;span class="mi"&gt;1024&lt;/span&gt;   &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="nx"&gt;thousand&lt;/span&gt;           &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="nx"&gt;KB&lt;/span&gt;
&lt;span class="mi"&gt;16&lt;/span&gt;                         &lt;span class="mi"&gt;65&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;536&lt;/span&gt;                       &lt;span class="mi"&gt;64&lt;/span&gt; &lt;span class="nx"&gt;KB&lt;/span&gt;
&lt;span class="mi"&gt;20&lt;/span&gt;                      &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;048&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;576&lt;/span&gt;   &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="nx"&gt;million&lt;/span&gt;            &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="nx"&gt;MB&lt;/span&gt;
&lt;span class="mi"&gt;30&lt;/span&gt;                  &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;073&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;741&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;824&lt;/span&gt;   &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="nx"&gt;billion&lt;/span&gt;            &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="nx"&gt;GB&lt;/span&gt;
&lt;span class="mi"&gt;32&lt;/span&gt;                  &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;294&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;967&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;296&lt;/span&gt;                        &lt;span class="mi"&gt;4&lt;/span&gt; &lt;span class="nx"&gt;GB&lt;/span&gt;
&lt;span class="mi"&gt;40&lt;/span&gt;              &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;099&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;511&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;627&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;776&lt;/span&gt;   &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="nx"&gt;trillion&lt;/span&gt;           &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="nx"&gt;TB&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Latency numbers every programmer should know
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="nx"&gt;Latency&lt;/span&gt; &lt;span class="nx"&gt;Comparison&lt;/span&gt; &lt;span class="nx"&gt;Numbers&lt;/span&gt;
&lt;span class="o"&gt;--------------------------&lt;/span&gt;
&lt;span class="nx"&gt;L1&lt;/span&gt; &lt;span class="nx"&gt;cache&lt;/span&gt; &lt;span class="nx"&gt;reference&lt;/span&gt;                           &lt;span class="mf"&gt;0.5&lt;/span&gt; &lt;span class="nx"&gt;ns&lt;/span&gt;
&lt;span class="nx"&gt;Branch&lt;/span&gt; &lt;span class="nx"&gt;mispredict&lt;/span&gt;                            &lt;span class="mi"&gt;5&lt;/span&gt;   &lt;span class="nx"&gt;ns&lt;/span&gt;
&lt;span class="nx"&gt;L2&lt;/span&gt; &lt;span class="nx"&gt;cache&lt;/span&gt; &lt;span class="nx"&gt;reference&lt;/span&gt;                           &lt;span class="mi"&gt;7&lt;/span&gt;   &lt;span class="nx"&gt;ns&lt;/span&gt;                      &lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="nx"&gt;L1&lt;/span&gt; &lt;span class="nx"&gt;cache&lt;/span&gt;
&lt;span class="nx"&gt;Mutex&lt;/span&gt; &lt;span class="nx"&gt;lock&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;unlock&lt;/span&gt;                           &lt;span class="mi"&gt;25&lt;/span&gt;   &lt;span class="nx"&gt;ns&lt;/span&gt;
&lt;span class="nx"&gt;Main&lt;/span&gt; &lt;span class="nx"&gt;memory&lt;/span&gt; &lt;span class="nx"&gt;reference&lt;/span&gt;                      &lt;span class="mi"&gt;100&lt;/span&gt;   &lt;span class="nx"&gt;ns&lt;/span&gt;                      &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="nx"&gt;L2&lt;/span&gt; &lt;span class="nx"&gt;cache&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="nx"&gt;L1&lt;/span&gt; &lt;span class="nx"&gt;cache&lt;/span&gt;
&lt;span class="nx"&gt;Compress&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="nx"&gt;K&lt;/span&gt; &lt;span class="nx"&gt;bytes&lt;/span&gt; &lt;span class="kd"&gt;with&lt;/span&gt; &lt;span class="nx"&gt;Zippy&lt;/span&gt;            &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;000&lt;/span&gt;   &lt;span class="nx"&gt;ns&lt;/span&gt;       &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="nx"&gt;us&lt;/span&gt;
&lt;span class="nx"&gt;Send&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="nx"&gt;KB&lt;/span&gt; &lt;span class="nx"&gt;bytes&lt;/span&gt; &lt;span class="nx"&gt;over&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="nx"&gt;Gbps&lt;/span&gt; &lt;span class="nx"&gt;network&lt;/span&gt;     &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;000&lt;/span&gt;   &lt;span class="nx"&gt;ns&lt;/span&gt;       &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="nx"&gt;us&lt;/span&gt;
&lt;span class="nx"&gt;Read&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt; &lt;span class="nx"&gt;KB&lt;/span&gt; &lt;span class="nx"&gt;randomly&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="nx"&gt;SSD&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;           &lt;span class="mi"&gt;150&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;000&lt;/span&gt;   &lt;span class="nx"&gt;ns&lt;/span&gt;      &lt;span class="mi"&gt;150&lt;/span&gt; &lt;span class="nx"&gt;us&lt;/span&gt;          &lt;span class="o"&gt;~&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="nx"&gt;GB&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;sec&lt;/span&gt; &lt;span class="nx"&gt;SSD&lt;/span&gt;
&lt;span class="nx"&gt;Read&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="nx"&gt;MB&lt;/span&gt; &lt;span class="nx"&gt;sequentially&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="nx"&gt;memory&lt;/span&gt;     &lt;span class="mi"&gt;250&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;000&lt;/span&gt;   &lt;span class="nx"&gt;ns&lt;/span&gt;      &lt;span class="mi"&gt;250&lt;/span&gt; &lt;span class="nx"&gt;us&lt;/span&gt;
&lt;span class="nx"&gt;Round&lt;/span&gt; &lt;span class="nx"&gt;trip&lt;/span&gt; &lt;span class="nx"&gt;within&lt;/span&gt; &lt;span class="nx"&gt;same&lt;/span&gt; &lt;span class="nx"&gt;datacenter&lt;/span&gt;      &lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;000&lt;/span&gt;   &lt;span class="nx"&gt;ns&lt;/span&gt;      &lt;span class="mi"&gt;500&lt;/span&gt; &lt;span class="nx"&gt;us&lt;/span&gt;
&lt;span class="nx"&gt;Read&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="nx"&gt;MB&lt;/span&gt; &lt;span class="nx"&gt;sequentially&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="nx"&gt;SSD&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;     &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;000&lt;/span&gt;   &lt;span class="nx"&gt;ns&lt;/span&gt;    &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;000&lt;/span&gt; &lt;span class="nx"&gt;us&lt;/span&gt;    &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="nx"&gt;ms&lt;/span&gt;  &lt;span class="o"&gt;~&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="nx"&gt;GB&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;sec&lt;/span&gt; &lt;span class="nx"&gt;SSD&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="nx"&gt;X&lt;/span&gt; &lt;span class="nx"&gt;memory&lt;/span&gt;
&lt;span class="nx"&gt;HDD&lt;/span&gt; &lt;span class="nx"&gt;seek&lt;/span&gt;                            &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;000&lt;/span&gt;   &lt;span class="nx"&gt;ns&lt;/span&gt;   &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;000&lt;/span&gt; &lt;span class="nx"&gt;us&lt;/span&gt;   &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="nx"&gt;ms&lt;/span&gt;  &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="nx"&gt;datacenter&lt;/span&gt; &lt;span class="nx"&gt;roundtrip&lt;/span&gt;
&lt;span class="nx"&gt;Read&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="nx"&gt;MB&lt;/span&gt; &lt;span class="nx"&gt;sequentially&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="nx"&gt;Gbps&lt;/span&gt;  &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;000&lt;/span&gt;   &lt;span class="nx"&gt;ns&lt;/span&gt;   &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;000&lt;/span&gt; &lt;span class="nx"&gt;us&lt;/span&gt;   &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="nx"&gt;ms&lt;/span&gt;  &lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="nx"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="nx"&gt;X&lt;/span&gt; &lt;span class="nx"&gt;SSD&lt;/span&gt;
&lt;span class="nx"&gt;Read&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="nx"&gt;MB&lt;/span&gt; &lt;span class="nx"&gt;sequentially&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="nx"&gt;HDD&lt;/span&gt;     &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;000&lt;/span&gt;   &lt;span class="nx"&gt;ns&lt;/span&gt;   &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;000&lt;/span&gt; &lt;span class="nx"&gt;us&lt;/span&gt;   &lt;span class="mi"&gt;30&lt;/span&gt; &lt;span class="nx"&gt;ms&lt;/span&gt; &lt;span class="mi"&gt;120&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="nx"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="nx"&gt;X&lt;/span&gt; &lt;span class="nx"&gt;SSD&lt;/span&gt;
&lt;span class="nx"&gt;Send&lt;/span&gt; &lt;span class="nx"&gt;packet&lt;/span&gt; &lt;span class="nx"&gt;CA&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Netherlands&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;CA&lt;/span&gt;    &lt;span class="mi"&gt;150&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;000&lt;/span&gt;   &lt;span class="nx"&gt;ns&lt;/span&gt;  &lt;span class="mi"&gt;150&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;000&lt;/span&gt; &lt;span class="nx"&gt;us&lt;/span&gt;  &lt;span class="mi"&gt;150&lt;/span&gt; &lt;span class="nx"&gt;ms&lt;/span&gt;

&lt;span class="nx"&gt;Notes&lt;/span&gt;
&lt;span class="o"&gt;-----&lt;/span&gt;
&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="nx"&gt;ns&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;sup&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;-&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/sup&amp;gt; second&lt;/span&gt;&lt;span class="err"&gt;s
&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="nx"&gt;us&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;sup&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;-&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/sup&amp;gt; seconds = 1,000 n&lt;/span&gt;&lt;span class="err"&gt;s
&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="nx"&gt;ms&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;sup&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;-&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/sup&amp;gt; seconds = 1,000 us = 1,000,000 n&lt;/span&gt;&lt;span class="err"&gt;s
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Handy metrics based on latency numbers
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="nx"&gt;Read&lt;/span&gt; &lt;span class="nx"&gt;sequentially&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="nx"&gt;HDD&lt;/span&gt; &lt;span class="nx"&gt;at&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt; &lt;span class="nx"&gt;MB&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt;
&lt;span class="nx"&gt;Read&lt;/span&gt; &lt;span class="nx"&gt;sequentially&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="nx"&gt;Gbps&lt;/span&gt; &lt;span class="nx"&gt;Ethernet&lt;/span&gt; &lt;span class="nx"&gt;at&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt; &lt;span class="nx"&gt;MB&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt;
&lt;span class="nx"&gt;Read&lt;/span&gt; &lt;span class="nx"&gt;sequentially&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="nx"&gt;SSD&lt;/span&gt; &lt;span class="nx"&gt;at&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="nx"&gt;GB&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt;
&lt;span class="nx"&gt;Read&lt;/span&gt; &lt;span class="nx"&gt;sequentially&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="nx"&gt;main&lt;/span&gt; &lt;span class="nx"&gt;memory&lt;/span&gt; &lt;span class="nx"&gt;at&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt; &lt;span class="nx"&gt;GB&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt;
&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt; &lt;span class="nx"&gt;world&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;wide&lt;/span&gt; &lt;span class="nx"&gt;round&lt;/span&gt; &lt;span class="nx"&gt;trips&lt;/span&gt; &lt;span class="nx"&gt;per&lt;/span&gt; &lt;span class="nx"&gt;second&lt;/span&gt;
&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;000&lt;/span&gt; &lt;span class="nx"&gt;round&lt;/span&gt; &lt;span class="nx"&gt;trips&lt;/span&gt; &lt;span class="nx"&gt;per&lt;/span&gt; &lt;span class="nx"&gt;second&lt;/span&gt; &lt;span class="nx"&gt;within&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="nx"&gt;center&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  How to estimate?
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Clarify number of daily users and number of total users.&lt;/li&gt;
&lt;li&gt;Ask about number of request from user on average. From here you can get QPS.&lt;/li&gt;
&lt;li&gt;Think about peak QPS, Reads and Writes.&lt;/li&gt;
&lt;li&gt;Assume (clarify) message size.&lt;/li&gt;
&lt;li&gt;Calculate throughput.&lt;/li&gt;
&lt;li&gt;If it's possible think about average data size. And calculate storage and cache here.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Estimation example
&lt;/h2&gt;

&lt;p&gt;You have 10M daily active users and each of them makes 100 read requests per day on average and new data is created 5 times per day.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;RPS&lt;/strong&gt; = 10M * 100 / 86400 = 12000 r/s&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;WPS&lt;/strong&gt; = 10M * 5 / 86400 = 580 w/s&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Peak QPS&lt;/strong&gt; = 24000 r/s&lt;/p&gt;

&lt;p&gt;Let's assume(clarify with the interviewer) that the average read message size is 50 bytes and the written message is 1kb.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Avg Read throughput&lt;/strong&gt; 50 * 12*10^3 = 60kb/s&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Avg Write throughput&lt;/strong&gt;  1kb * 580 = 580kb/s&lt;/p&gt;

&lt;p&gt;Here we can think about the type of data/metadata etc. Let's assume that you have clarified with your interviewer and the size of the new data is 1kb.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5 years storage&lt;/strong&gt; - 10M * 1kb  * 5 time per day * 365 days per year * 5 years = 91tb * 3 = 300tb with replicas.&lt;/p&gt;

&lt;p&gt;Lets assume that you have only 10% of hot data and you agreed to use 20% as cache.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cache storage&lt;/strong&gt; - 10% * 90tb * 20% * 3 replicas = 5.5 tb&lt;/p&gt;

</description>
      <category>interview</category>
      <category>systemdesign</category>
    </item>
  </channel>
</rss>
