NAME
Class::Accessor::Fast::GXS - generate C::A::Fast compatible XS accessors
DESCRIPTION
This module allows you to generate a XS code for accessors you need your classes. It's implemented on top of Class::Accessor::Fast and fallbacks to it when it's not possible to access C library.
This code is quite experimental and API for generating XS is not settled down. It's up to you to try and suggest the way you want generator to work.
USAGE
Setup inheritance from Class::Accessor::Fast::GXS
The top of a Makefile.PL
BEGIN {
use Class::Accessor::Fast::GXS;
local $Class::Accessor::Fast::XS::GENERATE_TO = "TAccessors.xs";
local $Class::Accessor::Fast::XS::MODULE = "My::TAccessors";
require "lib/My/TAccessors.pm";
};
use inc::Module::Install;
...
It generates TAccessors.xs from mk*accessor calls in your modules.
See also example dir in the tarball.
REQUEST FOR IDEAS
There are some things that must be considered before running this in production:
- Installation
-
Module::Install system installs your module into arch specific dirs when it has XS code, I don't think it the right way. I think your module should be installed in the old way except for binary parts.
- Generation
-
The current API for generation is kind cryptic still and subject to change.
- Compilation
-
I think that your modules should still be installable when people have no compiler.
- CPU cache
-
The module may gen a lot of subs in one object file and I have no enough C-fu to say what is the best way to re-organize the code to make object file smaller, CPU cache effective and don't loose overall performance.
PERFORMANCE
Here is comparings:
Rate get_caf get_dummy_sub get_cafgxs get_dummy_ha
get_caf 767999/s -- -26% -62% -80%
get_dummy_sub 1037900/s 35% -- -49% -73%
get_cafgxs 2016491/s 163% 94% -- -48%
get_dummy_ha 3855058/s 402% 271% 91% --
Rate set_one_caf set_one_dummy_sub set_one_cafgxs set_one_dummy_ha
set_one_caf 568700/s -- -35% -72% -83%
set_one_dummy_sub 877713/s 54% -- -57% -74%
set_one_cafgxs 2029875/s 257% 131% -- -39%
set_one_dummy_ha 3317254/s 483% 278% 63% --
Rate set_multi_caf set_multi_dummy_sub set_multi_cafgxs set_multi_dummy_ha
set_multi_caf 548746/s -- -4% -74% -84%
set_multi_dummy_sub 573439/s 4% -- -73% -83%
set_multi_cafgxs 2117316/s 286% 269% -- -38%
set_multi_dummy_ha 3389792/s 518% 491% 60% --
Rate mix_caf mix_dummy_sub mix_cafgxs mix_dummy_ha
mix_caf 195491/s -- -10% -68% -80%
mix_dummy_sub 216392/s 11% -- -65% -78%
mix_cafgxs 613304/s 214% 183% -- -39%
mix_dummy_ha 998734/s 411% 362% 63% --
Where "caf" is Class::Accessor::Fast, "cafgxs" is generated, "dummy_sub" is a perl sub that do just what we need and nothing else and "dummy_ha" is just dirrect hash access.
See also example dir in the tarball.
AUTHOR
Ruslan Zakirov <ruz@bestpractical.com>
LICENSE
This library is free software, you can redistribute it and/or modify it under the same terms as Perl itself.