Blog::kobaken

prove t/foo/bar/baz.t

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

[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

  • v5.38 の場合 GitHub - kfly8/bench-perl-class-builder at v5.38
    • この新しいclass構文は、最もメモリ効率が良く、コンストラクタやオブジェクトのアクセサーは、配列リファレンスをblessした時と同等のパフォーマンスでした。(最も利用されるハッシュリファレンスのblessよりパフォーマンスが良かったです。)
  • v5.40 の場合 GitHub - kfly8/bench-perl-class-builder at v5.40
    • この新しいclass構文は、最もメモリ効率が良かったです。
    • コンストラクタは、配列リファレンスをblessしたときと同等のパフォーマンスでした。
    • オブジェクトのアクセサーは、ハッシュリファレンスをblessしたときと同等のパフォーマンスでした。

実行環境

  ❯ inxi -SCm
  System:
    Host: kfly8.local Kernel: 23.1.0 arch: arm64 bits: 64 Console: s006 OS: Darwin 23.1.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.040000)
257.9 KB 89.90% bless arrayref
265.7 KB 95.60% Object::Pad@0.808
359.5 KB 164.80% Mouse@v2.5.10
359.5 KB 164.80% Moo@2.005005
359.5 KB 164.80% Moose@2.2207 (XSAccessor)
359.5 KB 164.80% Object::Tiny@1.09
359.5 KB 164.80% Moo@2.005005 (XSConstructor + XSAccessor)
359.5 KB 164.80% Class::Tiny@1.008
359.5 KB 164.80% Moose@2.2207
359.5 KB 164.80% bless hashref
359.5 KB 164.80% Class::Accessor::Lite@0.08

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

コンストラクタの比較

Rate Compare Title
550/s -59% Class::Tiny@1.008
752/s -44% Moose@2.2207
752/s -44% Moose@2.2207 (XSAccessor)
931/s -30% Moo@2.005005
1081/s -19% Moo@2.005005 (XSConstructor + XSAccessor)
1152/s -14% Mouse@v2.5.10
1195/s -10% Object::Pad@0.808
1334/s -- class feature (perl: 5.040000)
1347/s 1% bless arrayref
1674/s 25% bless hashref
1690/s 27% Class::Accessor::Lite@0.08
1729/s 30% Object::Tiny@1.09

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

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

Rate Compare Title
93699/s -26% Object::Pad@0.808
100485/s -20% Class::Accessor::Lite@0.08
120302/s -5% Moo@2.005005
123675/s -2% Class::Tiny@1.008
124842/s -1% Moose@2.2207
126030/s -- class feature (perl: 5.040000)
127242/s 1% bless hashref
137846/s 9% bless arrayref
156038/s 24% Object::Tiny@1.09
223418/s 77% Moose@2.2207 (XSAccessor)
236307/s 87% Mouse@v2.5.10
267962/s 113% Moo@2.005005 (XSConstructor + XSAccessor)

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

リポジトリ

github.com


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