[Updated]
- (2025-10-30 0:13 JST) update to v5.42 benchmarked & optimize Classical Core Class Implementations #10 (Thanks @bodo-hugo-barwich )
- (2024-06-10 11:13 JST) v5.40 のベンチマーク内容に変更しました。 GitHub - kfly8/bench-perl-class-builder at v5.40
- (2023-08-22 21:30 JST) 次のプルリクエストを反映して、ベンチマークを行いました。 Thanks @bbrtj
- (2023-08-22 15:30 JST) 次のプルリクエストを反映して、ベンチマークを行いました。 Thanks @bbrtj
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.