Big optimization for get_method_list
Dave Rolsky [Sat, 14 Aug 2010 16:54:30 +0000 (18:54 +0200)]
By checking for a CODE slot in the glob, we can avoid a lot of calls to
->has_method, which is quite expensive.

This seems to provide a speedup of approximately 10% when compiling
Markdent::Simple::Document (and all the classes it loads in turn).

lib/Class/MOP/Mixin/HasMethods.pm

index 8e38d5e..bc5b09c 100644 (file)
@@ -149,7 +149,11 @@ sub remove_method {
 
 sub get_method_list {
     my $self = shift;
-    return grep { $self->has_method($_) } keys %{ $self->namespace };
+
+    my $namespace = $self->namespace;
+
+    return grep { *{ $namespace->{$_} }{CODE} && $self->has_method($_) }
+        keys %{$namespace};
 }
 
 1;