Blog::kobaken

prove t/foo/bar/baz.t

Perlの新しいclass構文と、今までよく使ってたクラスビルダーを比較するベンチマーク[追記あり]

[Updated]

What's this?

Perl 5.38 で、Perlのコアにclass構文が新たに入りました。この新しいクラス構文と今までよく使ってたクラスビルダーを比較するベンチマークをしてみました。このclass構文の設計を主導したOvidのブログで、こんなことが書かれていたのもあって調べてみました。

Note that it’s not taking anything away from Perl; it’s adding a core object system for better memory consumption, performance, and elegance.
https://ovid.github.io/articles/corinna-in-the-perl-core.html
( メモリ消費、パフォーマンス、エレガンスさが改善されたコアのオブジェクトシステムを追加することがポイントで、Perlから何かを取り去っているわけではありません。)
( 翻訳: https://kfly8.hatenablog.com/entry/2023/07/11/084622 )

このclass構文はまだ実験的な段階なので、今後の開発次第で結果は変わってくると思いますが1、次の環境で試してみたところ、結論、この新しい構文は、最もメモリ効率が良く、コンストラクタやオブジェクトのアクセサーは、配列リファレンスをblessした時と同等のパフォーマンスでした。(最も利用されるハッシュリファレンスのblessよりパフォーマンスが良かったです。)

実行環境

  ❯ inxi -SCm
  System:
    Host: kfly8.local Kernel: 22.3.0 arch: arm64 bits: 64 Console: s004 OS: Darwin 22.3.0
  Memory:
    System RAM: total: N/A available: N/A used: N/A
    RAM Report: missing: Required tool dmidecode not installed. Check --recommends
  CPU:
    Info: 10-core model: Apple M2 Pro bits: 64 type: MCP
    Speed: N/A min/max: N/A cores: No OS support for core speeds.

メモリの利用の比較

Size Compare Title
135.8 KB -- class feature (perl: 5.038000)
257.9 KB 89.9% bless arrayref
265.7 KB 95.6% Object::Pad@0.79
359.5 KB 164.8% bless hashref
359.5 KB 164.8% Moo@2.005004
359.5 KB 164.8% Class::Accessor::Lite@0.08
359.5 KB 164.8% Moose@2.2206
359.5 KB 164.8% Moo@2.005004 (XSConstructor + XSAccessor)
359.5 KB 164.8% Object::Tiny@1.09
359.5 KB 164.8% Mouse@v2.5.10
359.5 KB 164.8% Moose@2.2206 (XSAccessor)
359.5 KB 164.8% Class::Tiny@1.008

この結果は bench-size.pl を利用して算出しています。

コンストラクタの比較

Rate Compare Title
473/s -61% Class::Tiny@1.008
636/s -47% Moose@2.2206
675/s -44% Moose@2.2206 (XSAccessor)
720/s -40% Object::Pad@0.79
777/s -35% Moo@2.005004
1053/s -12% Moo@2.005004 (XSConstructor + XSAccessor)
1141/s -5% Mouse@v2.5.10
1189/s -1% bless arrayref
1199/s -- class feature (perl: 5.038000)
1658/s 38% bless hashref
1662/s 39% Class::Accessor::Lite@0.08
1690/s 41% Object::Tiny@1.09

この結果は bench-new.pl を利用して算出しています。

オブジェクトのアクセサーの比較

Rate Compare Title
81146/s -41% Object::Pad@0.79
97206/s -29% Class::Accessor::Lite@0.08
111203/s -19% Moose@2.2206
117507/s -14% Moo@2.005004
119218/s -13% bless hashref
121662/s -11% bless arrayref
130453/s -4% Class::Tiny@1.008
136532/s -- class feature (perl: 5.038000)
165414/s 21% Object::Tiny@1.09
214369/s 57% Moose@2.2206 (XSAccessor)
229681/s 68% Mouse@v2.5.10
273066/s 100% Moo@2.005004 (XSConstructor + XSAccessor)

この結果は bench-field.pl を利用して算出しています。

リポジトリ

github.com


  1. 今回、アクセサーで最も性能がよかったのは、圧倒的に Mouseでした。この違いは、アクセサがXSで動作するかどうかの違いだと思います。class featureには、今後、アクセサを生やす :reader 修飾子が追加される予定ですが、それが追加された際、またベンチマークを取ってみたいと思います。