Eloquentは遅いのか

Posted: 2014-10-28 00:12 |  PHP全般 

気になったのでやりました

同じテーマで海外のエンジニアの方が書いていたので、
実際にマイクロベンチマーク的にデータ挿入にかかる時間を調べてみました。
PCや色んな環境によって多少誤差もありますし、
結果がどうあれ好きなものや、使いやすいものを使えば良いだけです。
気になったので実際にやってみただけです

計測したマシンは自宅のMac pro
(ゴミ箱の前のやつ)
2.8 GHz Quad-Core Xeon
16GB 1066 MHz DDR3

PHP 5.5.10 (cli) with Zend OPcache v7.0.3
MySQLは 5.5.34 
です

利用したスキーマはシンプル
-- mysql schema.
CREATE TABLE `performances` (
  `id` int(11) unsigned NOT NULL,
  `value` varchar(255) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
auto incrementも利用せずに、CURRENT_TIMESTAMP も利用せずに
シンプルに挿入するだけのアレです

Eloquentはilluminate/databaseを入れればLaravelじゃなくても単体で利用できます
require_once("../vendor/autoload.php");

use Illuminate\Events\Dispatcher;
use Illuminate\Container\Container;
use Illuminate\Database\Capsule\Manager as Db;

$db = new Db;
$db->addConnection([
        'driver' => 'mysql',
        'host' => 'localhost',
        'database' => 'tests',
        'username' => 'root',
        'password' => 'password',
        'charset' => 'utf8',
        'collation' => 'utf8_unicode_ci',
        'prefix' => '',
    ]
);

$db->setEventDispatcher(new Dispatcher(new Container));
$db->setAsGlobal();
$db->bootEloquent();

class Performance extends Illuminate\Database\Eloquent\Model {
    public $timestamps = false;
}
こんな具合です
illuminate/databaseは単体でEloquent、クエリービルダー、ベーシックの3種、
ほかに比較用としてPDOとdoctrine/dbalを使いました
doctrine/dbalはクエリービルダーではなく、ベーシックなやつです

では結果

遅い順からいきます
だいたい予想はついているはず!

■Eloquent

  1000レコード 10000レコード
1 1.48385 seconds 15.00890 seconds
2 1.48660 seconds 14.33295 seconds
3 1.42549 seconds 14.32169 seconds
4 1.41843 seconds 14.60663 seconds
5 1.41814 seconds 14.23829 seconds

予想通り一番時間がかかりました
簡単に使える様にしているのと、実装内容を考えると当然ではないでしょうか
for($i = 0; $i < 1000; $i++) {
    $performance = new Performance();
    $performance->id = $i;
    $performance->value = "{$i}";
    $performance->save();
}
 

■クエリービルダー

  1000レコード 10000レコード
1 0.92919 seconds 9.86715 seconds
2 0.93245 seconds 9.36648 seconds
3 0.96220 seconds 9.40575 seconds
4 0.93663 seconds 9.33111 seconds
5 0.93735 seconds 9.37816 seconds

2位はilluminate/databaseでクエリービルダー利用
それでもEloquentよりはだいぶ早くなります

 

for($i = 0; $i < 1000; $i++) {
    $db->connection()->table('performances')->insert(['id' => $i, 'value' => "{$i}"]);
}


■ベーシック

  1000レコード 10000レコード
1 0.73910 seconds 7.58190 seconds
2 0.76671 seconds 7.77848 seconds
3 0.73462 seconds 7.35464 seconds
4 0.73244 seconds 7.38892 seconds
5 0.75562 seconds 7.51959 seconds

3位はilluminate/databseの中でも一番ベーシックなやつでした
クエリービルダーよりも更に早く、軽量になります

 

for($i = 0; $i < 1000; $i++) {
    $db->connection()->insert(
        "INSERT INTO performances (id, value) VALUES (?, ?)",
        [$i, "{$i}"]
    );
}

■doctrine/dbal

  1000レコード 10000レコード
1 0.66695 seconds 6.76450 seconds
2 0.66167 seconds 6.75211 seconds
3 0.66010 seconds 6.76761 seconds
4 0.66351 seconds 6.77336 seconds
5 0.66728 seconds 6.72666 seconds

次はdoctrine/dbalの一番ベーシックなやつです
シンプルになればなるほど早くなりますね、当たり前ですけど
doctrine/dbalのクエリービルダーは当然ながらこれより遅くなるので、
illuminate/databseのクエリービルダーと同等くらいか、少し早いくらいじゃないかと予想


 

for($i = 0; $i < 1000; $i++) {
    $db->executeUpdate(
        "INSERT INTO performances (id, value) VALUES(:id, :value)",
        ['id' => $i, 'value'=>"{$i}"]
    );
}

■PDO

  1000レコード 10000レコード
1 0.46349 seconds 5.81560 seconds
2 0.46661 seconds 4.83245 seconds
3 0.46941 seconds 5.22455 seconds
4 0.46717 seconds 4.87937 seconds
5 0.46775 seconds 4.88480 seconds

この中ではPDOが最も高速です
当然ですが、利用したライブラリはどれもPDOを拡張したものですから、
オリジナルより遅いのはあたり前です

色んなデータベースのマイクロベンチマークをやる前についでにやってみました
 

about ytake

執筆に参加しています


Laravel お役立ち情報

share



このエントリーをはてなブックマークに追加

Categories

laravel 45

DTM 0

music 0

PHP全般 31

0

JAPAN 1

WORLD 1

javascript 4

RDBMS 1

NoSQL 1

NewSQL 1

Recent Posts

Ad

comments powered by Disqus

GitHub

Social Links

Author


クリエイティブ・コモンズ・ライセンス
Yuuki Takezawa 作『Ytake Blog』はクリエイティブ・コモンズ 表示 - 非営利 4.0 国際 ライセンス で提供されています。

© ytake/comnect All Rights Reserved. 2014