💭

Laravel10とCodeIgniter4とのレスポンスタイムをざっくり比較してみる

2023/12/09に公開

はじめに

「CodeIgniterって軽量で高速」というイメージがあったのですが、気になってみたので実際にLaravelと比較してどれくらい速いのかを検証してみようと思います。

  • MacBook Air 2020 Apple M1 16GBメモリ
  • MacOS Sonoma 14.0
  • kool.devでDocker開発環境構築
    • PHP 8.2
    • MySQL 8.0
  • Laravel 10.2.10
  • CodeIgniter 4.4.3
  • 同じ最適化をする composer install --optimize-autoloader --no-dev
  • ApacheBenchで計測
  • 以下のシナリオで検証
    • コントローラークラスで素朴に echo 'HELLO WORLD';
    • 10000レコードあるproductsテーブルを作成しておき、コントローラークラスで全件取得
    • 10000レコードあるproductsテーブルを作成しておき、コントローラークラスでランダムにID指定して1レコード取得するのを100回行う
    • 10000レコードあるproductsテーブルを作成しておき、カテゴリIDで絞り込んで検索
    • 10000レコードあるproductsテーブルを作成しておき、商品名でLIKE検索
    • productsテーブルとcategoriesテーブルをjoin して全件取得

※同じDBデータで検証するため、Laravelでシーディングしたデータを流用

コントローラークラスで素朴に echo 'HELLO WORLD';

Laravelのコントローラークラス
app/Controllers/BenchmarkController.php
~~~
    public function echoHelloWorld()
    {
        echo 'HELLO WORLD';
    }
~~~
CodeIgniterのコントローラークラス
app/Controllers/Benchmark.php
~~~
    public function echoHelloWorld()
    {
        echo 'HELLO WORLD';
    }
~~~
ab -n 1000 -c 10 -l http://localhost/benchmark/echo_hello_world
Requests per second
Laravel10 30.82/sec
CodeIgniter4 72.80/sec

10000レコードあるproductsテーブルを作成しておき、コントローラークラスで全件取得

Laravelのコントローラークラス
app/Controllers/BenchmarkController.php
~~~
    public function productsFindAll()
    {
        $products = Product::all();
    }
~~~
CodeIgniterのコントローラークラス
app/Controllers/Benchmark.php
~~~
    public function productsFindAll()
    {
        $productsModel = model(Products::class);
        $products = $productsModel->findAll();
    }
~~~
ab -n 1000 -c 10 -l http://localhost/benchmark/products_findall
Requests per second
Laravel10 21.49/sec
CodeIgniter4 47.40/sec

10000レコードあるproductsテーブルを作成しておき、コントローラークラスでランダムにID指定して1レコード取得するのを100回行う

Laravelのコントローラークラス
app/Controllers/BenchmarkController.php
~~~
    public function productRandom100()
    {
        $products = [];
        for ($i=0; $i < 100; $i++) { 
            $products[] = Product::where('id', rand(1, 10000))->get();
        }      
    }
~~~
CodeIgniterのコントローラークラス
app/Controllers/Benchmark.php
~~~
    public function productRandom100()
    {
        $productsModel = model(Products::class);

        $products = [];
        for ($i=0; $i < 100; $i++) { 
            $products[] = $productsModel->where('id', rand(1, 10000))->first();
        }      
    }
~~~
ab -n 1000 -c 10 -l http://localhost/benchmark/product_random_100
Requests per second
Laravel10 24.88/sec
CodeIgniter4 49.77/sec

10000レコードあるproductsテーブルを作成しておき、カテゴリIDで絞り込んで検索

Laravelのコントローラークラス
app/Controllers/BenchmarkController.php
~~~
    public function productsWhereCategoriesId(int $category_id)
    {
        $products = Product::where('category_id', $category_id)->get();
    }
~~~
CodeIgniterのコントローラークラス
app/Controllers/Benchmark.php
~~~
    public function productsWhereCategoriesId(int $category_id)
    {
        $productsModel = model(Products::class);
        $products = $productsModel->where('category_id', $category_id)->findAll();
    }
~~~
ab -n 1000 -c 10 -l http://localhost/benchmark/products_where_categories/100
Requests per second
Laravel10 28.48/sec
CodeIgniter4 57.08/sec

10000レコードあるproductsテーブルを作成しておき、商品名でLIKE検索

Laravelのコントローラークラス
app/Controllers/BenchmarkController.php
~~~
    public function productsLikeKeyword(string $keyword)
    {
        $products = Product::where('name', 'LIKE', '%'.$keyword.'%')->get();
    }
~~~
CodeIgniterのコントローラークラス
app/Controllers/Benchmark.php
~~~
    public function productsLikeKeyword(string $keyword)
    {
        $productsModel = model(Products::class);
        $products = $productsModel->like('name', $keyword)->findAll();
    }
~~~
ab -n 1000 -c 10 -l http://localhost/benchmark/products_like_keyword/a
Requests per second
Laravel10 24.24/sec
CodeIgniter4 52.88/sec

productsテーブルとcategoriesテーブルをjoin して全件取得

Laravelのコントローラークラス
app/Controllers/BenchmarkController.php
~~~
    public function productsJoinCategories()
    {
        $products = Product::query()->with('category')->get();
    }
~~~
CodeIgniterのコントローラークラス
app/Controllers/Benchmark.php
~~~
    public function productsJoinCategories()
    {
        $productsModel = model(Products::class);
        $products = $productsModel->join('categories', 'categories.id = products.category_id', 'inner')->findAll();
    }
~~~
ab -n 1000 -c 10 -l http://localhost/benchmark/products_join_categories
Requests per second
Laravel10 17.76/sec
CodeIgniter4 35.75/sec

Discussion