<style type="text/css">a[data-mtli~="mtli_filesize85967kB"]:after {content:" (859.67 kB)"}a[data-mtli~="mtli_filesize36365kB"]:after {content:" (363.65 kB)"}</style>{"id":5753,"date":"2019-06-17T22:21:59","date_gmt":"2019-06-17T20:21:59","guid":{"rendered":"https:\/\/monodes.com\/predaelli\/?p=5753"},"modified":"2019-06-17T17:23:53","modified_gmt":"2019-06-17T15:23:53","slug":"computer-latency-1977-2017","status":"publish","type":"post","link":"https:\/\/monodes.com\/predaelli\/2019\/06\/17\/computer-latency-1977-2017\/","title":{"rendered":"Computer latency: 1977-2017"},"content":{"rendered":"<p><em><a href=\"http:\/\/danluu.com\/input-lag\/\">Computer latency: 1977-2017<\/a><\/em><\/p>\n<p><!--more--><!--nextpage--><\/p>\n<blockquote><p><strong>Computer latency: 1977-2017<\/strong><\/p>\n<hr \/>\n<p>I&#8217;ve had this nagging feeling that the computers I use today feel slower than the computers I used as a kid. As a rule, I don\u2019t trust this kind of feeling because human perception has been shown to be unreliable in empirical studies, so I carried around a high-speed camera and measured the response latency of devices I\u2019ve run into in the past few months. Here are the results:<\/p>\n<table>\n<tbody>\n<tr>\n<th>computer<\/th>\n<th>latency<br \/>\n(ms)<\/th>\n<th>year<\/th>\n<th>clock<\/th>\n<th># T<\/th>\n<\/tr>\n<tr>\n<td class=\"l\"><a href=\"https:\/\/en.wikipedia.org\/wiki\/Apple_IIe\">apple 2e<\/a><\/td>\n<td bgcolor=\"#ffffcc\">30<\/td>\n<td bgcolor=\"#54278f\"><span style=\"color: white;\">1983<\/span><\/td>\n<td bgcolor=\"#08306b\"><span style=\"color: white;\">1 MHz<\/span><\/td>\n<td bgcolor=\"#08306b\"><span style=\"color: white;\">3.5k<\/span><\/td>\n<\/tr>\n<tr>\n<td class=\"l\"><a href=\"https:\/\/www.amazon.com\/gp\/product\/B004GYBZBE\/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;tag=abroaview-20&amp;camp=1789&amp;creative=9325&amp;linkCode=as2&amp;creativeASIN=B004GYBZBE&amp;linkId=123a7b9e283914f633fbdc9b001f255b\">ti 99\/4a<\/a><\/td>\n<td bgcolor=\"#ffffcc\">40<\/td>\n<td bgcolor=\"#3f007d\"><span style=\"color: white;\">1981<\/span><\/td>\n<td bgcolor=\"#08519c\"><span style=\"color: white;\">3 MHz<\/span><\/td>\n<td bgcolor=\"#08306b\"><span style=\"color: white;\">8k<\/span><\/td>\n<\/tr>\n<tr>\n<td class=\"l\"><a href=\"https:\/\/www.amazon.com\/gp\/product\/B01FJLAITC\/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;tag=abroaview-20&amp;camp=1789&amp;creative=9325&amp;linkCode=as2&amp;creativeASIN=B01FJLAITC&amp;linkId=8ffc49fdd6c38da2429e5f3ab5527314\">custom haswell-e <i>165Hz<\/i><\/a><\/td>\n<td bgcolor=\"#ffeda0\">50<\/td>\n<td bgcolor=\"#efedf5\">2014<\/td>\n<td bgcolor=\"#deebf7\">3.5 GHz<\/td>\n<td bgcolor=\"#f7fbff\">2G<\/td>\n<\/tr>\n<tr>\n<td class=\"l\"><a href=\"https:\/\/en.wikipedia.org\/wiki\/Commodore_PET\">commodore pet 4016<\/a><\/td>\n<td bgcolor=\"#ffeda0\">60<\/td>\n<td bgcolor=\"#3f007d\"><span style=\"color: white;\">1977<\/span><\/td>\n<td bgcolor=\"#08306b\"><span style=\"color: white;\">1 MHz<\/span><\/td>\n<td bgcolor=\"#08306b\"><span style=\"color: white;\">3.5k<\/span><\/td>\n<\/tr>\n<tr>\n<td class=\"l\"><a href=\"https:\/\/en.wikipedia.org\/wiki\/SGI_Indy\">sgi indy<\/a><\/td>\n<td bgcolor=\"#ffeda0\">60<\/td>\n<td bgcolor=\"#807dba\">1993<\/td>\n<td bgcolor=\"#6baed6\">.1 GHz<\/td>\n<td bgcolor=\"#4292c6\">1.2M<\/td>\n<\/tr>\n<tr>\n<td class=\"l\"><a href=\"https:\/\/www.amazon.com\/gp\/product\/B01FJLAITC\/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;tag=abroaview-20&amp;camp=1789&amp;creative=9325&amp;linkCode=as2&amp;creativeASIN=B01FJLAITC&amp;linkId=8ffc49fdd6c38da2429e5f3ab5527314\">custom haswell-e <i>120Hz<\/i><\/a><\/td>\n<td bgcolor=\"#ffeda0\">60<\/td>\n<td bgcolor=\"#efedf5\">2014<\/td>\n<td bgcolor=\"#deebf7\">3.5 GHz<\/td>\n<td bgcolor=\"#f7fbff\">2G<\/td>\n<\/tr>\n<tr>\n<td class=\"l\"><a href=\"https:\/\/www.amazon.com\/gp\/product\/B01LWNVFIM\/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;tag=abroaview-20&amp;camp=1789&amp;creative=9325&amp;linkCode=as2&amp;creativeASIN=B01LWNVFIM&amp;linkId=d4f3e06001021e2bfc95eb2c8c3a9805\">thinkpad 13 <b>chromeos<\/b><\/a><\/td>\n<td bgcolor=\"#fed976\">70<\/td>\n<td bgcolor=\"#fcfbfd\">2017<\/td>\n<td bgcolor=\"#deebf7\">2.3 GHz<\/td>\n<td bgcolor=\"#deebf7\">1G<\/td>\n<\/tr>\n<tr>\n<td class=\"l\"><a href=\"https:\/\/www.amazon.com\/gp\/product\/B007O35FI8\/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;tag=abroaview-20&amp;camp=1789&amp;creative=9325&amp;linkCode=as2&amp;creativeASIN=B007O35FI8&amp;linkId=dc8b3670da16e98e718b157661037e4b\">imac g4 <b>os 9<\/b><\/a><\/td>\n<td bgcolor=\"#fed976\">70<\/td>\n<td bgcolor=\"#bcbddc\">2002<\/td>\n<td bgcolor=\"#c6dbef\">.8 GHz<\/td>\n<td bgcolor=\"#6baed6\">11M<\/td>\n<\/tr>\n<tr>\n<td class=\"l\"><a href=\"https:\/\/www.amazon.com\/gp\/product\/B01FJLAITC\/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;tag=abroaview-20&amp;camp=1789&amp;creative=9325&amp;linkCode=as2&amp;creativeASIN=B01FJLAITC&amp;linkId=8ffc49fdd6c38da2429e5f3ab5527314\">custom haswell-e <i>60Hz<\/i><\/a><\/td>\n<td bgcolor=\"#fed976\">80<\/td>\n<td bgcolor=\"#efedf5\">2014<\/td>\n<td bgcolor=\"#deebf7\">3.5 GHz<\/td>\n<td bgcolor=\"#f7fbff\">2G<\/td>\n<\/tr>\n<tr>\n<td class=\"l\"><a href=\"https:\/\/en.wikipedia.org\/wiki\/Macintosh_Color_Classic\">mac color classic<\/a><\/td>\n<td bgcolor=\"#feb24c\">90<\/td>\n<td bgcolor=\"#807dba\">1993<\/td>\n<td bgcolor=\"#2171b5\"><span style=\"color: white;\">16 MHz<\/span><\/td>\n<td bgcolor=\"#2171b5\"><span style=\"color: white;\">273k<\/span><\/td>\n<\/tr>\n<tr>\n<td class=\"l\"><a href=\"http:\/\/www.powerspec.com\/systems\/system_specs.phtml?selection=G405\">powerspec g405 <b>linux<\/b> <i>60Hz<\/i><\/a><\/td>\n<td bgcolor=\"#feb24c\">90<\/td>\n<td bgcolor=\"#fcfbfd\">2017<\/td>\n<td bgcolor=\"#f7fbff\">4.2 GHz<\/td>\n<td bgcolor=\"#f7fbff\">2G<\/td>\n<\/tr>\n<tr>\n<td class=\"l\"><a href=\"https:\/\/www.amazon.com\/gp\/product\/B0096VDM8G\/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;tag=abroaview-20&amp;camp=1789&amp;creative=9325&amp;linkCode=as2&amp;creativeASIN=B0096VDM8G&amp;linkId=d134e4e812fd9e68ddb6191e03f78a72\">macbook pro 2014<\/a><\/td>\n<td bgcolor=\"#feb24c\">100<\/td>\n<td bgcolor=\"#efedf5\">2014<\/td>\n<td bgcolor=\"#deebf7\">2.6 GHz<\/td>\n<td bgcolor=\"#deebf7\">700M<\/td>\n<\/tr>\n<tr>\n<td class=\"l\"><a href=\"https:\/\/www.amazon.com\/gp\/product\/B01LWNVFIM\/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;tag=abroaview-20&amp;camp=1789&amp;creative=9325&amp;linkCode=as2&amp;creativeASIN=B01LWNVFIM&amp;linkId=d4f3e06001021e2bfc95eb2c8c3a9805\">thinkpad 13 <b>linux chroot<\/b><\/a><\/td>\n<td bgcolor=\"#feb24c\">100<\/td>\n<td bgcolor=\"#fcfbfd\">2017<\/td>\n<td bgcolor=\"#deebf7\">2.3 GHz<\/td>\n<td bgcolor=\"#deebf7\">1G<\/td>\n<\/tr>\n<tr>\n<td class=\"l\"><a href=\"https:\/\/www.amazon.com\/gp\/product\/B072BDGLBC\/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;tag=abroaview-20&amp;camp=1789&amp;creative=9325&amp;linkCode=as2&amp;creativeASIN=B072BDGLBC&amp;linkId=b316192e2edacb439be22ef01a6bb779\">lenovo x1 carbon 4g <b>linux<\/b><\/a><\/td>\n<td bgcolor=\"#fd8d3c\">110<\/td>\n<td bgcolor=\"#efedf5\">2016<\/td>\n<td bgcolor=\"#deebf7\">2.6 GHz<\/td>\n<td bgcolor=\"#deebf7\">1G<\/td>\n<\/tr>\n<tr>\n<td class=\"l\"><a href=\"https:\/\/www.amazon.com\/gp\/product\/B007O35FI8\/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;tag=abroaview-20&amp;camp=1789&amp;creative=9325&amp;linkCode=as2&amp;creativeASIN=B007O35FI8&amp;linkId=dc8b3670da16e98e718b157661037e4b\">imac g4 <b>os x<\/b><\/a><\/td>\n<td bgcolor=\"#fd8d3c\">120<\/td>\n<td bgcolor=\"#bcbddc\">2002<\/td>\n<td bgcolor=\"#c6dbef\">.8 GHz<\/td>\n<td bgcolor=\"#6baed6\">11M<\/td>\n<\/tr>\n<tr>\n<td class=\"l\"><a href=\"https:\/\/www.amazon.com\/gp\/product\/B01FJLAITC\/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;tag=abroaview-20&amp;camp=1789&amp;creative=9325&amp;linkCode=as2&amp;creativeASIN=B01FJLAITC&amp;linkId=8ffc49fdd6c38da2429e5f3ab5527314\">custom haswell-e <i>24Hz<\/i><\/a><\/td>\n<td bgcolor=\"#fc4e2a\">140<\/td>\n<td bgcolor=\"#efedf5\">2014<\/td>\n<td bgcolor=\"#deebf7\">3.5 GHz<\/td>\n<td bgcolor=\"#f7fbff\">2G<\/td>\n<\/tr>\n<tr>\n<td class=\"l\"><a href=\"https:\/\/www.amazon.com\/gp\/product\/B072BDGLBC\/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;tag=abroaview-20&amp;camp=1789&amp;creative=9325&amp;linkCode=as2&amp;creativeASIN=B072BDGLBC&amp;linkId=b316192e2edacb439be22ef01a6bb779\">lenovo x1 carbon 4g <b>win<\/b><\/a><\/td>\n<td bgcolor=\"#e31a1c\">150<\/td>\n<td bgcolor=\"#efedf5\">2016<\/td>\n<td bgcolor=\"#deebf7\">2.6 GHz<\/td>\n<td bgcolor=\"#deebf7\">1G<\/td>\n<\/tr>\n<tr>\n<td class=\"l\"><a href=\"https:\/\/en.wikipedia.org\/wiki\/NeXTcube\">next cube<\/a><\/td>\n<td bgcolor=\"#e31a1c\">150<\/td>\n<td bgcolor=\"#6a51a3\"><span style=\"color: white;\">1988<\/span><\/td>\n<td bgcolor=\"#4292c6\">25 MHz<\/td>\n<td bgcolor=\"#4292c6\">1.2M<\/td>\n<\/tr>\n<tr>\n<td class=\"l\"><a href=\"http:\/\/www.powerspec.com\/systems\/system_specs.phtml?selection=G405\">powerspec g405 <b>linux<\/b><\/a><\/td>\n<td bgcolor=\"#bd0026\">170<\/td>\n<td bgcolor=\"#fcfbfd\">2017<\/td>\n<td bgcolor=\"#f7fbff\">4.2 GHz<\/td>\n<td bgcolor=\"#f7fbff\">2G<\/td>\n<\/tr>\n<tr>\n<td class=\"l\" bgcolor=\"silver\">packet around the world<\/td>\n<td bgcolor=\"silver\">190<\/td>\n<\/tr>\n<tr>\n<td class=\"l\"><a href=\"http:\/\/www.powerspec.com\/systems\/system_specs.phtml?selection=G405\">powerspec g405 <b>win<\/b><\/a><\/td>\n<td bgcolor=\"black\"><span style=\"color: white;\">200<\/span><\/td>\n<td bgcolor=\"#fcfbfd\">2017<\/td>\n<td bgcolor=\"#f7fbff\">4.2 GHz<\/td>\n<td bgcolor=\"#f7fbff\">2G<\/td>\n<\/tr>\n<tr>\n<td class=\"l\"><a href=\"https:\/\/en.wikipedia.org\/wiki\/Symbolics\">symbolics 3620<\/a><\/td>\n<td bgcolor=\"black\"><span style=\"color: white;\">300<\/span><\/td>\n<td bgcolor=\"#54278f\"><span style=\"color: white;\">1986<\/span><\/td>\n<td bgcolor=\"#08519c\"><span style=\"color: white;\">5 MHz<\/span><\/td>\n<td bgcolor=\"#2171b5\"><span style=\"color: white;\">390k<\/span><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>These are tests of the latency between a keypress and the display of a character in a terminal (see appendix for more details). The results are sorted from quickest to slowest. In the latency column, the background goes from green to yellow to red to black as devices get slower and the background gets darker as devices get slower. No devices are green. When multiple OSes were tested on the same machine, the os is <b>in bold<\/b>. When multiple refresh rates were tested on the same machine, the refresh rate is <i>in italics<\/i>.<\/p>\n<p>In the year column, the background gets darker and purple-er as devices get older. If older devices were slower, we\u2019d see the year column get darker as we read down the chart.<\/p>\n<p>The next two columns show the clock speed and number of transistors in the processor. Smaller numbers are darker and blue-er. As above, if slower clocked and smaller chips correlated with longer latency, the columns would get darker as we go down the table, but it, if anything, seems to be the other way around.<\/p>\n<p>For reference, the latency of a packet going around the world through fiber from NYC back to NYC via <a href=\"https:\/\/www.extremetech.com\/extreme\/122989-1-5-billion-the-cost-of-cutting-london-toyko-latency-by-60ms\">Tokyo and London<\/a> is inserted in the table.<\/p>\n<p>If we look at overall results, the fastest machines are ancient. Newer machines are all over the place. Fancy gaming rigs with unusually high refresh-rate displays are almost competitive with machines from the late 70s and early 80s, but \u201cnormal\u201d modern computers can\u2019t compete with thirty to forty year old machines.<\/p>\n<p>We can also look at mobile devices. In this case, we\u2019ll look at scroll latency in the browser:<\/p>\n<table>\n<tbody>\n<tr>\n<th>device<\/th>\n<th>latency<br \/>\n(ms)<\/th>\n<th>year<\/th>\n<\/tr>\n<tr>\n<td class=\"l\"><a href=\"https:\/\/www.amazon.com\/gp\/product\/B072V4HK9F\/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;tag=abroaview-20&amp;camp=1789&amp;creative=9325&amp;linkCode=as2&amp;creativeASIN=B072V4HK9F&amp;linkId=5679f47f9a699d00e721eff9592bed11\">ipad pro 10.5&#8243; pencil<\/a><\/td>\n<td bgcolor=\"#ffffcc\">30<\/td>\n<td bgcolor=\"#fcfbfd\">2017<\/td>\n<\/tr>\n<tr>\n<td class=\"l\"><a href=\"https:\/\/www.amazon.com\/gp\/product\/B072V4HK9F\/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;tag=abroaview-20&amp;camp=1789&amp;creative=9325&amp;linkCode=as2&amp;creativeASIN=B072V4HK9F&amp;linkId=5679f47f9a699d00e721eff9592bed11\">ipad pro 10.5&#8243;<\/a><\/td>\n<td bgcolor=\"#fed976\">70<\/td>\n<td bgcolor=\"#fcfbfd\">2017<\/td>\n<\/tr>\n<tr>\n<td class=\"l\"><a href=\"https:\/\/www.amazon.com\/gp\/product\/B006FMDVDK\/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;tag=abroaview-20&amp;camp=1789&amp;creative=9325&amp;linkCode=as2&amp;creativeASIN=B006FMDVDK&amp;linkId=9ad1ee1c78ed24a00d7aeaa7acba466b\">iphone 4s<\/a><\/td>\n<td bgcolor=\"#fed976\">70<\/td>\n<td bgcolor=\"#dadaeb\">2011<\/td>\n<\/tr>\n<tr>\n<td class=\"l\"><a href=\"https:\/\/www.amazon.com\/gp\/product\/B00YD547Q6\/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;tag=abroaview-20&amp;camp=1789&amp;creative=9325&amp;linkCode=as2&amp;creativeASIN=B00YD547Q6&amp;linkId=8760bcadabac2a1a34059f5695523d18\">iphone 6s<\/a><\/td>\n<td bgcolor=\"#fed976\">70<\/td>\n<td bgcolor=\"#efedf5\">2015<\/td>\n<\/tr>\n<tr>\n<td class=\"l\"><a href=\"https:\/\/www.amazon.com\/gp\/product\/B008VUNRZQ\/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;tag=abroaview-20&amp;camp=1789&amp;creative=9325&amp;linkCode=as2&amp;creativeASIN=B008VUNRZQ&amp;linkId=f9f973947891d7eb01a251146c8a17ed\">iphone 3gs<\/a><\/td>\n<td bgcolor=\"#fed976\">70<\/td>\n<td bgcolor=\"#dadaeb\">2009<\/td>\n<\/tr>\n<tr>\n<td class=\"l\"><a href=\"https:\/\/www.amazon.com\/gp\/product\/B075QN8NDJ\/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;tag=abroaview-20&amp;camp=1789&amp;creative=9325&amp;linkCode=as2&amp;creativeASIN=B075QN8NDJ&amp;linkId=17f3a63a6d672e453c1bb28c26f1e680\">iphone x<\/a><\/td>\n<td bgcolor=\"#fed976\">80<\/td>\n<td bgcolor=\"#fcfbfd\">2017<\/td>\n<\/tr>\n<tr>\n<td class=\"l\"><a href=\"https:\/\/www.amazon.com\/gp\/product\/B075QJSQLT\/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;tag=abroaview-20&amp;camp=1789&amp;creative=9325&amp;linkCode=as2&amp;creativeASIN=B075QJSQLT&amp;linkId=0e9df41aaed6dc80988793dcbc08a175\">iphone 8<\/a><\/td>\n<td bgcolor=\"#fed976\">80<\/td>\n<td bgcolor=\"#fcfbfd\">2017<\/td>\n<\/tr>\n<tr>\n<td class=\"l\"><a href=\"https:\/\/www.amazon.com\/gp\/product\/B0743HK992\/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;tag=abroaview-20&amp;camp=1789&amp;creative=9325&amp;linkCode=as2&amp;creativeASIN=B0743HK992&amp;linkId=ad1f03111643f0e52f245f120f8efb2b\">iphone 7<\/a><\/td>\n<td bgcolor=\"#fed976\">80<\/td>\n<td bgcolor=\"#efedf5\">2016<\/td>\n<\/tr>\n<tr>\n<td class=\"l\"><a href=\"https:\/\/www.amazon.com\/gp\/product\/B00YD545CC\/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;tag=abroaview-20&amp;camp=1789&amp;creative=9325&amp;linkCode=as2&amp;creativeASIN=B00YD545CC&amp;linkId=cc899d2e45b87f032042af8eb666cef1\">iphone 6<\/a><\/td>\n<td bgcolor=\"#fed976\">80<\/td>\n<td bgcolor=\"#efedf5\">2014<\/td>\n<\/tr>\n<tr>\n<td class=\"l\"><a href=\"https:\/\/www.amazon.com\/gp\/product\/B077629NJ2\/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;tag=abroaview-20&amp;camp=1789&amp;creative=9325&amp;linkCode=as2&amp;creativeASIN=B077629NJ2&amp;linkId=cadd23b2ef84a2b9c6abe268754e6cb4\">gameboy color<\/a><\/td>\n<td bgcolor=\"#fed976\">80<\/td>\n<td bgcolor=\"#9e9ac8\">1998<\/td>\n<\/tr>\n<tr>\n<td class=\"l\"><a href=\"https:\/\/www.amazon.com\/gp\/product\/B00WZR5URO\/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;tag=abroaview-20&amp;camp=1789&amp;creative=9325&amp;linkCode=as2&amp;creativeASIN=B00WZR5URO&amp;linkId=f781b3a6200f81f6a0137a69ab1b4c0f\">iphone 5<\/a><\/td>\n<td bgcolor=\"#feb24c\">90<\/td>\n<td bgcolor=\"#efedf5\">2012<\/td>\n<\/tr>\n<tr>\n<td class=\"l\"><a href=\"https:\/\/www.amazon.com\/gp\/product\/B00CES5B96\/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;tag=abroaview-20&amp;camp=1789&amp;creative=9325&amp;linkCode=as2&amp;creativeASIN=B00CES5B96&amp;linkId=fab4357d277c9716f691d15431aace90\">blackberry q10<\/a><\/td>\n<td bgcolor=\"#feb24c\">100<\/td>\n<td bgcolor=\"#efedf5\">2013<\/td>\n<\/tr>\n<tr>\n<td class=\"l\"><a href=\"https:\/\/www.amazon.com\/gp\/product\/B01IVV7W8M\/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;tag=abroaview-20&amp;camp=1789&amp;creative=9325&amp;linkCode=as2&amp;creativeASIN=B01IVV7W8M&amp;linkId=be83bfddcd1ff8029f548810b405a281\">huawei honor 8<\/a><\/td>\n<td bgcolor=\"#fd8d3c\">110<\/td>\n<td bgcolor=\"#efedf5\">2016<\/td>\n<\/tr>\n<tr>\n<td class=\"l\"><a href=\"https:\/\/www.amazon.com\/gp\/product\/B0766TPHSH\/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;tag=abroaview-20&amp;camp=1789&amp;creative=9325&amp;linkCode=as2&amp;creativeASIN=B0766TPHSH&amp;linkId=774b61b9fe3692df21821844dfedc18b\">google pixel 2 xl<\/a><\/td>\n<td bgcolor=\"#fd8d3c\">110<\/td>\n<td bgcolor=\"#fcfbfd\">2017<\/td>\n<\/tr>\n<tr>\n<td class=\"l\"><a href=\"https:\/\/www.amazon.com\/gp\/product\/B01F48QLFA\/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;tag=abroaview-20&amp;camp=1789&amp;creative=9325&amp;linkCode=as2&amp;creativeASIN=B01F48QLFA&amp;linkId=00e8a7505d84e546c50e3d8761944d05\">galaxy s7<\/a><\/td>\n<td bgcolor=\"#fd8d3c\">120<\/td>\n<td bgcolor=\"#efedf5\">2016<\/td>\n<\/tr>\n<tr>\n<td class=\"l\"><a href=\"https:\/\/www.amazon.com\/gp\/product\/B00TJ4FFHQ\/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;tag=abroaview-20&amp;camp=1789&amp;creative=9325&amp;linkCode=as2&amp;creativeASIN=B00TJ4FFHQ&amp;linkId=f74214ac520214bcb199ce2710ed470f\">galaxy note 3<\/a><\/td>\n<td bgcolor=\"#fd8d3c\">120<\/td>\n<td bgcolor=\"#efedf5\">2016<\/td>\n<\/tr>\n<tr>\n<td class=\"l\"><a href=\"https:\/\/www.amazon.com\/gp\/product\/B00EP2CLII\/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;tag=abroaview-20&amp;camp=1789&amp;creative=9325&amp;linkCode=as2&amp;creativeASIN=B00EP2CLII&amp;linkId=f3ad24ebb82fb4b8282ae94deede1319\">moto x<\/a><\/td>\n<td bgcolor=\"#fd8d3c\">120<\/td>\n<td bgcolor=\"#efedf5\">2013<\/td>\n<\/tr>\n<tr>\n<td class=\"l\"><a href=\"https:\/\/www.amazon.com\/gp\/product\/B076KTGJPG\/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;tag=abroaview-20&amp;camp=1789&amp;creative=9325&amp;linkCode=as2&amp;creativeASIN=B076KTGJPG&amp;linkId=9164d7895c51ee31fd8db00c3d1597e7\">nexus 5x<\/a><\/td>\n<td bgcolor=\"#fd8d3c\">120<\/td>\n<td bgcolor=\"#efedf5\">2015<\/td>\n<\/tr>\n<tr>\n<td class=\"l\"><a href=\"https:\/\/www.amazon.com\/gp\/product\/B01MXR13TZ\/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;tag=abroaview-20&amp;camp=1789&amp;creative=9325&amp;linkCode=as2&amp;creativeASIN=B01MXR13TZ&amp;linkId=924c9f9d8f2413c64f0f295d505f09da\">oneplus 3t<\/a><\/td>\n<td bgcolor=\"#fc4e2a\">130<\/td>\n<td bgcolor=\"#efedf5\">2016<\/td>\n<\/tr>\n<tr>\n<td class=\"l\"><a href=\"https:\/\/www.amazon.com\/gp\/product\/B075QBLBN8\/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;tag=abroaview-20&amp;camp=1789&amp;creative=9325&amp;linkCode=as2&amp;creativeASIN=B075QBLBN8&amp;linkId=439fabf5b71beb2b4820618432366e72\">blackberry key one<\/a><\/td>\n<td bgcolor=\"#fc4e2a\">130<\/td>\n<td bgcolor=\"#fcfbfd\">2017<\/td>\n<\/tr>\n<tr>\n<td class=\"l\"><a href=\"https:\/\/www.amazon.com\/gp\/product\/B016QP7SKC\/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;tag=abroaview-20&amp;camp=1789&amp;creative=9325&amp;linkCode=as2&amp;creativeASIN=B016QP7SKC&amp;linkId=207d8847bf6e6740694ea85cc97a8363\">moto e (2g)<\/a><\/td>\n<td bgcolor=\"#fc4e2a\">140<\/td>\n<td bgcolor=\"#efedf5\">2015<\/td>\n<\/tr>\n<tr>\n<td class=\"l\"><a href=\"https:\/\/www.amazon.com\/gp\/product\/B071YC3G5V\/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;tag=abroaview-20&amp;camp=1789&amp;creative=9325&amp;linkCode=as2&amp;creativeASIN=B071YC3G5V&amp;linkId=d5c16509db8a503bfd0e9fa4480bd92f\">moto g4 play<\/a><\/td>\n<td bgcolor=\"#fc4e2a\">140<\/td>\n<td bgcolor=\"#fcfbfd\">2017<\/td>\n<\/tr>\n<tr>\n<td class=\"l\"><a href=\"https:\/\/www.amazon.com\/gp\/product\/B01DZJFYLC\/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;tag=abroaview-20&amp;camp=1789&amp;creative=9325&amp;linkCode=as2&amp;creativeASIN=B01DZJFYLC&amp;linkId=d173832b8e78e184d0ec5f801c582403\">moto g4 plus<\/a><\/td>\n<td bgcolor=\"#fc4e2a\">140<\/td>\n<td bgcolor=\"#efedf5\">2016<\/td>\n<\/tr>\n<tr>\n<td class=\"l\"><a href=\"https:\/\/www.amazon.com\/gp\/product\/B0731KJVGG\/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;tag=abroaview-20&amp;camp=1789&amp;creative=9325&amp;linkCode=as2&amp;creativeASIN=B0731KJVGG&amp;linkId=a52d46d36b6136641937b82c5f99fa1d\">google pixel<\/a><\/td>\n<td bgcolor=\"#fc4e2a\">140<\/td>\n<td bgcolor=\"#efedf5\">2016<\/td>\n<\/tr>\n<tr>\n<td class=\"l\"><a href=\"https:\/\/www.amazon.com\/gp\/product\/B00N3FSWG8\/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;tag=abroaview-20&amp;camp=1789&amp;creative=9325&amp;linkCode=as2&amp;creativeASIN=B00N3FSWG8&amp;linkId=a4df2be4f14002eed6fdbd267b8dca91\">samsung galaxy avant<\/a><\/td>\n<td bgcolor=\"#e31a1c\">150<\/td>\n<td bgcolor=\"#efedf5\">2014<\/td>\n<\/tr>\n<tr>\n<td class=\"l\"><a href=\"https:\/\/www.amazon.com\/gp\/product\/B01LZ8516T\/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;tag=abroaview-20&amp;camp=1789&amp;creative=9325&amp;linkCode=as2&amp;creativeASIN=B01LZ8516T&amp;linkId=16070e26fe5b1eee184b3fcfa6a7f373\">asus zenfone3 max<\/a><\/td>\n<td bgcolor=\"#e31a1c\">150<\/td>\n<td bgcolor=\"#efedf5\">2016<\/td>\n<\/tr>\n<tr>\n<td class=\"l\"><a href=\"https:\/\/www.amazon.com\/gp\/product\/B01LACBMV2\/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;tag=abroaview-20&amp;camp=1789&amp;creative=9325&amp;linkCode=as2&amp;creativeASIN=B01LACBMV2&amp;linkId=6a38fa7701b76f17fc1ba183e2bac551\">sony xperia z5 compact<\/a><\/td>\n<td bgcolor=\"#e31a1c\">150<\/td>\n<td bgcolor=\"#efedf5\">2015<\/td>\n<\/tr>\n<tr>\n<td class=\"l\"><a href=\"https:\/\/www.amazon.com\/gp\/product\/B00F618DXE\/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;tag=abroaview-20&amp;camp=1789&amp;creative=9325&amp;linkCode=as2&amp;creativeASIN=B00F618DXE&amp;linkId=481f35c95f57b730ab417f680ff1cdf3\">htc one m4<\/a><\/td>\n<td bgcolor=\"#e31a1c\">160<\/td>\n<td bgcolor=\"#efedf5\">2013<\/td>\n<\/tr>\n<tr>\n<td class=\"l\"><a href=\"https:\/\/www.amazon.com\/gp\/product\/B00UZ7QJ6W\/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;tag=abroaview-20&amp;camp=1789&amp;creative=9325&amp;linkCode=as2&amp;creativeASIN=B00UZ7QJ6W&amp;linkId=a37479092aca4085fc7bee582232fbfe\">galaxy s4 mini<\/a><\/td>\n<td bgcolor=\"#bd0026\">170<\/td>\n<td bgcolor=\"#efedf5\">2013<\/td>\n<\/tr>\n<tr>\n<td class=\"l\"><a href=\"https:\/\/www.amazon.com\/gp\/product\/B072K1BY62\/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;tag=abroaview-20&amp;camp=1789&amp;creative=9325&amp;linkCode=as2&amp;creativeASIN=B072K1BY62&amp;linkId=7a9dc6d3a3400a24cba9141b09d85f32\">lg k4<\/a><\/td>\n<td bgcolor=\"#800026\"><span style=\"color: white;\">180<\/span><\/td>\n<td bgcolor=\"#efedf5\">2016<\/td>\n<\/tr>\n<tr>\n<td class=\"l\" bgcolor=\"silver\">packet<\/td>\n<td bgcolor=\"silver\">190<\/td>\n<\/tr>\n<tr>\n<td class=\"l\"><a href=\"https:\/\/www.amazon.com\/gp\/product\/B0073YBGCC\/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;tag=abroaview-20&amp;camp=1789&amp;creative=9325&amp;linkCode=as2&amp;creativeASIN=B0073YBGCC&amp;linkId=75785e57c1c5a2318dcd95a6178af60c\">htc rezound<\/a><\/td>\n<td bgcolor=\"black\"><span style=\"color: white;\">240<\/span><\/td>\n<td bgcolor=\"#dadaeb\">2011<\/td>\n<\/tr>\n<tr>\n<td class=\"l\"><a href=\"https:\/\/en.wikipedia.org\/wiki\/Pilot_1000\">palm pilot 1000<\/a><\/td>\n<td bgcolor=\"black\"><span style=\"color: white;\">490<\/span><\/td>\n<td bgcolor=\"#807dba\">1996<\/td>\n<\/tr>\n<tr>\n<td class=\"l\"><a href=\"https:\/\/en.wikipedia.org\/wiki\/Amazon_Kindle\">kindle oasis 2<\/a><\/td>\n<td bgcolor=\"black\"><span style=\"color: white;\">570<\/span><\/td>\n<td bgcolor=\"#fcfbfd\">2017<\/td>\n<\/tr>\n<tr>\n<td class=\"l\"><a href=\"https:\/\/en.wikipedia.org\/wiki\/Amazon_Kindle\">kindle paperwhite 3<\/a><\/td>\n<td bgcolor=\"black\"><span style=\"color: white;\">630<\/span><\/td>\n<td bgcolor=\"#efedf5\">2015<\/td>\n<\/tr>\n<tr>\n<td class=\"l\"><a href=\"https:\/\/en.wikipedia.org\/wiki\/Amazon_Kindle\">kindle 4<\/a><\/td>\n<td bgcolor=\"black\"><span style=\"color: white;\">860<\/span><\/td>\n<td bgcolor=\"#dadaeb\">2011<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>As above, the results are sorted by latency and color-coded from green to yellow to red to black as devices get slower. Also as above, the year gets purple-er (and darker) as the device gets older.<\/p>\n<p>If we exclude the <code class=\"\" data-line=\"\">game boy color<\/code>, which is a different class of device than the rest, all of the quickest devices are Apple phones or tablets. The next quickest device is the <code class=\"\" data-line=\"\">blackberry q10<\/code>. Although we don\u2019t have enough data to really tell why the <code class=\"\" data-line=\"\">blackberry q10<\/code> is unusually quick for a non-Apple device, one plausible guess is that it\u2019s helped by having actual buttons, which are easier to implement with low latency than a touchscreen. The other two devices with actual buttons are the <code class=\"\" data-line=\"\">gameboy color<\/code> and the <code class=\"\" data-line=\"\">kindle 4<\/code>.<\/p>\n<p>After that <code class=\"\" data-line=\"\">iphones<\/code> and non-kindle button devices, we have a variety of Android devices of various ages. At the bottom, we have the ancient <code class=\"\" data-line=\"\">palm pilot 1000<\/code> followed by the kindles. The <code class=\"\" data-line=\"\">palm<\/code> is hamstrung by a touchscreen and display created in an era with much slower touchscreen technology and the <code class=\"\" data-line=\"\">kindles<\/code> use <a href=\"https:\/\/en.wikipedia.org\/wiki\/E_Ink\">e-ink<\/a> displays, which are much slower than the displays used on modern phones, so it\u2019s not surprising to see those devices at the bottom.<\/p>\n<h3 id=\"why-is-the-apple-2e-so-fast\">Why is the <code class=\"\" data-line=\"\">apple 2e<\/code> so fast?<\/h3>\n<p>Compared to a modern computer that\u2019s not the latest <code class=\"\" data-line=\"\">ipad pro<\/code>, the <code class=\"\" data-line=\"\">apple 2<\/code> has significant advantages on both the input and the output, and it also has an advantage between the input and the output for all but the most carefully written code since the <code class=\"\" data-line=\"\">apple 2<\/code> doesn\u2019t have to deal with context switches, buffers involved in handoffs between different processes, etc.<\/p>\n<p>On the input, if we look at modern keyboards, it\u2019s common to see them scan their inputs at <code class=\"\" data-line=\"\">100 Hz<\/code> to <code class=\"\" data-line=\"\">200 Hz<\/code> (e.g., <a href=\"https:\/\/github.com\/benblazak\/ergodox-firmware\">the ergodox claims to scan at <code class=\"\" data-line=\"\">167 Hz<\/code><\/a>). By comparison, the <code class=\"\" data-line=\"\">apple 2e<\/code> effectively scans at <code class=\"\" data-line=\"\">556 Hz<\/code>. See appendix for details.<\/p>\n<p>If we look at the other end of the pipeline, the display, we can also find latency bloat there. I have a display that advertises <code class=\"\" data-line=\"\">1 ms<\/code> switching on the box, but if we look at how long it takes for the display to actually show a character from when you can first see the trace of it on the screen until the character is solid, it can easily be <code class=\"\" data-line=\"\">10 ms<\/code>. You can even see this effect with some high-refresh-rate displays that are sold on their allegedly good latency.<\/p>\n<p>At <code class=\"\" data-line=\"\">144 Hz<\/code>, each frame takes <code class=\"\" data-line=\"\">7 ms<\/code>. A change to the screen will have <code class=\"\" data-line=\"\">0 ms<\/code> to <code class=\"\" data-line=\"\">7 ms<\/code> of extra latency as it waits for the next frame boundary before getting rendered (on average,we expect half of the maximum latency, or <code class=\"\" data-line=\"\">3.5 ms<\/code>). On top of that, even though my display at home advertises a <code class=\"\" data-line=\"\">1 ms<\/code> switching time, it actually appears to take <code class=\"\" data-line=\"\">10 ms<\/code> to fully change color once the display has started changing color. When we add up the latency from waiting for the next frame to the latency of an actual color change, we get an expected latency of <code class=\"\" data-line=\"\">7\/2 + 10 = 13.5ms<\/code><\/p>\n<p>With the old CRT in the <code class=\"\" data-line=\"\">apple 2e<\/code>, we\u2019d expect half of a <code class=\"\" data-line=\"\">60 Hz<\/code> refresh (<code class=\"\" data-line=\"\">16.7 ms \/ 2<\/code>) plus a negligible delay, or <code class=\"\" data-line=\"\">8.3 ms<\/code>. That\u2019s hard to beat today: a state of the art \u201cgaming monitor\u201d can get the total display latency down into the same range, but in terms of marketshare, very few people have such displays, and even displays that are advertised as being fast aren\u2019t always actually fast.<\/p>\n<h3 id=\"ios-rendering-pipeline\">iOS rendering pipeline<\/h3>\n<p>If we look at what\u2019s happening between the input and the output, the differences between a modern system and an <code class=\"\" data-line=\"\">apple 2e<\/code> are too many to describe without writing an entire book. To get a sense of the situation in modern machines, here\u2019s former iOS\/UIKit engineer <a href=\"https:\/\/andymatuschak.org\/\">Andy Matuschak<\/a>\u2019s high-level sketch of what happens on iOS, which he says should be presented with the disclaimer that \u201cthis is my out of date memory of out of date information\u201d:<\/p>\n<ul>\n<li>hardware has its own scanrate (e.g. <code class=\"\" data-line=\"\">120 Hz<\/code> for recent touch panels), so that can introduce up to <code class=\"\" data-line=\"\">8 ms<\/code> latency<\/li>\n<li>events are delivered to the kernel through firmware; this is relatively quick but system scheduling concerns may introduce a couple <code class=\"\" data-line=\"\">ms<\/code> here<\/li>\n<li>the kernel delivers those events to privileged subscribers (here, <code class=\"\" data-line=\"\">backboardd<\/code>) over a mach port; more scheduling loss possible<\/li>\n<li><code class=\"\" data-line=\"\">backboardd<\/code> must determine which process should receive the event; this requires taking a lock against the window server, which shares that information (a trip back into the kernel, more scheduling delay)<\/li>\n<li><code class=\"\" data-line=\"\">backboardd<\/code> sends that event to the process in question; more scheduling delay possible before it is processed<\/li>\n<li>those events are only dequeued on the main thread; something else may be happening on the main thread (e.g. as result of a timer or network activity), so some more latency may result, depending on that work<\/li>\n<li>UIKit introduced <code class=\"\" data-line=\"\">1-2 ms<\/code> event processing overhead, CPU-bound<\/li>\n<li>application decides what to do with the event; apps are poorly written, so usually this takes many <code class=\"\" data-line=\"\">ms<\/code>. the consequences are batched up in a data-driven update which is sent to the render server over IPC\n<ul>\n<li>If the app needs a new shared-memory video buffer as a consequence of the event, which will happen anytime something non-trivial is happening, that will require round-trip IPC to the render server; more scheduling delays<\/li>\n<li>(trivial changes are things which the render server can incorporate itself, like affine transformation changes or color changes to layers; non-trivial changes include anything that has to do with text, most raster and vector operations)<\/li>\n<li>These kinds of updates often end up being triple-buffered: the GPU might be using one buffer to render right now; the render server might have another buffer queued up for its next frame; and you want to draw into another. More (cross-process) locking here; more trips into kernel-land.<\/li>\n<\/ul>\n<\/li>\n<li>the render server applies those updates to its render tree (a few <code class=\"\" data-line=\"\">ms<\/code>)<\/li>\n<li>every <code class=\"\" data-line=\"\">N Hz<\/code>, the render tree is flushed to the GPU, which is asked to fill a video buffer\n<ul>\n<li>Actually, though, there\u2019s often triple-buffering for the screen buffer, for the same reason I described above: the GPU\u2019s drawing into one now; another might be being read from in preparation for another frame<\/li>\n<\/ul>\n<\/li>\n<li>every <code class=\"\" data-line=\"\">N Hz<\/code>, that video buffer is swapped with another video buffer, and the display is driven directly from that memory\n<ul>\n<li>(this <code class=\"\" data-line=\"\">N Hz<\/code> isn\u2019t necessarily ideally aligned with the preceding step\u2019s <code class=\"\" data-line=\"\">N Hz<\/code>)<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>Andy says \u201cthe actual amount of <em>work<\/em> happening here is typically quite small. A few <code class=\"\" data-line=\"\">ms<\/code> of CPU time. Key overhead comes from:\u201d<\/p>\n<ul>\n<li>periodic scanrates (input device, render server, display) imperfectly aligned<\/li>\n<li>many handoffs across process boundaries, each an opportunity for something else to get scheduled instead of the consequences of the input event<\/li>\n<li>lots of locking, especially across process boundaries, necessitating trips into kernel-land<\/li>\n<\/ul>\n<p>By comparison, on the Apple 2e, there basically aren\u2019t handoffs, locks, or process boundaries. Some very simple code runs and writes the result to the display memory, which causes the display to get updated on the next scan.<\/p>\n<h3 id=\"refresh-rate-vs-latency\">Refresh rate vs. latency<\/h3>\n<p>One thing that\u2019s curious about the computer results is the impact of refresh rate. We get a <code class=\"\" data-line=\"\">90 ms<\/code> improvement from going from <code class=\"\" data-line=\"\">24 Hz<\/code> to <code class=\"\" data-line=\"\">165 Hz<\/code>. At <code class=\"\" data-line=\"\">24 Hz<\/code> each frame takes <code class=\"\" data-line=\"\">41.67 ms<\/code> and at <code class=\"\" data-line=\"\">165 Hz<\/code> each frame takes <code class=\"\" data-line=\"\">6.061 ms<\/code>. As we saw above, if there weren\u2019t any buffering, we\u2019d expect the average latency added by frame refreshes to be <code class=\"\" data-line=\"\">20.8ms<\/code> in the former case and <code class=\"\" data-line=\"\">3.03 ms<\/code> in the latter case (because we\u2019d expect to arrive at a uniform random point in the frame and have to wait between <code class=\"\" data-line=\"\">0ms<\/code> and the full frame time), which is a difference of about <code class=\"\" data-line=\"\">18ms<\/code>. But the difference is actually <code class=\"\" data-line=\"\">90 ms<\/code>, implying we have latency equivalent to <code class=\"\" data-line=\"\">(90 - 18) \/ (41.67 - 6.061) = 2<\/code> buffered frames.<\/p>\n<p>If we plot the results from the other refresh rates on the same machine (not shown), we can see that they\u2019re roughly in line with a \u201cbest fit\u201d curve that we get if we assume that, for that machine running powershell, we get 2.5 frames worth of latency regardless of refresh rate. This lets us estimate what the latency would be if we equipped this low latency gaming machine with an <code class=\"\" data-line=\"\">infinity Hz<\/code> display &#8212; we\u2019d expect latency to be <code class=\"\" data-line=\"\">140 - 2.5 * 41.67 = 36 ms<\/code>, almost as fast as quick but standard machines from the 70s and 80s.<\/p>\n<h3 id=\"complexity\">Complexity<\/h3>\n<p>Almost every computer and mobile device that people buy today is slower than common models of computers from the 70s and 80s. Low-latency gaming desktops and the <code class=\"\" data-line=\"\">ipad pro<\/code> can get into the same range as quick machines from thirty to forty years ago, but most off-the-shelf devices aren\u2019t even close.<\/p>\n<p>If we had to pick one root cause of latency bloat, we might say that it\u2019s because of \u201ccomplexity\u201d. Of course, we all know that complexity is bad. If you\u2019ve been to a non-academic non-enterprise tech conference in the past decade, there\u2019s a good chance that there was at least one talk on how complexity is the root of all evil and we should aspire to reduce complexity.<\/p>\n<p>Unfortunately, it&#8217;s a lot harder to remove complexity than to give a talk saying that we should remove complexity. A lot of the complexity buys us something, either directly or indirectly. When we looked at the input of a fancy modern keyboard vs. the <code class=\"\" data-line=\"\">apple 2<\/code> keyboard, we saw that using a relatively powerful and expensive general purpose processor to handle keyboard inputs can be slower than dedicated logic for the keyboard, which would both be simpler and cheaper. However, using the processor gives people the ability to easily customize the keyboard, and also pushes the problem of \u201cprogramming\u201d the keyboard from hardware into software, which reduces the cost of making the keyboard. The more expensive chip increases the manufacturing cost, but considering how much of the cost of these small-batch artisanal keyboards is the design cost, it seems like a net win to trade manufacturing cost for ease of programming.<\/p>\n<p>We see this kind of tradeoff in every part of the pipeline. One of the biggest examples of this is the OS you might run on a modern desktop vs. the loop that\u2019s running on the <code class=\"\" data-line=\"\">apple 2<\/code>. Modern OSes let programmers write generic code that can deal with having other programs simultaneously running on the same machine, and do so with pretty reasonable general performance, but we pay a huge complexity cost for this and the handoffs involved in making this easy result in a significant latency penalty.<\/p>\n<p>A lot of the complexity might be called <a href=\"http:\/\/wiki.c2.com\/?AccidentalComplexity\">accidental complexity<\/a>, but most of that accidental complexity is there because it\u2019s so convenient. At every level from the hardware architecture to the syscall interface to the I\/O framework we use, we take on complexity, much of which could be eliminated if we could sit down and re-write all of the systems and their interfaces today, but it\u2019s too inconvenient to re-invent the universe to reduce complexity and we get benefits from economies of scale, so we live with what we have.<\/p>\n<p>For those reasons and more, in practice, the solution to poor performance caused by \u201cexcess\u201d complexity is often to add more complexity. In particular, the gains we\u2019ve seen that get us back to the quickness of the quickest machines from thirty to forty years ago have come not from listening to exhortations to reduce complexity, but from piling on more complexity.<\/p>\n<p>The <code class=\"\" data-line=\"\">ipad pro<\/code> is a feat of modern engineering; the engineering that went into increasing the refresh rate on both the input and the output as well as making sure the software pipeline doesn\u2019t have unnecessary buffering is complex! The design and manufacture of high-refresh-rate displays that can push system latency down is also non-trivially complex in ways that aren\u2019t necessary for bog standard <code class=\"\" data-line=\"\">60 Hz<\/code> displays.<\/p>\n<p>This is actually a common theme when working on latency reduction. A common trick to reduce latency is to add a cache, but adding a cache to a system makes it more complex. For systems that generate new data and can\u2019t tolerate a cache, the solutions are often even more complex. An example of this might be <a href=\"https:\/\/en.wikipedia.org\/wiki\/RDMA_over_Converged_Ethernet\">large scale RoCE deployments<\/a>. These can push remote data access latency from from the millisecond range down to the microsecond range, <a href=\"http:\/\/danluu.com\/infinite-disk\/\">which enables new classes of applications<\/a>. However, this has come at a large cost in complexity. Early large-scale RoCE deployments easily took tens of person years of effort to get right and also came with a tremendous operational burden.<\/p>\n<h3 id=\"conclusion\">Conclusion<\/h3>\n<p>It\u2019s a bit absurd that a modern gaming machine running at <code class=\"\" data-line=\"\">4,000x<\/code> the speed of an <code class=\"\" data-line=\"\">apple 2<\/code>, with a CPU that has <code class=\"\" data-line=\"\">500,000x<\/code> as many transistors (with a GPU that has <code class=\"\" data-line=\"\">2,000,000x<\/code> as many transistors) can maybe manage the same latency as an <code class=\"\" data-line=\"\">apple 2<\/code> in very carefully coded applications if we have a monitor with nearly <code class=\"\" data-line=\"\">3x<\/code> the refresh rate. It\u2019s perhaps even more absurd that the default configuration of the <code class=\"\" data-line=\"\">powerspec g405<\/code>, which had the fastest single-threaded performance you could get until October 2017, had more latency from keyboard-to-screen (approximately <code class=\"\" data-line=\"\">3 feet<\/code>, maybe <code class=\"\" data-line=\"\">10 feet<\/code> of actual cabling) than sending a packet around the world (<code class=\"\" data-line=\"\">16187 mi<\/code> from NYC to Tokyo to London back to NYC, more due to the cost of running the shortest possible length of fiber).<\/p>\n<p>On the bright side, we\u2019re arguably emerging from the latency dark ages and it\u2019s now possible to assemble a computer or buy a tablet with latency that\u2019s in the same range as you could get off-the-shelf in the 70s and 80s. This reminds me a bit of the screen resolution &amp; density dark ages, where CRTs from the 90s offered better resolution and higher pixel density than affordable non-laptop LCDs until relatively recently. 4k displays have now become normal and affordable 8k displays are on the horizon, blowing past anything we saw on consumer CRTs. I don\u2019t know that we\u2019ll see the same kind improvement with respect to latency, but one can hope. There are individual developers improving the experience for people who use certain, very carefully coded, applications, but it&#8217;s not clear what force could cause a significant improvement in the default experience most users see.<\/p>\n<h3 id=\"other-posts-on-latency-measurement\">Other posts on latency measurement<\/h3>\n<ul>\n<li><a href=\"http:\/\/danluu.com\/term-latency\/\">Terminal latency<\/a><\/li>\n<li><a href=\"http:\/\/danluu.com\/keyboard-latency\/\">Keyboard latency<\/a><\/li>\n<li><a href=\"http:\/\/danluu.com\/keyboard-v-mouse\/\">Mouse vs. keyboard latency<\/a> (human factors, not device latency)<\/li>\n<li><a href=\"https:\/\/pavelfatin.com\/typing-with-pleasure\/\">Editor latency<\/a> (by Pavel Fatin)<\/li>\n<li><a href=\"http:\/\/www.lofibucket.com\/articles\/dwm_latency.html\">Windows 10 compositing latency<\/a> (by Pekka Vaananen)<\/li>\n<li><a href=\"http:\/\/blogs.valvesoftware.com\/abrash\/latency-the-sine-qua-non-of-ar-and-vr\/\">AR\/VR latency<\/a> (by Michael Abrash)<\/li>\n<li><a href=\"http:\/\/danluu.com\/latency-mitigation\/\">Latency mitigation strategies<\/a> (by John Carmack)<\/li>\n<\/ul>\n<h3 id=\"appendix-why-measure-latency\">Appendix: why measure latency?<\/h3>\n<p>Latency matters! For very simple tasks, <a href=\"https:\/\/pdfs.semanticscholar.org\/386a\/15fd85c162b8e4ebb6023acdce9df2bd43ee.pdf\">people can perceive latencies down to <code class=\"\" data-line=\"\">2 ms<\/code> or less<\/a>. Moreover, increasing latency is not only noticeable to users, <a href=\"http:\/\/www.tactuallabs.com\/papers\/howMuchFasterIsFastEnoughCHI15.pdf\" data-mtli=\"mtli_filesize85967kB\">it causes users to execute simple tasks less accurately<\/a>. If you want a visual demonstration of what latency looks like and you don\u2019t have a super-fast old computer lying around, <a href=\"https:\/\/www.youtube.com\/watch?v=vOvQCPLkPt4\">check out this MSR demo on touchscreen latency<\/a>.<\/p>\n<p>The most commonly cited document on response time is the nielsen group article on response times, which claims that latncies below <code class=\"\" data-line=\"\">100ms<\/code> feel equivalent and perceived as instantaneous. One easy way to see that this is false is to go into your terminal and try <code class=\"\" data-line=\"\">sleep 0; echo &quot;pong&quot;<\/code> vs. <code class=\"\" data-line=\"\">sleep 0.1; echo &quot;test&quot;<\/code> (or for that matter, try playing an old game that doesn&#8217;t have latency compensation, like quake 1, with <code class=\"\" data-line=\"\">100 ms<\/code> ping, or even <code class=\"\" data-line=\"\">30 ms<\/code> ping, or try typing in a terminal with <code class=\"\" data-line=\"\">30 ms<\/code> ping). For more info on this and other latency fallacies, <a href=\"http:\/\/danluu.com\/keyboard-latency\/#appendix-counter-arguments-to-common-arguments-that-latency-doesn-t-matter\">see this document on common misconceptions about latency<\/a>.<\/p>\n<p><a href=\"https:\/\/stackoverflow.com\/a\/39187441\/334816\">Throughput<\/a> also matters, but this is widely understood and measured. If you go to pretty much any mainstream review or benchmarking site, you can find a wide variety of throughput measurements, so there\u2019s less value in writing up additional throughput measurements.<\/p>\n<h3 id=\"appendix-apple-2-keyboard\">Appendix: apple 2 keyboard<\/h3>\n<p>The <code class=\"\" data-line=\"\">apple 2e<\/code>, instead of using a programmed microcontroller to read the keyboard, uses a much simpler custom chip designed for reading keyboard input, the AY 3600. If we look at <a href=\"http:\/\/danluu.com\/AY3600.pdf\" data-mtli=\"mtli_filesize36365kB\">the AY 3600 datasheet<\/a>,we can see that the scan time is <code class=\"\" data-line=\"\">(90 * 1\/f)<\/code> and the debounce time is listed as <code class=\"\" data-line=\"\">strobe_delay<\/code>. These quantities are determined by some capacitors and a resistor, which appear to be <code class=\"\" data-line=\"\">47pf<\/code>, <code class=\"\" data-line=\"\">100k ohms<\/code>, and <code class=\"\" data-line=\"\">0.022uf<\/code> for the Apple 2e. Plugging these numbers into <a href=\"http:\/\/danluu.com\/AY3600.pdf\" data-mtli=\"mtli_filesize36365kB\">the AY3600 datasheet<\/a>, we can see that <code class=\"\" data-line=\"\">f = 50 kHz<\/code>, giving us a <code class=\"\" data-line=\"\">1.8 ms<\/code> scan delay and a <code class=\"\" data-line=\"\">6.8 ms<\/code> debounce delay (assuming the values are accurate &#8212; <a href=\"http:\/\/www.kemet.com\/Lists\/TechnicalArticles\/Attachments\/191\/Why%2047%20uF%20capacitor%20drops%20to%2037%20uF-%2030%20uF-%20or%20lower.pdf\">capacitors can degrade over time<\/a>, so we should expect the real delays to be shorter on our old Apple 2e), giving us less than <code class=\"\" data-line=\"\">8.6 ms<\/code> for the internal keyboard logic.<\/p>\n<p>Comparing to a keyboard with a <code class=\"\" data-line=\"\">167 Hz<\/code> scan rate that <a href=\"https:\/\/www.arduino.cc\/en\/Tutorial\/Debounce\">scans two extra times to debounce<\/a>, the equivalent figure is <code class=\"\" data-line=\"\">3 * 6 ms = 18 ms<\/code>. With a <code class=\"\" data-line=\"\">100Hz<\/code> scan rate, that becomes <code class=\"\" data-line=\"\">3 * 10 ms = 30 ms<\/code>. <code class=\"\" data-line=\"\">18 ms<\/code> to <code class=\"\" data-line=\"\">30 ms<\/code> of keyboard scan plus debounce latency is in line with <a href=\"http:\/\/danluu.com\/keyboard-latency\/\">what we saw when we did some preliminary keyboard latency measurements<\/a>.<\/p>\n<p>For reference, the ergodox uses a <code class=\"\" data-line=\"\">16 MHz<\/code> microcontroller with ~80k transistors and the <code class=\"\" data-line=\"\">apple 2e<\/code> CPU is a <code class=\"\" data-line=\"\">1 MHz<\/code> chip with 3.5k transistors.<\/p>\n<h3 id=\"appendix-why-should-android-phones-have-higher-latency-than-old-apple-phones\">Appendix: why should android phones have higher latency than old apple phones?<\/h3>\n<p>As we&#8217;ve seen, raw processing power doesn&#8217;t help much with many of the causes of latency in the pipeline, like handoffs between different processes, so phones that an android phone with a 10x more powerful processor than an ancient iphone isn&#8217;t guaranteed to be quicker to respond, even if it can render javascript heavy pages faster.<\/p>\n<p>If you talk to people who work on non-Apple mobile CPUs, you&#8217;ll find that they run benchmarks like dhrystone (a synthetic benchmark that was irrelevant even when it was created, in 1984) and SPEC2006 (an updated version of a workstation benchmark that was relevant in the 90s and perhaps even as late as the early 2000s if you care about workstation workloads, which are completely different from mobile workloads). This problem where the vendor who makes the component has <a href=\"http:\/\/danluu.com\/percentile-latency\/\">an intermediate target<\/a> that&#8217;s only weakly correlated to the actual user experience. I&#8217;ve heard that there are people working on the pixel phones who care about end-to-end latency, but it&#8217;s difficult to get good latency when you have to use components that are optimized for things like dhrystone and SPEC2006.<\/p>\n<p>If you talk to people at Apple, you&#8217;ll find that they&#8217;re quite cagey, but that they&#8217;ve been targeting the end-to-end user experience for quite a long time and they they can do &#8220;full stack&#8221; optimizations that are difficult for android vendors to pull of. They&#8217;re not literally impossible, but making a change to a chip that has to be threaded up through the OS is something you&#8217;re very unlikely to see unless google is doing the optimization, and google hasn&#8217;t really been serious about the end-to-end experience until recently.<\/p>\n<p>Having relatively poor performance in aspects that aren&#8217;t measured is a common theme and one we saw when we looked at <a href=\"http:\/\/danluu.com\/term-latency\/\">terminal latency<\/a>. Prior to examining temrinal latency, public benchmarks were all throughput oriented and the terminals that priortized performance worked on increasing throughput, even though increasing terminal throughput isn&#8217;t really useful. After those terminal latency benchmarks, some terminal authors looked into their latency and found places they could trim down buffering and remove latency. You get what you measure.<\/p>\n<h3 id=\"appendix-experimental-setup\">Appendix: experimental setup<\/h3>\n<p>Most measurements were taken with the 240fps camera (<code class=\"\" data-line=\"\">4.167 ms<\/code> resolution) in <a href=\"https:\/\/www.amazon.com\/gp\/product\/B071W3DDM7\/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;tag=abroaview-20&amp;camp=1789&amp;creative=9325&amp;linkCode=as2&amp;creativeASIN=B071W3DDM7&amp;linkId=fde44f1346bdf4bc60896580c2f3dffa\">the iPhone SE<\/a>. Devices with response times below <code class=\"\" data-line=\"\">40 ms<\/code> were re-measured with a 1000fps camera (<code class=\"\" data-line=\"\">1 ms<\/code> resolution), the <a href=\"https:\/\/www.amazon.com\/gp\/product\/B01M62I8Q7\/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;tag=abroaview-20&amp;camp=1789&amp;creative=9325&amp;linkCode=as2&amp;creativeASIN=B01M62I8Q7&amp;linkId=d5f90ebe0b220a8c6e550761f663fb19\">Sony RX100 V<\/a> in PAL mode. Results in the tables are the results of multiple runs and are rounded to the nearest <code class=\"\" data-line=\"\">10 ms<\/code> to avoid the impression of false precision. For desktop results, results are measured from when the key started moving until the screen finished updating. Note that this is different from most key-to-screen-update measurements you can find online, which typically use a setup that effectively removes much or all of the keyboard latency, which, as an end-to-end measurement, is only realistic if you have a psychic link to your computer (this isn&#8217;t to say the measurements aren&#8217;t useful &#8212; if, as a programmer, you want a reproducible benchmark, it&#8217;s nice to reduce measurement noise from sources that are beyond your control, but that&#8217;s not relevant to end users). People often advocate measuring from one of: {the key bottoming out, the tactile feel of the switch}. Other than for measurement convenience, there appears to be no reason to do any of these, but people often claim that&#8217;s when the user expects the keyboard to &#8220;really&#8221; work. But these are independent of when the switch actually fires. Both the distance between the key bottoming out and activiation as well as the distance between feeling feedback and activation are arbitrary and can be tuned. See <a href=\"http:\/\/danluu.com\/keyboard-latency\/\">this post on keyboard latency measurements for more info on keyboard fallacies<\/a>.<\/p>\n<p>Another significant difference is that measurements were done with settings as close to the default OS settings as possible since approximately 0% of users will futz around with display settings to reduce buffering, disable the compositor, etc. Waiting until the screen has finished updating is also different from most end-to-end measurements do &#8212; most consider the update &#8220;done&#8221; when any movement has been detected on the screen. Waiting until the screen is finished changing is analogous to webpagetest&#8217;s &#8220;visually complete&#8221; time.<\/p>\n<p>Computer results were taken using the \u201cdefault\u201d terminal for the system (e.g., powershell on windows, lxterminal on lubuntu), <a href=\"http:\/\/danluu.com\/term-latency\/\">which could easily cause <code class=\"\" data-line=\"\">20 ms<\/code> to <code class=\"\" data-line=\"\">30 ms<\/code> difference between a fast terminal and a slow terminal<\/a>. Between measuring time in a terminal and measuring the full end-to-end time, measurements in this article should be slower than measurements in other, similar, articles (which tend to measure time to first change in games).<\/p>\n<p>The <code class=\"\" data-line=\"\">powerspec g405<\/code> baseline result is using integrated graphics (the machine doesn\u2019t come with a graphics card) and the <code class=\"\" data-line=\"\">60 Hz<\/code> result is with a cheap video card. The baseline was result was at <code class=\"\" data-line=\"\">30 Hz<\/code> because the integrated graphics only supports <code class=\"\" data-line=\"\">hdmi<\/code> output and the display it was attached to only runs at <code class=\"\" data-line=\"\">30 Hz<\/code> over <code class=\"\" data-line=\"\">hdmi<\/code>.<\/p>\n<p>Mobile results were done by using the default browser, browsing to <a href=\"https:\/\/danluu.com\">https:\/\/danluu.com<\/a>, and measuring the latency from finger movement until the screen first updates to indicate that scrolling has occurred. In the cases where this didn\u2019t make sense, (kindles, gameboy color, etc.), some action that makes sense for the platform was taken (changing pages on the kindle, pressing the joypad on the gameboy color in a game, etc.). Unlike with the desktop\/laptop measurements, this end-time for the measurement was on the first visual change to avoid including many frames of scrolling. To make the measurement easy, the measurement was taken with a finger on the touchscreen and the timer was started when the finger started moving (to avoid having to determine when the finger first contacted the screen).<\/p>\n<p>In the case of \u201cties\u201d, results are ordered by the unrounded latency as a tiebreaker, but this shouldn\u2019t be considered significant. Differences of <code class=\"\" data-line=\"\">10 ms<\/code> should probably also not be considered significant.<\/p>\n<p>The <code class=\"\" data-line=\"\">custom haswell-e<\/code> was tested with <code class=\"\" data-line=\"\">gsync<\/code> on and there was no observable difference. The year for that box is somewhat arbitrary, since the CPU is from <code class=\"\" data-line=\"\">2014<\/code>, but the display is newer (I believe you couldn\u2019t get a <code class=\"\" data-line=\"\">165 Hz<\/code> display until <code class=\"\" data-line=\"\">2015<\/code>.<\/p>\n<p>The number of transistors for some modern machines is a rough estimate because exact numbers aren\u2019t public. Feel free to ping me if you have a better estimate!<\/p>\n<p>The color scales for latency and year are linear and the color scales for clock speed and number of transistors are log scale.<\/p>\n<p>All Linux results were done with a <a href=\"https:\/\/lwn.net\/SubscriberLink\/741878\/eb6c9d3913d7cb2b\/\">pre-KPTI<\/a> kernel. It&#8217;s possible that KPTI will impact user perceivable latency.<\/p>\n<p>Measurements were done as cleanly as possible (without other things running on the machine\/device when possible, with a device that was nearly full on battery for devices with batteries). Latencies when other software is running on the device or when devices are low on battery might be much higher.<\/p>\n<p>If you want a reference to compare the kindle against, a moderately quick page turn in a physical book appears to be about <code class=\"\" data-line=\"\">200 ms<\/code>.<\/p>\n<p><i>This is a work in progress. I expect to get benchmarks from a lot more old computers the next time I visit Seattle. If you know of old computers I can test in the NYC area (that have their original displays or something like them), let me know! If you have a device you\u2019d like to donate for testing, feel free to mail it to<\/i><\/p>\n<p>Dan Luu<br \/>\nRecurse Center<br \/>\n455 Broadway, 2nd Floor<br \/>\nNew York, NY 10013<\/p>\n<p><i>Thanks to <a href=\"https:\/\/www.recurse.com\/scout\/click?t=b504af89e87b77920c9b60b2a1f6d5e8\">RC<\/a>, David Albert, Bert Muthalaly, Christian Ternus, Kate Murphy, Ikhwan Lee, Peter Bhat Harkins, Leah Hanson, Alicia Thilani Singham Goodwin, Amy Huang, Dan Bentley, Jacquin Mininger, Rob, Susan Steinman, Raph Levien, Max McCrea, Peter Town, Jon Cinque, Anonymous, and Jonathan Dahan for donating devices to test and thanks to Leah Hanson, Andy Matuschak, Milosz Danczak, amos (@fasterthanlime), @emitter_coupled, Josh Jordan, mrob, and David Albert for comments\/corrections\/discussion.<\/i><\/p>\n<div class=\"np\"><a href=\"https:\/\/danluu.com\/overwatch-gender\/\">\u2190 Randomized trial on gender in Overwatch<\/a> <a href=\"https:\/\/danluu.com\/bad-decisions\/\">How good are decisions? \u2192<\/a><\/div>\n<div class=\"np\"><a href=\"https:\/\/danluu.com\/\">Archive<\/a> <a href=\"https:\/\/www.patreon.com\/danluu\">Support this site (patreon)<\/a> <a href=\"https:\/\/danluu.com\/about\/\">About<\/a> <a href=\"https:\/\/twitter.com\/danluu\">Twitter<\/a> <a href=\"https:\/\/danluu.com\/atom.xml\" rel=\"alternate\" type=\"application\/rss+xml\">RSS<\/a><\/div>\n<\/blockquote>\n","protected":false},"excerpt":{"rendered":"<p class=\"excerpt\">Computer latency: 1977-2017<\/p>\n<p class=\"more-link-p\"><a class=\"more-link\" href=\"https:\/\/monodes.com\/predaelli\/2019\/06\/17\/computer-latency-1977-2017\/\">Read more &rarr;<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"activitypub_content_warning":"","activitypub_content_visibility":"","activitypub_max_image_attachments":4,"activitypub_interaction_policy_quote":"anyone","activitypub_status":"","footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[1],"tags":[],"class_list":["post-5753","post","type-post","status-publish","format-standard","hentry","category-senza-categoria"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p6daft-1uN","jetpack-related-posts":[{"id":763,"url":"https:\/\/monodes.com\/predaelli\/2015\/10\/31\/how-to-differentiate-between-an-average-and-a-good-programmer\/","url_meta":{"origin":5753,"position":0},"title":"How to differentiate between an Average and a Good Programmer?","author":"Paolo Redaelli","date":"2015-10-31","format":false,"excerpt":"\u00a0How to differentiate between an Average and a Good Programmer? \u00a0 Oh my! It's so true! javarevisited looks like a really good programming blog as I found gems like\u00ab10 Articles Every Programmer Must Read \u00bb among What Every Programmer Should Know about Memory What Every Computer Scientist Should Know About\u2026","rel":"","context":"In &quot;Senza categoria&quot;","block_context":{"text":"Senza categoria","link":"https:\/\/monodes.com\/predaelli\/category\/senza-categoria\/"},"img":{"alt_text":"Being a good programmer is 3% talent, 97% not being distracted by the Internet","src":"https:\/\/i0.wp.com\/monodes.com\/predaelli\/wp-content\/uploads\/sites\/4\/2015\/10\/Being%2Ba%2BProgrammer.jpg?resize=350%2C200","width":350,"height":200},"classes":[]},{"id":4452,"url":"https:\/\/monodes.com\/predaelli\/2018\/07\/31\/with-daas-windows-coming-say-goodbye-to-your-pc-as-you-know-it-slashdot\/","url_meta":{"origin":5753,"position":1},"title":"With DaaS Windows Coming, Say Goodbye To Your PC As You Know It &#8211; Slashdot","author":"Paolo Redaelli","date":"2018-07-31","format":false,"excerpt":"Knowing how lazy and ignorant are people this is not a good news: With DaaS Windows Coming, Say Goodbye To Your PC As You Know It - Slashdot people are too much accostumed to rent things to understand how crippled they will be. Ostracus shares a report from Computerworld, written\u2026","rel":"","context":"In &quot;Mood&quot;","block_context":{"text":"Mood","link":"https:\/\/monodes.com\/predaelli\/category\/mood\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":5851,"url":"https:\/\/monodes.com\/predaelli\/2019\/07\/23\/web-bloat\/","url_meta":{"origin":5753,"position":2},"title":"Web bloat","author":"Paolo Redaelli","date":"2019-07-23","format":"link","excerpt":"Web bloat Some developer should learn this by heart! Web bloat A couple years ago, I took a road trip from Wisconsin to Washington and mostly stayed in rural hotels on the way. I expected the internet in rural areas too sparse to have cable internet to be slow, but\u2026","rel":"","context":"In &quot;Senza categoria&quot;","block_context":{"text":"Senza categoria","link":"https:\/\/monodes.com\/predaelli\/category\/senza-categoria\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":14967,"url":"https:\/\/monodes.com\/predaelli\/2026\/02\/07\/lenovo-no-thanks\/","url_meta":{"origin":5753,"position":3},"title":"Lenovo? No, thanks","author":"Paolo Redaelli","date":"2026-02-07","format":false,"excerpt":"I have never been really fond of Lenovo notebooks, even if they are used by many notable Linux hackers. Now I have an actual yet feeble reason to avoid them, preferring Linux-friendly vendors (such as Laptopwithlinux.com, tuxedocomputers.com, slimbook.com, even dell.com1 or system76.com in the USA) since it happens that in\u2026","rel":"","context":"In &quot;Yet another reason to avoid&quot;","block_context":{"text":"Yet another reason to avoid","link":"https:\/\/monodes.com\/predaelli\/category\/ethics\/yet-another-reason-to-avoid\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":2547,"url":"https:\/\/monodes.com\/predaelli\/2017\/06\/02\/forwarding-audio-elsewhere-on-linux\/","url_meta":{"origin":5753,"position":4},"title":"Forwarding audio elsewhere on Linux","author":"Paolo Redaelli","date":"2017-06-02","format":false,"excerpt":"These days I've been attending to an online course that require me not to do anything else in the user session beside watching and listening. Actually I've been able to pass two checks while I've been hacking on another machine, just listening and watching now and then. But it's boring\u2026","rel":"","context":"In &quot;Documentations&quot;","block_context":{"text":"Documentations","link":"https:\/\/monodes.com\/predaelli\/category\/documentations\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":2174,"url":"https:\/\/monodes.com\/predaelli\/2017\/02\/19\/how-to-install-ubuntu-on-computer-with-uefi\/","url_meta":{"origin":5753,"position":5},"title":"How to install Ubuntu on computer with UEFI","author":"Paolo Redaelli","date":"2017-02-19","format":false,"excerpt":"How to install Ubuntu on computer with UEFI Nice! I may just need it soon. My wife asked for a new laptop. But while she finds Linux great - I've been exclusively using Linux since 1997 - some software requires for schooling out children sadly runs only on Windows. So\u2026","rel":"","context":"In &quot;Senza categoria&quot;","block_context":{"text":"Senza categoria","link":"https:\/\/monodes.com\/predaelli\/category\/senza-categoria\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]}],"jetpack_likes_enabled":true,"_links":{"self":[{"href":"https:\/\/monodes.com\/predaelli\/wp-json\/wp\/v2\/posts\/5753","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/monodes.com\/predaelli\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/monodes.com\/predaelli\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/monodes.com\/predaelli\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/monodes.com\/predaelli\/wp-json\/wp\/v2\/comments?post=5753"}],"version-history":[{"count":0,"href":"https:\/\/monodes.com\/predaelli\/wp-json\/wp\/v2\/posts\/5753\/revisions"}],"wp:attachment":[{"href":"https:\/\/monodes.com\/predaelli\/wp-json\/wp\/v2\/media?parent=5753"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/monodes.com\/predaelli\/wp-json\/wp\/v2\/categories?post=5753"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/monodes.com\/predaelli\/wp-json\/wp\/v2\/tags?post=5753"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}