# 言語別の処理速度を測る ## 目的 各言語の書き易さ・学習コストや演算にかかる時間を比較することでチーム開発のバックエンドに使用する環境を決定する # テストケース① 年率計算 ### 要件1 毎年一定額投資した場合、目標金額を何年で達成できるか 元本50万円を金利5%で毎年投資した場合、金利のみで目標金額n円を達成するために何年かかるか ### 要件2 コードの書きやすさ・少なさ 同じ処理を実装した場合のコードの書きやすさやコード量の少なさ ## 基礎フロー ・元本50万円を金利5%で毎年投資した場合、金利のみで目標額4500万円を達成すには何年かかるか​ ・計算式 => 50万 * 1.05^n = 4500万 # テストケース② データベースアクセス テストケースとなるusersテーブル | uid | username | |:---:|:--------:| | 1 | user1 | ### 要件1 CRUD操作それぞれにかかる時間はいくらか ### 要件2 コードの書きやすさ・少なさ 同じ処理を実装した場合のコードの書きやすさやコード量の少なさ ### 要件3 一度に100件のユーザを登録・取得・更新・削除 一度に多くのデータをCRUDすることで処理負荷をかける # テストケース③ ライプニッツ級数 円周率を求める数式 1−1/3+1/5−1/7+1/9-1/11 ⋯ = π/4 ### 特徴 収束が遅いので計算に時間がかかる *少ない項数の和で真値に近い近似値が得られる場合、「収束が速い」という。 ### 要件1 一億回ループして円周率を求める # エントリー言語 評価基準 : コードの書き易さ、学習コスト、可読性、処理速度を独断で予想 | 言語 | 書き易さ | 学習コスト | 可読性 | 処理速度 | 総合的な期待度 | |:-------:|:--------:|:----------:|:------:|:--------:|:--------------:| | Python | ★★★ | ★★★ | ★★ | ★★★ | ★★★ | | PHP | ★★★ | ★★★ | ★★★ | ★★ | ★★★ | | Node.js | ★★ | ★★★ | ★★★ | ★★ | ★★ | | Go | ★ | ★ | ★ | ★★★ | ★ | # 検証 ### 年率計算 Q. 元本50万円を金利5%で毎年投資した場合、金利のみで目標金額4500万円を達成するために何年かかるか A. 年 : 93年、金額 : 46727744.419998円 | 言語 | 処理時間(秒) | 書き易さ | 可読性 | | ------- | ------------------- |:--------:|:------:| | Python | 0.00630459999956656 | ★★★ | ★★ | | PHP | 0.00062298774719238 | ★★★ | ★★★ | | Node.js | 0.02560439997911453 | ★★★ | ★★ | | Go | 0.00486430000000000 | ★ | ★ | ### データベース ユーザを100件登録・取得・更新・削除 全てMySQL 処理時間(秒) | 言語 | フレームワーク | 登録 | 取得 | 更新 | 削除 | 書き易さ | 可読性 | | ------ |:--------------:|:----------------:|:-----------------:|:----------------:|:----------------:|:--------:|:------:| | Python | FastAPI | 0.32162310001149 | 0.035952500009443 | 0.16140139999333 | 0.04291849999572 | ★★ | ★★ | | PHP | Laravel | 0.59145998954773 | 0.051371097564697 | 0.69202589988708 | 0.06892704963684 | ★★★ | ★★★ | | Node.js| Express | 0.29661040002107 | 0.016010599970817 | 0.23704350000619 | 0.01004109996557 | ★★ | ★★ | | Go | Gin | 0.29432280000000 | 0.008425300000000 | 0.47244039999999 | 0.00711310000000 | ★ | ★ | ### ライプニッツ級数 3.1415926445762157・・・・ | 言語 | 処理時間(秒) | |:------:|:------------------:| | Python | 21.4192495000315 | | PHP | 2.3862011432648 | | Node.js| 0.3593577999472 | | Go | 0.2426675000000 | ### # 結論 Laravel ### メリット 学習コスト、可読性ともに良好、単純な計算処理ならば他言語と比べても劣らない ### デメリット データベースへのアクセスが遅い ### 対策 バッチ処理などでまとめて計算することでアクセス回数を減らす # 反省 Node.jsのみORMを使っていないのでORMを導入して検証した結果も加味するべき # コード Python https://github.com/murata0531/Processing_speed_measurement_by_Python.git PHP https://github.com/murata0531/Processing_speed_measurement_by_PHP Node.js https://github.com/murata0531/Processing_speed_measurement_by_Node Go https://github.com/murata0531/Processing_speed_measurement_by_Go