6975829: Perf. of gzip in existing JDKs is too slower than in 1.3.1
Improved memory/buffer handling in Inflater.c Reviewed-by: alanb
This commit is contained in:
parent
14a7edc2ad
commit
2e08a82953
@ -116,13 +116,27 @@ Java_java_util_zip_Inflater_inflateBytes(JNIEnv *env, jobject this, jlong addr,
|
|||||||
jbyte *in_buf;
|
jbyte *in_buf;
|
||||||
jbyte *out_buf;
|
jbyte *out_buf;
|
||||||
int ret;
|
int ret;
|
||||||
|
/*
|
||||||
|
* Avoid excess copying.
|
||||||
|
* zlib stream usually has a few bytes of overhead for header info
|
||||||
|
* (depends on the underlying data)
|
||||||
|
*
|
||||||
|
* (a) 5 bytes per 16KB
|
||||||
|
* (b) 6 bytes for entire stream
|
||||||
|
* (c) 4 bytes for gzip header
|
||||||
|
* (d) 2 bytes for crc
|
||||||
|
*
|
||||||
|
* Use 20 bytes as the "safe cutoff" number.
|
||||||
|
*/
|
||||||
|
jint in_len = MIN(this_len, len + 20);
|
||||||
|
jint consumed;
|
||||||
|
|
||||||
in_buf = (jbyte *) malloc(this_len);
|
in_buf = (jbyte *) malloc(in_len);
|
||||||
if (in_buf == 0) {
|
if (in_buf == 0) {
|
||||||
JNU_ThrowOutOfMemoryError(env, 0);
|
JNU_ThrowOutOfMemoryError(env, 0);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
(*env)->GetByteArrayRegion(env, this_buf, this_off, this_len, in_buf);
|
(*env)->GetByteArrayRegion(env, this_buf, this_off, in_len, in_buf);
|
||||||
|
|
||||||
out_buf = (jbyte *) malloc(len);
|
out_buf = (jbyte *) malloc(len);
|
||||||
if (out_buf == 0) {
|
if (out_buf == 0) {
|
||||||
@ -133,7 +147,7 @@ Java_java_util_zip_Inflater_inflateBytes(JNIEnv *env, jobject this, jlong addr,
|
|||||||
|
|
||||||
strm->next_in = (Bytef *) in_buf;
|
strm->next_in = (Bytef *) in_buf;
|
||||||
strm->next_out = (Bytef *) out_buf;
|
strm->next_out = (Bytef *) out_buf;
|
||||||
strm->avail_in = this_len;
|
strm->avail_in = in_len;
|
||||||
strm->avail_out = len;
|
strm->avail_out = len;
|
||||||
ret = inflate(strm, Z_PARTIAL_FLUSH);
|
ret = inflate(strm, Z_PARTIAL_FLUSH);
|
||||||
|
|
||||||
@ -148,16 +162,16 @@ Java_java_util_zip_Inflater_inflateBytes(JNIEnv *env, jobject this, jlong addr,
|
|||||||
(*env)->SetBooleanField(env, this, finishedID, JNI_TRUE);
|
(*env)->SetBooleanField(env, this, finishedID, JNI_TRUE);
|
||||||
/* fall through */
|
/* fall through */
|
||||||
case Z_OK:
|
case Z_OK:
|
||||||
this_off += this_len - strm->avail_in;
|
consumed = in_len - strm->avail_in;
|
||||||
(*env)->SetIntField(env, this, offID, this_off);
|
(*env)->SetIntField(env, this, offID, this_off + consumed);
|
||||||
(*env)->SetIntField(env, this, lenID, strm->avail_in);
|
(*env)->SetIntField(env, this, lenID, this_len - consumed);
|
||||||
return len - strm->avail_out;
|
return len - strm->avail_out;
|
||||||
case Z_NEED_DICT:
|
case Z_NEED_DICT:
|
||||||
(*env)->SetBooleanField(env, this, needDictID, JNI_TRUE);
|
(*env)->SetBooleanField(env, this, needDictID, JNI_TRUE);
|
||||||
/* Might have consumed some input here! */
|
/* Might have consumed some input here! */
|
||||||
this_off += this_len - strm->avail_in;
|
consumed = in_len - strm->avail_in;
|
||||||
(*env)->SetIntField(env, this, offID, this_off);
|
(*env)->SetIntField(env, this, offID, this_off + consumed);
|
||||||
(*env)->SetIntField(env, this, lenID, strm->avail_in);
|
(*env)->SetIntField(env, this, lenID, this_len - consumed);
|
||||||
return 0;
|
return 0;
|
||||||
case Z_BUF_ERROR:
|
case Z_BUF_ERROR:
|
||||||
return 0;
|
return 0;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user