以下の内容はhttps://kfly8.hatenablog.com/entry/2023/08/12/204502より取得しました。


Perlの新しいclass構文と、今までよく使ってたクラスビルダーを比較するベンチマーク[2025-10-30 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したときと同等のパフォーマンスでした。

Execution Environment

* Operating System:
PRETTY_NAME="Debian GNU/Linux 13 (trixie)"
NAME="Debian GNU/Linux"
VERSION_ID="13"
VERSION="13 (trixie)"
VERSION_CODENAME=trixie
DEBIAN_VERSION_FULL=13.1
-- https://github.com/kfly8/bench-perl-class-builder/blob/1549f173d9b93c252d73019079b0feb7620bfa84/.github/workflows/benchmark-debian-trixie.yml#L23-L28

Benchmark memory size

Size Compare Title
163.1 KB -- class feature (perl: 5.042000)
257.9 KB 58.10% bless arrayref
265.7 KB 62.90% Object::Pad@0.821
359.5 KB 120.40% Moose@2.4000 (XSAccessor)
359.5 KB 120.40% Moo@2.005005 (XSConstructor + XSAccessor)
359.5 KB 120.40% Class::Tiny@1.008
359.5 KB 120.40% Class::Accessor::Lite@0.08
359.5 KB 120.40% Moose@2.4000
359.5 KB 120.40% Object::Tiny@1.09
359.5 KB 120.40% Moo@2.005005
359.5 KB 120.40% Mouse@v2.5.11
359.5 KB 120.40% bless hashref

This result were calculated using bench-size.pl.

Benchmark object constructors

Rate Compare Title
301/s -65% Class::Tiny@1.008
431/s -50% Moose@2.4000 (XSAccessor)
432/s -50% Moose@2.4000
550/s -36% Moo@2.005005
550/s -36% Moo@2.005005 (XSConstructor + XSAccessor)
627/s -27% Mouse@v2.5.11
684/s -20% Object::Pad@0.821
760/s -12% bless arrayref
861/s -- class feature (perl: 5.042000)
1028/s 19% bless hashref
1046/s 22% Class::Accessor::Lite@0.08
1090/s 27% Object::Tiny@1.09

This result were calculated using bench-new.pl.

Benchmark access to object fields

Rate Compare Title
24093/s -26% Object::Pad@0.821
29538/s -9% Class::Accessor::Lite@0.08
31210/s -4% Moose@2.4000
32581/s -- class feature (perl: 5.042000)
33998/s 4% Class::Tiny@1.008
34600/s 6% Moo@2.005005
41155/s 26% bless hashref
42708/s 31% bless arrayref
44246/s 36% Object::Tiny@1.09
55137/s 69% Moose@2.4000 (XSAccessor)
59077/s 81% Mouse@v2.5.11
71739/s 120% Moo@2.005005 (XSConstructor + XSAccessor)

This result were calculated using bench-field.pl.

リポジトリ

github.com


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



以上の内容はhttps://kfly8.hatenablog.com/entry/2023/08/12/204502より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14