提交 e9b87269 编写于 作者: S sherman

6975829: Perf. of gzip in existing JDKs is too slower than in 1.3.1

Summary: Improved memory/buffer handling in Inflater.c
Reviewed-by: alanb
上级 cace9cb4
...@@ -116,13 +116,27 @@ Java_java_util_zip_Inflater_inflateBytes(JNIEnv *env, jobject this, jlong addr, ...@@ -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;
/*
in_buf = (jbyte *) malloc(this_len); * 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(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, ...@@ -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, ...@@ -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;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册