From 16bd859b0caf5fa96cf9cbf27b64ef4229629cf1 Mon Sep 17 00:00:00 2001 From: Alex Hultman Date: Tue, 30 Oct 2018 07:06:30 +0100 Subject: [PATCH] Add new WebSocket benchmark graph --- README.md | 6 +++++- benchmarks/README.md | 4 +++- misc/bigshot_lineup.png | Bin 14715 -> 16169 bytes misc/websocket_lineup.png | Bin 0 -> 16424 bytes 4 files changed, 8 insertions(+), 2 deletions(-) create mode 100644 misc/websocket_lineup.png diff --git a/README.md b/README.md index 0ac95ac..62f76fb 100644 --- a/README.md +++ b/README.md @@ -55,4 +55,8 @@ A free & open source ([Zlib](LICENSE)) project since 2016. Kindly sponsored by [ Commercial support is available via a per-hourly consulting plan or as otherwise negotiated. If you're stuck, worried about design or just in need of help don't hesitate throwing [me, the author](https://github.com/alexhultman) a mail and we'll figure out what's best for both parties. I want your business to have a proper understanding of the problem before rushing in to one of the many pitfalls. #### Excel across the board. -![](misc/bigshot_lineup.png) +All that glitters is not gold. Especially so in a market driven by flashy logos, hype and pointless badges. + +Http | WebSockets +--- | --- +![](misc/bigshot_lineup.png) | ![](misc/websocket_lineup.png) diff --git a/benchmarks/README.md b/benchmarks/README.md index 3c9ba81..abe48c3 100644 --- a/benchmarks/README.md +++ b/benchmarks/README.md @@ -6,7 +6,9 @@ The world needs more like you. I could talk about how stupid and gullible 95% of * Never accept random *numbers* which has no *point of reference* to similar software projects. The number "1 million" might sound fancy but without *any* kind of reference to *other* projects there's no knowing the worth of such a number. Comparative benchmarks are the only ones worth taking in. Think for yourself - how can the author claim "fast" if he/she has no benchmarks of what *others* are doing? * Most people who do benchmarks are complete monrons and do not know their ass from their head. Always make sure to *normalize* performance by spent CPU-time. That is, do NOT compare performance of software demanding 100% CPU-time on 57 CPU cores, with software running on 5% CPU-time on 1 CPU core. You would be stunned if you knew how few people actually care to even check this before posting their results to their literally millions of gullible followers. -![](../misc/bigshot_lineup.png) +Http | WebSockets +--- | --- +![](../misc/bigshot_lineup.png) | ![](../misc/websocket_lineup.png) ### The bystander effect (todo: shorten this) Having many users and many "stars" does not constitute a confirmation of any such *claims*. In fact, the opposite is more often true than not. How can this be true? Well for starters, actual performance often come with restrictions and more cumbersome APIs and it turns out most people are not really interested in doing more work than what they absolutely have to. Programmers want to *believe* their overly abstract garbage collected functional one liners to be "more efficient than machine code". They want to have the cake, and a cake cloning device too. diff --git a/misc/bigshot_lineup.png b/misc/bigshot_lineup.png index 0d4221f72373f694f4f3c7f47a1941575217a1df..a76f7d9bb47aef832d79d31a242836e06ba7bf61 100644 GIT binary patch literal 16169 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 literal 14715 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 ZW+Y1|*DEJ1;H65sOBiLDl=D{~{2z1}vbg{N diff --git a/misc/websocket_lineup.png b/misc/websocket_lineup.png new file mode 100644 index 0000000000000000000000000000000000000000..4afbb772e0ebc5ff51c97a11cb5c41760bb64c3a GIT binary patch literal 16424 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�aSpj zkIcm&qF9*d5X=!A`~yb3QZMEZGEN37;Fjme(q8JBAm#H*6`0G~cYZoyvN;=z5Dm`< z(i`4<15?8Z#+=+%rw^~d>}rs?D^&W@+2}7$HzwboJ-t$pvM~uDcoSlvsT=@WyXk`@ zC<4eXzoDMpEWdfZHHvdaw}oS)y{K{lhE~t1>fu_*^PHxl9*`T1-?(U7KM={M@8jHq z%mFS{4aeJtL4mDT`%#}8(^EI$p2!?`4y?#4$W_w*J)LA##7L?YCzo~ zQcaKhAV=jS6p~PhMlgnDO~)wVJi56yLxKSgU0Ds)A0NTiC0cZ+4<;c4L#Ik$I#$@@ z#%vf)SLl|3(=)kq2euIOXgdTRA59DBvCf7Mye6nOow$eq3ZOwR4C#>dp24(d?fdXR z`Q+f&Zopv85KI$s+{^B)Ky|sYhu8fUkF+MC0PVOa)@2@vwyaQRBVM5f5H)WrYIa}-=Cy<)B$!*e zZ!MEc;7(J`3awj*B}pr)M^D}|kas2NZS)fp)k=p$1KOV=848jwhgL*iJPZ8V`r9+| zhS@n?g72*3B~BT8FSIc9F%eyIpUw