> > > The patch below is only for purpose of showing the problem and 
> > > possible solution and it surely requires more work.
> > > First part in php code contains also profiling code to show 
> > > the difference.
> > 
> > > 
> > > In my case it came from above 7 seconds down to 1.2 second.
> > > 
> > > I'm interested in Your opinions on this.
> > 
> > It's very interesting, on my box I have 50% speed up on Opera 9.27
> > and 10% on FF3.
> > 
> 
> I forgot to mention that I was testing it on set of 200 messages
> (regarding time advantage mentioned in my first post).
> 
> One more thing that appeared in the meantime. In patch given
> I didn't take under consideration adding new messages to the
> existing list. When initiating off-DOM tbody element, it should
> be clone of this.list.tBodies[0]. So proper init_off_list function
> should look like this:
> 
> init_off_list: function()
> {
>   this.off_list = this.list.tBodies[0].cloneNode(true); 
> },

That was actually a bit half-baked idea :/
This way it seems to loose event handlers.

Corrected version of patch uses former method for list updates.
Will check twice next time before posting anything. 
Sorry for making a mess...

diff -ur roundcube/program/include/rcube_json_output.php 
roundcube_test/program/include/rcube_json_output.php
--- roundcube/program/include/rcube_json_output.php     2008-05-19 
13:19:16.000000000 +0200
+++ roundcube_test/program/include/rcube_json_output.php        2008-05-20 
18:51:50.342518104 +0200
@@ -213,14 +213,18 @@
     private function get_js_commands()
     {
         $out = '';
+       //$out .= "timeslist = new Array();";        
        
+       //$out .= "time1 = new Date();\n";      
        if (sizeof($this->env))
            $out .= 'this.set_env('.json_serialize($this->env).");\n";
-        
+       //$out .= "time2 = new Date();\ntimeslist[timeslist.length] = (time2 - 
time1);\n";
+       //$out .= "time1 = new Date();\n";      
         foreach($this->texts as $name => $text) {
             $out .= sprintf("this.add_label('%s', '%s');\n", $name, JQ($text));
         }
-
+       //$out .= "time2 = new Date();\ntimeslist[timeslist.length] = (time2 - 
time1);\n";
+        //$out .= "time1 = new Date();\n";     
         foreach ($this->commands as $i => $args) {
             $method = array_shift($args);
             foreach ($args as $i => $arg) {
@@ -232,8 +236,11 @@
                 preg_replace('/^parent\./', '', $method),
                 implode(',', $args)
             );
-        }
 
+        }
+       //$out .= "time2 = new Date();\ntimeslist[timeslist.length] = (time2 - 
time1);\n";
+       
+       //$out .= "times = '';\nfor (i=0; i < timeslist.length; i++) times = 
times+', '+timeslist[i];\nalert(times);\n";
         return $out;
     }
 }
diff -ur roundcube/program/js/app.js roundcube_test/program/js/app.js
--- roundcube/program/js/app.js 2008-05-19 13:19:53.000000000 +0200
+++ roundcube_test/program/js/app.js    2008-05-20 18:05:14.679523480 +0200
@@ -373,7 +373,7 @@
       }
 
     // set eventhandler to message icon
-    if ((row.icon = row.obj.cells[0].childNodes[0]) && 
row.icon.nodeName=='IMG')
+    if ((row.icon = 
row.obj.getElementsByTagName('TD')[0].getElementsByTagName('IMG')[0]))
       {
       var p = this;
       row.icon.id = 'msgicn_'+row.uid;
@@ -3227,13 +3227,31 @@
       }
   };
 
+  this.prepare_message_list = function()
+    {
+    this.message_list.init_off_list();
+    };
+
+  this.flush_message_list = function()
+    {
+    this.message_list.flush_off_list();
+    };
+
   // create a table row in the message list
   this.add_message_row = function(uid, cols, flags, attachment, attop)
     {
     if (!this.gui_objects.messagelist || !this.message_list)
       return false;
 
-    var tbody = this.gui_objects.messagelist.tBodies[0];
+    if (this.message_list.off_list)
+    {
+       var tbody = this.message_list.off_list;
+    }
+    else
+    {
+       var tbody = this.gui_objects.messagelist.tBodies[0];
+    }
+
     var rowcount = tbody.rows.length;
     var even = rowcount%2;
     
diff -ur roundcube/program/js/list.js roundcube_test/program/js/list.js
--- roundcube/program/js/list.js        2008-05-19 13:19:53.000000000 +0200
+++ roundcube_test/program/js/list.js   2008-05-20 23:34:04.219177552 +0200
@@ -28,6 +28,7 @@
   this.DELETE_KEY = 46;
   
   this.list = list ? list : null;
+  this.off_list = null
   this.frame = null;
   this.rows = [];
   this.selection = [];
@@ -145,13 +146,30 @@
   this.rows[uid] = null;
 },
 
+init_off_list: function()
+{
+  this.off_list = document.createElement('TBODY');
+},
+
+flush_off_list: function()
+{
+  this.list.replaceChild(this.off_list, this.list.tBodies[0]);
+  this.off_list = null;
+},
 
 /**
  *
  */
 insert_row: function(row, attop)
 {
-  var tbody = this.list.tBodies[0];
+  if (this.off_list)
+  {
+    var tbody = this.off_list;
+  }
+  else
+  {
+    var tbody = this.list.tBodies[0];
+  }
 
   if (attop && tbody.rows.length)
     tbody.insertBefore(row, tbody.firstChild);
diff -ur roundcube/program/steps/mail/func.inc 
roundcube_test/program/steps/mail/func.inc
--- roundcube/program/steps/mail/func.inc       2008-05-19 13:19:56.000000000 
+0200
+++ roundcube_test/program/steps/mail/func.inc  2008-05-20 23:41:52.483990480 
+0200
@@ -296,7 +296,7 @@
 
 
 // return javascript commands to add rows to the message list
-function rcmail_js_message_list($a_headers, $insert_top=FALSE)
+function rcmail_js_message_list($a_headers, $insert_top=FALSE, 
$use_off_list=FALSE)
   {
   global $CONFIG, $IMAP, $OUTPUT;
 
@@ -310,6 +310,9 @@
 
   $OUTPUT->command('set_message_coltypes', $a_show_cols);
 
+  if ($use_off_list)
+    $OUTPUT->command('prepare_message_list');
+  
   // loop through message headers
   foreach ($a_headers as $n => $header)
     {
@@ -355,6 +358,9 @@
       preg_match("/multipart\/m/i", $header->ctype),
       $insert_top);
     }
+    
+  if ($use_off_list)
+    $OUTPUT->command('flush_message_list');
   }
 
 
diff -ur roundcube/program/steps/mail/list.inc 
roundcube_test/program/steps/mail/list.inc
--- roundcube/program/steps/mail/list.inc       2008-05-19 13:19:56.000000000 
+0200
+++ roundcube_test/program/steps/mail/list.inc  2008-05-20 23:42:18.867979504 
+0200
@@ -55,7 +55,7 @@
 
 // add message rows
 if (isset($a_headers) && count($a_headers))
-  rcmail_js_message_list($a_headers);
+  rcmail_js_message_list($a_headers, FALSE, TRUE);
 else
   $OUTPUT->show_message('nomessagesfound', 'notice');
   
_______________________________________________
List info: http://lists.roundcube.net/dev/

Reply via email to