Here is another way to profile DateTime for the modules it loads at compile
time:
perl -d:TraceUse -MDateTime -c -e0
Here is below the output (latest releases of DateTime, DateTime::Locale,
DateTime::TimeZone on perl 5.20.0).
DateTime::Locale::Catalog is the module that contains all the locales names.
David, is it that module that you worry about or have you found something
worse?
Modules used from -e:
1. DateTime 1.10, -e line 0 [main]
2. strict 1.08, DateTime.pm line 5
3. warnings 1.23, DateTime.pm line 6
4. warnings::register 1.03, DateTime.pm line 7
5. Carp 1.3301, DateTime.pm line 9
6. Exporter 5.70, Carp.pm line 99
7. DateTime::Duration 1.10, DateTime.pm line 10
8. DateTime::Helpers 1.10, DateTime/Duration.pm line 8
9. Scalar::Util 1.38, DateTime/Helpers.pm line 6
10. List::Util 1.38, Scalar/Util.pm line 11
11. XSLoader 0.17, List/Util.pm line 21
12. Params::Validate 1.10, DateTime/Duration.pm line 9
13. Module::Implementation 0.07, Params/Validate.pm line 9
14. Module::Runtime 0.014, Module/Implementation.pm line 12
23. Params::Validate::XS 1.10, Module/Runtime.pm line 317
43. Class::Load::XS 0.08, Module/Runtime.pm line 317
15. Try::Tiny 0.22, Module/Implementation.pm line 13
16. Sub::Name 0.05, Try/Tiny.pm line 18 (eval 4)
17. base 2.22, Sub/Name.pm line 49
18. vars 1.03, base.pm line 4
19. DynaLoader 1.25, base.pm line 99
20. Config 5.020000, DynaLoader.pm line 22
52. DateTime::Locale::en, base.pm line 99
53. DateTime::Locale::root, base.pm line 99
21. constant 1.31, Try/Tiny.pm line 144 [Try::Tiny::ScopeGuard]
22. Params::Validate::Constants 1.10, Params/Validate.pm line 10
24. overload 1.22, DateTime/Duration.pm line 18
25. overloading 0.02, overload.pm line 83
26. DateTime::Locale 0.45, DateTime.pm line 12
27. DateTime::Locale::Base, DateTime/Locale.pm line 10
28. List::MoreUtils 0.33, DateTime/Locale/Base.pm line 8
29. DateTime::Locale::Catalog, DateTime/Locale.pm line 11
30. utf8 1.13, DateTime/Locale/Catalog.pm line 19
51. DateTime::Locale::en_US, DateTime/Locale.pm line 280 (eval 21)
31. DateTime::TimeZone 1.72, DateTime.pm line 13
32. DateTime::TimeZone::Catalog 1.72, DateTime/TimeZone.pm line 10
33. DateTime::TimeZone::Floating 1.72, DateTime/TimeZone.pm line 11
34. parent 0.228, DateTime/TimeZone/Floating.pm line 6
35. Class::Singleton 1.4, parent.pm line 20
36. DateTime::TimeZone::OffsetOnly 1.72, parent.pm line 20
37. DateTime::TimeZone::UTC 1.72,
DateTime/TimeZone/OffsetOnly.pm line 8
38. DateTime::TimeZone::Local 1.72, DateTime/TimeZone.pm line 12
39. Class::Load 0.21, DateTime/TimeZone/Local.pm line 6
40. Data::OptList 0.109, Class/Load.pm line 10
41. Params::Util 1.07, Data/OptList.pm line 10
42. Sub::Install 0.927, Data/OptList.pm line 11
44. File::Spec 3.47, DateTime/TimeZone/Local.pm line 8
45. File::Spec::Unix 3.47, File/Spec.pm line 22
46. POSIX 1.38_03, DateTime.pm line 16
47. Fcntl 1.11, POSIX.pm line 17
48. Tie::Hash 1.05, POSIX.pm line 422 [POSIX::SigRt]
49. integer 1.01, DateTime.pm line 756
50. DateTime::Infinite 1.10, DateTime.pm line 68
Possible proxies:
3 base.pm line 99, sub base::import
2 Module/Runtime.pm line 317, sub Module::Runtime::require_module
2 parent.pm line 20, sub parent::import
2014-08-05 23:06 GMT+02:00 David E. Wheeler <[email protected]>:
> DateTimers,
>
> While profiling Sqitch, I found that the biggest suck on its time (now
> that I have removed Moose and Mouse in favor of Moo) is DateTime. The
> reason? It loads all of the locales in its BEGIN block. Run this to see for
> yourself:
>
> perl -d:NYTProf -e 'use DateTime;' && nytprofhtml --open
>
> Here's the topline:
> Top 15 Subroutines CallsP FExclusive
> Time Inclusive
> TimeSubroutine 4661 115.6ms 24.4ms DateTime::Locale::_register 1 11 11.2ms
> 119ms main::BEGIN@1 4682 28.65ms 8.65ms Params::Validate::XS::validate
> (xsub) 1 11 8.29ms8.50ms DateTime::Locale::BEGIN@11 99 65.23ms 6.44ms
> base::import (recurses: max depth 2, inclusive time 1.79ms) 1 11 3.65ms
> 7.98ms DateTime::BEGIN@16 11 13.53ms 4.54msDateTime::TimeZone::Local::
> BEGIN@8 1 11 3.22ms21.6ms DateTime::BEGIN@13 11 12.99ms 3.08ms
> DateTime::TimeZone::BEGIN@8 1 11 2.97ms3.19ms DateTime::BEGIN@9 11 12.91ms
> 4.26ms DateTime::Locale::BEGIN@10 1 11 2.74ms6.58ms DateTime::Locale::
> add_aliases 2424 182.73ms 2.97ms Exporter::import 1 11 2.53ms2.87ms
> Try::Tiny::ScopeGuard::BEGIN@144 11 12.38ms 3.00ms Data::OptList::BEGIN@10
>
> Does DateTime *really* need to always load all 466 locales on startup?
> Couldn't it load them on demand?
>
> Thanks,
>
> David
>
>