Mathieu Suen a écrit :
Hi,

I am doing dome benchmark and I see the method Zend_Form_Element::getAttribs is taking a lot of time. By looking of the code it seems that the get_object_vars consum a lot of time.

And since there is 25 inst var that are protected/private it don't return a lot of attribs.

By looking of all the subclasses I can see that most of the time there is the helper that are redefine and a few attribut add.

So I propose to change the setAttrib so that we cache all the attribs name and we can then retrive the attrib without using get_object_vars and doing the big foreach loop.

What do you think?
Thanks


See attach file to see what it can look like.

--
-- Mathieu Suen
--
--- global/library/Zend/Form/.svn/text-base/Element.php.svn-base        
2009-07-06 08:38:16.000000000 +0200
+++ global/library/Zend/Form/Element.php        2009-07-21 09:34:16.000000000 
+0200
@@ -195,6 +195,11 @@ class Zend_Form_Element implements Zend_
      */
     protected $_view;
 
+       /**
+        * @var array
+        */
+       protected $_attribsName = array();
+
     /**
      * Constructor
      *
@@ -227,6 +232,12 @@ class Zend_Form_Element implements Zend_
             throw new Zend_Form_Exception('Zend_Form_Element requires each 
element to have a name');
         }
 
+               $this->_attribsName[] = 'helper';
+               $this->_attribsName[] = 'multiple';
+               $this->_attribsName[] = 'options';
+               $this->_attribsName[] = 'src';
+               $this->_attribsName[] = 'checked';
+               $this->_attribsName[] = 'class';
         /**
          * Extensions
          */
@@ -793,6 +804,7 @@ class Zend_Form_Element implements Zend_
             unset($this->$name);
         } else {
             $this->$name = $value;
+                       $this->_attribsName[] = $name;
         }
 
         return $this;
@@ -836,10 +848,10 @@ class Zend_Form_Element implements Zend_
      */
     public function getAttribs()
     {
-        $attribs = get_object_vars($this);
-        foreach ($attribs as $key => $value) {
-            if ('_' == substr($key, 0, 1)) {
-                unset($attribs[$key]);
+               $attribs = array();
+        foreach ($this->_attribsName as $name) {
+            if (isset($this->$name)) {
+                $attribs[$name] = $this->$name;
             }
         }
 

Reply via email to