[Updated]
- (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、次の環境で試してみたところ、結論、この新しい構文は、最もメモリ効率が良く、コンストラクタやオブジェクトのアクセサーは、配列リファレンスを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 を利用して算出しています。