Hi,

I posted on gitter, and G+ with this issue, but it seems perhaps that this 
is the correct place to post.

I noticed a significant performance regression when compiling my heavy GWT 
application with 2.8.0-RC1. The slowdown was an order of magnitude slower 
on Chrome 10x, on Firefox 3x, and on IE 2x.

I've been developing this application for a number of years, and it 
involves client side parsing of text. It makes heavy use of generated code, 
and therefore it uses a lot of string functions.

I've managed to use the *Chrome debugger *to narrow the location of the 
regression down to the new 2.8.0 implementation of 
"*java.lang.String.valueOf(char 
data[], int offset, int count)*".

*2.7.0 - Baseline implementation*


Here is a partial implementation of *java.lang.String.valueOf(char data[], 
int offset, int count) *in 2.7.0.

function *java_lang_String_valueOf___3CIILjava_lang_String_2*(x_0, offset, 
count){
  var end;
  end = offset + count;
  java_lang_String__1_1checkBounds__IIIV(x_0.length, offset, end);
  return java_lang_String__1_1valueOf___3CIILjava_lang_String_2(x_0, 
offset, end);
}
 

*2.8.0 RC1 - New Implementation - with regression*

function *java_lang_String_valueOf___3CIILjava_lang_String_2*(x_0, offset, 
count){
  java_lang_String_$clinit__V();
  var batchEnd, batchStart, end, s;
  end = offset + count;
  
javaemul_internal_InternalPreconditions_checkCriticalStringBounds__IIIV(offset, 
end, x_0.length);
  s = '';
  for (batchStart = offset; batchStart < end;) {
    batchEnd = batchStart + $intern_13 < end?batchStart + $intern_13:end;
    s += 
java_lang_String_fromCharCode___3Ljava_lang_Object_2Ljava_lang_String_2(x_0.slice(batchStart,
 
batchEnd));
    batchStart = batchEnd;
  }
  return s;
}


*My Fix*

My fix is to simply return the 2.7.0 implementation whist making use of the 
new 
 'javaemul_internal_InternalPreconditions_checkCriticalStringBounds__IIIV' 
method, and changing the order of the parameters versus the old 
'java_lang_String__1_1checkBounds__IIIV' method. I also create a supporting 
function that does not seem to be present in my 2.8.0 generated code:

function *java_lang_String_valueOf___3CIILjava_lang_String_2*(x_0, offset, 
count){
  var end;
  end = offset + count;
  
javaemul_internal_InternalPreconditions_checkCriticalStringBounds__IIIV(offset, 
end, x_0.length);
  return java_lang_String__1_1valueOf___3CIILjava_lang_String_2(x_0, 
offset, end);
}

// COPIED FROM 2.7.0
function *java_lang_String__1_1valueOf___3CIILjava_lang_String_2*(x_0, 
start_0, end){
  var s = '';
  for (var batchStart = start_0; batchStart < end;) {
    var batchEnd = Math.min(batchStart + 10000, end);
    s += String.fromCharCode.apply(null, x_0.slice(batchStart, batchEnd));
    batchStart = batchEnd;
  }
  return s;
}


*Summary*

Upon manually updating the generated (prettified) GWT 2.8.0 compiler 
output, I record that not only does the regression disappear, but the 2.8.0 
shows a 30% speed boost over 2.7 (in Chrome). That's approx 13x faster than 
prior to the change. Obviously this speed boost is very specific to my own 
use-case (which is extremely string heavy)

I don't really know why the 2.7.0 implementation is so much faster than the 
2.8.0 implementation. There are a lot of secret optimizations that occur in 
JavaScript engines and mastering performance is nigh on impossible. All I 
can say is that I tested and observed a 10x performance regression on 
Chrome, 3x on Firefox, and 2x on IE with the new 2.8 code, although I 
realise that a test harness would really help to prove the regression. I 
wonder if someone can put one together?

Regards,

Chris 

-- 
You received this message because you are subscribed to the Google Groups "GWT 
Contributors" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to google-web-toolkit-contributors+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/google-web-toolkit-contributors/94423f7c-3c9e-4eae-a965-38885f035d05%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to