Accepting request 138143 from home:mvyskocil:branches:devel:libraries:c_c++
- add longest_match performance patch (fate#314093) * suggested by IBM, sent upstream - rename the main library package to libz1 according Shared Library Policy - profiling build can be enabled via build --with profiling - use the human-readable package description from zlib.net - add rpmlintrc OBS-URL: https://build.opensuse.org/request/show/138143 OBS-URL: https://build.opensuse.org/package/show/devel:libraries:c_c++/zlib?expand=0&rev=4
This commit is contained in:
parent
32d9e928f6
commit
e8b526b295
@ -1,3 +1,3 @@
|
|||||||
zlib
|
libz1
|
||||||
targettype x86 provides "baselibs-x86:<prefix>/lib/libz.so.1"
|
targettype x86 provides "baselibs-x86:<prefix>/lib/libz.so.1"
|
||||||
zlib-devel
|
zlib-devel
|
||||||
|
105
zlib-1.2.7-improve-longest_match-performance.patch
Normal file
105
zlib-1.2.7-improve-longest_match-performance.patch
Normal file
@ -0,0 +1,105 @@
|
|||||||
|
# http://mail.madler.net/pipermail/zlib-devel_madler.net/2012-June/002907.html
|
||||||
|
# http://mail.madler.net/pipermail/zlib-devel_madler.net/2012-August/002977.html
|
||||||
|
From: Andreas Krebbel krebbel at linux.vnet.ibm.com
|
||||||
|
Subject: RFC: Improve longest_match performance
|
||||||
|
|
||||||
|
The code currently generated for longest_match looks far from optimal
|
||||||
|
due to a bunch of pointless zero/sign extend instructions.
|
||||||
|
|
||||||
|
By just promoting a few data types in the function I was able to get
|
||||||
|
rid of all but two. The new hotloop is almost half the size of the
|
||||||
|
original version providing quite a performance win for S/390:
|
||||||
|
|
||||||
|
Measured on a zEnterprise z196
|
||||||
|
zlib compiled with upstream GCC 4.8 branch
|
||||||
|
|
||||||
|
32 bit old new
|
||||||
|
|
||||||
|
256MB randomdata: 11.65s 10.92s 6.68%
|
||||||
|
100MB manpages: 4.23s 4.14s 2.17%
|
||||||
|
217MB PDF: 10.54s 9.44s 11.65%
|
||||||
|
|
||||||
|
unaligned ok
|
||||||
|
|
||||||
|
256MB randomdata: 10.90s 10.54s 3.41%
|
||||||
|
100MB manpages: 3.94s 3.87s 1.81%
|
||||||
|
217MB PDF: 8.77s 8.64s 1.50%
|
||||||
|
|
||||||
|
64 bit old new
|
||||||
|
|
||||||
|
256MB randomdata: 11.90s 11.43s 4.11%
|
||||||
|
100MB manpages: 4.51s 4.44s 1.58%
|
||||||
|
217MB PDF: 10.11s 9.89s 2.22%
|
||||||
|
|
||||||
|
unaligned ok
|
||||||
|
|
||||||
|
256MB randomdata: 11.51s 11.15s 3.23%
|
||||||
|
100MB manpages: 4.33s 3.99s 8.52%
|
||||||
|
217MB PDF: 9.81s 9.02s 8.76%
|
||||||
|
|
||||||
|
I also did some measurements on x86 and Power:
|
||||||
|
|
||||||
|
For Power (64 bit, unaligned_ok) an additional zero extend
|
||||||
|
appears. However, the impact is not measurable. There are minor wins
|
||||||
|
and minor regressions. The overall result is flat.
|
||||||
|
|
||||||
|
For Core2 32 bit the patch is a clear winner with up to 9% for the pdf
|
||||||
|
test. Also on 64 bit the code optimized for Core2 gets a bit smaller
|
||||||
|
but unfortunately causes some regressions which I cannot explain.
|
||||||
|
|
||||||
|
For mainframe customers the performance of zlib is very important so I
|
||||||
|
would be very happy to see the patch integrated into upstream
|
||||||
|
zlib. Given that the patch might cause minor regressions on other
|
||||||
|
targets, would it be possible to enable it arch-dependent?
|
||||||
|
|
||||||
|
See below for the patch and some code snippets from my tests.
|
||||||
|
|
||||||
|
Bye,
|
||||||
|
|
||||||
|
-Andreas-
|
||||||
|
|
||||||
|
---
|
||||||
|
deflate.c | 15 ++++++++-------
|
||||||
|
1 file changed, 8 insertions(+), 7 deletions(-)
|
||||||
|
|
||||||
|
Index: zlib-1.2.7/deflate.c
|
||||||
|
===================================================================
|
||||||
|
--- zlib-1.2.7.orig/deflate.c 2012-02-13 01:15:47.000000000 +0100
|
||||||
|
+++ zlib-1.2.7/deflate.c 2012-09-27 13:39:57.942762946 +0200
|
||||||
|
@@ -1143,15 +1143,16 @@
|
||||||
|
/* For 80x86 and 680x0, an optimized version will be provided in match.asm or
|
||||||
|
* match.S. The code will be functionally equivalent.
|
||||||
|
*/
|
||||||
|
-local uInt longest_match(s, cur_match)
|
||||||
|
+local uInt longest_match(s, pcur_match)
|
||||||
|
deflate_state *s;
|
||||||
|
- IPos cur_match; /* current match */
|
||||||
|
+ IPos pcur_match; /* current match */
|
||||||
|
{
|
||||||
|
+ ptrdiff_t cur_match = pcur_match; /* extend to pointer width */
|
||||||
|
unsigned chain_length = s->max_chain_length;/* max hash chain length */
|
||||||
|
register Bytef *scan = s->window + s->strstart; /* current string */
|
||||||
|
register Bytef *match; /* matched string */
|
||||||
|
register int len; /* length of current match */
|
||||||
|
- int best_len = s->prev_length; /* best match length so far */
|
||||||
|
+ ptrdiff_t best_len = s->prev_length; /* best match length so far */
|
||||||
|
int nice_match = s->nice_match; /* stop if match long enough */
|
||||||
|
IPos limit = s->strstart > (IPos)MAX_DIST(s) ?
|
||||||
|
s->strstart - (IPos)MAX_DIST(s) : NIL;
|
||||||
|
@@ -1166,12 +1167,12 @@
|
||||||
|
* Try with and without -DUNALIGNED_OK to check.
|
||||||
|
*/
|
||||||
|
register Bytef *strend = s->window + s->strstart + MAX_MATCH - 1;
|
||||||
|
- register ush scan_start = *(ushf*)scan;
|
||||||
|
- register ush scan_end = *(ushf*)(scan+best_len-1);
|
||||||
|
+ register uInt scan_start = *(ushf*)scan;
|
||||||
|
+ register uInt scan_end = *(ushf*)(scan+best_len-1);
|
||||||
|
#else
|
||||||
|
register Bytef *strend = s->window + s->strstart + MAX_MATCH;
|
||||||
|
- register Byte scan_end1 = scan[best_len-1];
|
||||||
|
- register Byte scan_end = scan[best_len];
|
||||||
|
+ register uInt scan_end1 = scan[best_len-1];
|
||||||
|
+ register uInt scan_end = scan[best_len];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16.
|
4
zlib-rpmlintrc
Normal file
4
zlib-rpmlintrc
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
# zlib-devel require libz1 - zlib produces libz, not libzlib
|
||||||
|
addFilter("zlib-devel.*: W: no-dependency-on zlib*/zlib-libs/libzlib")
|
||||||
|
# used only if build --with profiling
|
||||||
|
addFilter("zlib.src.*: W: make-check-outside-check-section time make check")
|
11
zlib.changes
11
zlib.changes
@ -1,3 +1,14 @@
|
|||||||
|
-------------------------------------------------------------------
|
||||||
|
Mon Oct 15 07:39:29 UTC 2012 - mvyskocil@suse.com
|
||||||
|
|
||||||
|
- add longest_match performance patch (fate#314093)
|
||||||
|
* suggested by IBM, sent upstream
|
||||||
|
- rename the main library package to libz1 according Shared
|
||||||
|
Library Policy
|
||||||
|
- profiling build can be enabled via build --with profiling
|
||||||
|
- use the human-readable package description from zlib.net
|
||||||
|
- add rpmlintrc
|
||||||
|
|
||||||
-------------------------------------------------------------------
|
-------------------------------------------------------------------
|
||||||
Mon May 7 12:34:45 UTC 2012 - joop.boonen@opensuse.org
|
Mon May 7 12:34:45 UTC 2012 - joop.boonen@opensuse.org
|
||||||
|
|
||||||
|
63
zlib.spec
63
zlib.spec
@ -15,39 +15,59 @@
|
|||||||
# Please submit bugfixes or comments via http://bugs.opensuse.org/
|
# Please submit bugfixes or comments via http://bugs.opensuse.org/
|
||||||
#
|
#
|
||||||
|
|
||||||
|
%bcond_with profiling
|
||||||
|
|
||||||
Name: zlib
|
Name: zlib
|
||||||
Provides: libz
|
|
||||||
Obsoletes: libz
|
|
||||||
# bug437293
|
|
||||||
%ifarch ppc64
|
|
||||||
Obsoletes: zlib-64bit
|
|
||||||
%endif
|
|
||||||
#
|
|
||||||
Version: 1.2.7
|
Version: 1.2.7
|
||||||
Release: 0
|
Release: 0
|
||||||
Summary: Data Compression Library
|
Summary: Data Compression Library
|
||||||
License: Zlib
|
License: Zlib
|
||||||
Group: System/Libraries
|
Group: System/Libraries
|
||||||
Url: http://www.zlib.net/
|
Url: http://www.zlib.net/
|
||||||
# git://github.com/kaffeemonster/zlib.git (branch adler32_vec)
|
Source0: http://zlib.net/zlib-%{version}.tar.bz2
|
||||||
Source: http://zlib.net/zlib-%{version}.tar.bz2
|
|
||||||
Source1: LICENSE
|
Source1: LICENSE
|
||||||
Source2: baselibs.conf
|
Source2: baselibs.conf
|
||||||
|
Source3: zlib-rpmlintrc
|
||||||
|
#PATCH-FIX-SUSE: fate#314093, sent upstream by IBM
|
||||||
|
Patch0: zlib-1.2.7-improve-longest_match-performance.patch
|
||||||
BuildRequires: pkgconfig
|
BuildRequires: pkgconfig
|
||||||
BuildRoot: %{_tmppath}/%{name}-%{version}-build
|
BuildRoot: %{_tmppath}/%{name}-%{version}-build
|
||||||
|
# bug437293
|
||||||
|
%ifarch ppc64
|
||||||
|
Obsoletes: zlib-64bit
|
||||||
|
%endif
|
||||||
|
|
||||||
%description
|
%description
|
||||||
ftp://ds.internic.net/rfc/rfc1950.txt (zlib format), rfc1951.txt
|
zlib is designed to be a free, general-purpose, legally unencumbered -- that
|
||||||
(deflate format) and rfc1952.txt (gzip format). These documents are
|
is, not covered by any patents -- lossless data-compression library for use on
|
||||||
also available in other formats from
|
virtually any computer hardware and operating system. the zlib data format is
|
||||||
ftp://ftp.uu.net/graphics/png/documents/zlib/zdoc-index.html.
|
itself portable across platforms. unlike the lzw compression method used in
|
||||||
|
unix compress(1) and in the gif image format, the compression method currently
|
||||||
|
used in zlib essentially never expands the data. (lzw can double or triple the
|
||||||
|
file size in extreme cases.) zlib's memory footprint is also independent of the
|
||||||
|
input data and can be reduced, if necessary, at some cost in compression.
|
||||||
|
|
||||||
|
%package -n libz1
|
||||||
|
Summary: Include Files and Libraries mandatory for Development
|
||||||
|
Group: Development/Languages/C and C++
|
||||||
|
Provides: %{name} = %{version}-%{release}
|
||||||
|
Obsoletes: %{name} < %{version}-%{release}
|
||||||
|
|
||||||
|
%description -n libz1
|
||||||
|
zlib is designed to be a free, general-purpose, legally unencumbered -- that
|
||||||
|
is, not covered by any patents -- lossless data-compression library for use on
|
||||||
|
virtually any computer hardware and operating system. the zlib data format is
|
||||||
|
itself portable across platforms. unlike the lzw compression method used in
|
||||||
|
unix compress(1) and in the gif image format, the compression method currently
|
||||||
|
used in zlib essentially never expands the data. (lzw can double or triple the
|
||||||
|
file size in extreme cases.) zlib's memory footprint is also independent of the
|
||||||
|
input data and can be reduced, if necessary, at some cost in compression.
|
||||||
|
|
||||||
%package devel
|
%package devel
|
||||||
Summary: Include Files and Libraries mandatory for Development
|
Summary: Include Files and Libraries mandatory for Development
|
||||||
Group: Development/Languages/C and C++
|
Group: Development/Languages/C and C++
|
||||||
Requires: glibc-devel
|
Requires: glibc-devel
|
||||||
Requires: zlib = %{version}
|
Requires: libz1 = %{version}
|
||||||
Provides: libz:/usr/include/zlib.h
|
Provides: libz:/usr/include/zlib.h
|
||||||
# bug437293
|
# bug437293
|
||||||
%ifarch ppc64
|
%ifarch ppc64
|
||||||
@ -73,12 +93,12 @@ libraries.
|
|||||||
|
|
||||||
%prep
|
%prep
|
||||||
%setup -q
|
%setup -q
|
||||||
|
%patch0 -p1
|
||||||
|
|
||||||
%build
|
%build
|
||||||
export LDFLAGS="-Wl,-z,relro,-z,now"
|
export LDFLAGS="-Wl,-z,relro,-z,now"
|
||||||
# Marcus: breaks example64 in 32bit builds.
|
# Marcus: breaks example64 in 32bit builds, so it's disabled by default
|
||||||
%define do_profiling 0
|
%if %{with profiling}
|
||||||
%if %{do_profiling}
|
|
||||||
profiledir=$(mktemp -d)
|
profiledir=$(mktemp -d)
|
||||||
trap "rm -rf $profiledir" EXIT
|
trap "rm -rf $profiledir" EXIT
|
||||||
CC="gcc" ./configure --shared --prefix=%{_prefix} --libdir=/%{_lib}
|
CC="gcc" ./configure --shared --prefix=%{_prefix} --libdir=/%{_lib}
|
||||||
@ -96,24 +116,23 @@ make %{?_smp_mflags}
|
|||||||
time make check
|
time make check
|
||||||
|
|
||||||
%install
|
%install
|
||||||
#mkdir -p %{buildroot}%{_mandir}/man3
|
|
||||||
mkdir -p %{buildroot}%{_libdir}
|
mkdir -p %{buildroot}%{_libdir}
|
||||||
%make_install
|
%make_install
|
||||||
ln -s -v /%{_lib}/$(readlink %{buildroot}/%{_lib}/libz.so) %{buildroot}%{_libdir}/libz.so
|
ln -s -v /%{_lib}/$(readlink %{buildroot}/%{_lib}/libz.so) %{buildroot}%{_libdir}/libz.so
|
||||||
rm -v %{buildroot}/%{_lib}/libz.so
|
rm -v %{buildroot}/%{_lib}/libz.so
|
||||||
# static lib
|
# static lib
|
||||||
mv %{buildroot}/%{_lib}/libz.a %{buildroot}%{_libdir}
|
mv %{buildroot}/%{_lib}/libz.a %{buildroot}%{_libdir}
|
||||||
# Move .pc file to %{_libdir}
|
# Move .pc file to _libdir
|
||||||
mv %{buildroot}/%{_lib}/pkgconfig %{buildroot}%{_libdir}
|
mv %{buildroot}/%{_lib}/pkgconfig %{buildroot}%{_libdir}
|
||||||
# manpage
|
# manpage
|
||||||
install -m 644 zlib.3 %{buildroot}%{_mandir}/man3
|
install -m 644 zlib.3 %{buildroot}%{_mandir}/man3
|
||||||
install -m 644 zutil.h %{buildroot}%{_includedir}
|
install -m 644 zutil.h %{buildroot}%{_includedir}
|
||||||
|
|
||||||
%post -p /sbin/ldconfig
|
%post -n libz1 -p /sbin/ldconfig
|
||||||
|
|
||||||
%postun -p /sbin/ldconfig
|
%postun -n libz1 -p /sbin/ldconfig
|
||||||
|
|
||||||
%files
|
%files -n libz1
|
||||||
%defattr(-,root,root)
|
%defattr(-,root,root)
|
||||||
/%{_lib}/libz.so.1.2.*
|
/%{_lib}/libz.so.1.2.*
|
||||||
/%{_lib}/libz.so.1
|
/%{_lib}/libz.so.1
|
||||||
|
Loading…
Reference in New Issue
Block a user