Deno対Nodeのパフォーマンスについて

# Performance aspect of Deno vs. Node

## この記事に関して

[Performance aspect of Deno vs. Node](https://dev.to/gjuoun/perfomance-aspect-of-deno-vs-node-js-4dke)を翻訳しました。
また、私のブログからの[転載](https://github.com/yoshixmk/profile/blob/master/translations/001-perfomance-aspect-of-deno-vs-node-js.md)です

## Deno対Nodeのパフォーマンスについて
パフォーマンスが良いことは、素晴らしいことです。  
数日前、Craig Mortenの投稿[What Is The Best Deno Web Framework?](https://dev.to/craigmorten/what-is-the-best-deno-web-framework-2k69)「DenoのWebフレームワークで最適なものは何か？」を読みました。すべてのDenoフレームワークの概要を示し、それらのすべての側面を比較します。あなたがそれについて読んでいないなら、私はあなたがそうすることを強く勧めます。  

クレイグの投稿によると、「パフォーマンス」セクションは魅力的です。彼の環境では、Deno HTTPモジュールはNode HTTPモジュールとほとんど同じ（さらにはそれ以上）という結果でした。これは単なる "Hello Deno！"を試すだけのパフォーマンステストですが、この結果に驚きました。  

~~しかし、私はそれがほとんどの場合に当てはまらないことを知っていました。なぜならDeno HTTPモジュールはTypescriptで記述されているためです。型チェックは開発の楽しさをもたらしますが、コンパイラー時間により多くのリソースがかかるため、パフォーマンスに悪影響を及ぼします。~~
（Oghenovo UsiwomaとJonathan Beaumont がコメントで[指摘](https://dev.to/eunovo/comment/10hn2)してくれてありがとう）

しかし、私は以前にそれをテストしたことがあり、彼と同じ結果を得たことはありません。より強力なマシンでテストを実行するとどうなるかを確認したいと思います。

- 環境：
  - CPU：i5-9600KF @ 3.7GHz
  - RAM：16GB DDR4 2133MHz
  - OS：Windows 10
  - ベンチマークツール： [autocannon](https://github.com/mcollina/autocannon)

- ベンチマークスクリプト：
  - "Hello World!" [deno server](https://github.com/deligenius/deligenius/blob/master/benchmark/deno.http.tsv)
  - "Hello World!" [node server](https://github.com/deligenius/deligenius/blob/master/benchmark/node.http.js)
最初に結果を見てみましょう：

### 100同時接続
| 名前 | バージョン | AVGリクエスト/秒 |
|---|---|---|
|node.http|12.16.3|47969.2|
|deno.http|1.0.0|47376|
|deno.http|1.1.0|46953.7|
|node.http|14.2.0|44409|

なんと！全体的にDenoはNodeを優っているように見えます！（少なくともNodeバージョン14.2.0の場合）。  

ただし、このベンチマークは、100の同時接続数に基づいて`autocannon http://localhost:3000/ -c100`のコマンドで実行しているため、中小規模のサーバーには多すぎます。そこで、もう一度試してみます。今回`-c10`は、10の同時接続で要求を送信し続けるてみます。  

### 10同時接続
|名前	|バージョン|	AVGリクエスト/秒|
|---|---|---|
|node.http	|12.16.3	|49926.69|
|node.http	|14.2.0	|45345.33|
|deno.http	|1.1.0	|34806.79|
|deno.http	|1.0.0	|34742.37|
今回は、Nodeの勝利です。2つの間には大きな違いがあり、ノードはデノよりも毎秒約10Kを超えるリクエストを持っています。  

しかし、これは新しい質問をもたらします：

### 同時接続数が重要なのはなぜですか？
同時接続とは、[別の接続と同時に発生する接続](https://blog.litespeedtech.com/2013/04/26/concurrent-connections-demystified/#:~:text=A%20concurrent%20connection%20is%20a,mean%20the%20exact%20same%20time.)のことです。  
あるユーザーがHTMLページのリクエストを送信し、5ミリ秒後に、  
別のユーザーがcssファイルのリクエストを送信したとします。  
しかしこれは同時接続とは見なされません。

## 同時接続数を計算する方法
例えば、アプリに100人のアクティブユーザーがいるとします。これらのユーザーを1時間追跡し、各ユーザーが1時間に60回のクリックを行っていることを分かったとします。これはサーバーでの合計リクエスト数が6000であり、各リクエストには平均で2秒かかるとします（これは非常に低速です）。これは、3600秒（1時間）で、12000秒のアクティブな接続であり、**同時接続数は3.33**になります（12000/3600 = 3.33）。  

- Q. もしサーバーが1秒以内に各リクエストを処理できるほど強力な場合はどうでしょう?
- A. 同時数はさらに少なくして、1.7未満です。

- Q. 1000人のアクティブユーザーはどうですか？
- A. 同時接続数は33.3

- Q. 100の同時接続はやりすぎでは？  
- A. そのとおり！3000人以上のアクティブユーザーにサービスを提供するエンタープライズレベルのアプリケーションを構築する場合を除きます。（上記のシナリオにおいては）

### NodeまたはDeno、どちらの方がパフォーマンスが良いか教えていただけますか？
そうは言っても、**10個の同時接続の結果は実際にはより意味があり、Nodeはパフォーマンスラウンドで勝利します。**  

`-c100`のテストではDenoの方がパフォーマンスが優れていますが、これは、トラフィック量の多いネットワークの場合であり、NodeよりもDenoの方が優れていることを意味しています。それは素晴らしいことです。私が見てきたことから、Denoはまだ若く、現時点ではまだ本番環境に対応していないため、企業はデノよりも大量のトラフィックを処理するためにJavaまたは他のよく知られた実績のある言語を好むでしょう。しかし、Denoコミュニティの誰もがそれを実現させています🔥。  

最後に一点申し上げたいと思います。開発コミュニティにとって、パフォーマンスは成功の鍵ではありません。PythonとPHPを見てください。それらはNodeとDeno よりもかなり遅く実行されます。なぜ、それらは人気なのでしょうか？その理由はエコシステムと人です！

### 追加トピック
[Googleが1秒あたり75,000以上のクエリを処理する](https://99firms.com/blog/google-search-statistics/)ことを検討してください。
サーバーは、1秒あたりこの量のリクエスト（> 40K）を処理できますか？