summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMathew Robinson <chasinglogic@gmail.com>2018-12-07 14:15:08 -0500
committerMathew Robinson <chasinglogic@gmail.com>2019-01-14 14:15:42 -0500
commitcf6e22331a81dac4e3c3800c9b94c0df1b439737 (patch)
tree7aec86eb3f619626266825d5ab55f524414e6f37
parent5e1371451b2c2053bfad271cbd8618bb4e209632 (diff)
downloadmongo-cf6e22331a81dac4e3c3800c9b94c0df1b439737.tar.gz
SERVER-28073 Upgrade Snappy to version 1.1.7
-rw-r--r--src/third_party/SConscript2
-rw-r--r--src/third_party/scripts/snappy_get_sources.sh86
-rw-r--r--src/third_party/snappy-1.1.3/ChangeLog2468
-rw-r--r--src/third_party/snappy-1.1.3/INSTALL370
-rw-r--r--src/third_party/snappy-1.1.3/build_linux/config.h135
-rw-r--r--src/third_party/snappy-1.1.3/build_posix/config.h135
-rw-r--r--src/third_party/snappy-1.1.3/snappy-internal.h150
-rw-r--r--src/third_party/snappy-1.1.7/AUTHORS (renamed from src/third_party/snappy-1.1.3/AUTHORS)0
-rw-r--r--src/third_party/snappy-1.1.7/CONTRIBUTING.md26
-rw-r--r--src/third_party/snappy-1.1.7/COPYING (renamed from src/third_party/snappy-1.1.3/COPYING)0
-rw-r--r--src/third_party/snappy-1.1.7/NEWS (renamed from src/third_party/snappy-1.1.3/NEWS)40
-rw-r--r--src/third_party/snappy-1.1.7/README.md (renamed from src/third_party/snappy-1.1.3/README)32
-rw-r--r--src/third_party/snappy-1.1.7/SConscript (renamed from src/third_party/snappy-1.1.3/SConscript)12
-rw-r--r--src/third_party/snappy-1.1.7/build_linux/config.h62
-rw-r--r--src/third_party/snappy-1.1.7/build_linux_s390x/config.h62
-rw-r--r--src/third_party/snappy-1.1.7/build_posix/config.h62
-rw-r--r--src/third_party/snappy-1.1.7/build_windows/config.h62
-rw-r--r--src/third_party/snappy-1.1.7/format_description.txt (renamed from src/third_party/snappy-1.1.3/format_description.txt)0
-rw-r--r--src/third_party/snappy-1.1.7/framing_format.txt (renamed from src/third_party/snappy-1.1.3/framing_format.txt)0
-rw-r--r--src/third_party/snappy-1.1.7/snappy-c.cc (renamed from src/third_party/snappy-1.1.3/snappy-c.cc)0
-rw-r--r--src/third_party/snappy-1.1.7/snappy-c.h (renamed from src/third_party/snappy-1.1.3/snappy-c.h)0
-rw-r--r--src/third_party/snappy-1.1.7/snappy-internal.h224
-rw-r--r--src/third_party/snappy-1.1.7/snappy-sinksource.cc (renamed from src/third_party/snappy-1.1.3/snappy-sinksource.cc)0
-rw-r--r--src/third_party/snappy-1.1.7/snappy-sinksource.h (renamed from src/third_party/snappy-1.1.3/snappy-sinksource.h)0
-rw-r--r--src/third_party/snappy-1.1.7/snappy-stubs-internal.cc (renamed from src/third_party/snappy-1.1.3/snappy-stubs-internal.cc)0
-rw-r--r--src/third_party/snappy-1.1.7/snappy-stubs-internal.h (renamed from src/third_party/snappy-1.1.3/snappy-stubs-internal.h)146
-rw-r--r--src/third_party/snappy-1.1.7/snappy-stubs-public.h (renamed from src/third_party/snappy-1.1.3/snappy-stubs-public.h)30
-rw-r--r--src/third_party/snappy-1.1.7/snappy-stubs-public.h.in (renamed from src/third_party/snappy-1.1.3/snappy-stubs-public.h.in)30
-rw-r--r--src/third_party/snappy-1.1.7/snappy-test.cc (renamed from src/third_party/snappy-1.1.3/snappy-test.cc)17
-rw-r--r--src/third_party/snappy-1.1.7/snappy-test.h (renamed from src/third_party/snappy-1.1.3/snappy-test.h)52
-rw-r--r--src/third_party/snappy-1.1.7/snappy.cc (renamed from src/third_party/snappy-1.1.3/snappy.cc)632
-rw-r--r--src/third_party/snappy-1.1.7/snappy.h (renamed from src/third_party/snappy-1.1.3/snappy.h)0
-rw-r--r--src/third_party/snappy-1.1.7/snappy_unittest.cc (renamed from src/third_party/snappy-1.1.3/snappy_unittest.cc)278
33 files changed, 1220 insertions, 3893 deletions
diff --git a/src/third_party/SConscript b/src/third_party/SConscript
index b33fcf64396..e8552441e21 100644
--- a/src/third_party/SConscript
+++ b/src/third_party/SConscript
@@ -7,7 +7,7 @@ Import("wiredtiger")
Import("mobile_se")
boostSuffix = "-1.69.0"
-snappySuffix = '-1.1.3'
+snappySuffix = '-1.1.7'
zlibSuffix = '-1.2.11'
zstdSuffix = '-1.3.7'
pcreSuffix = "-8.42"
diff --git a/src/third_party/scripts/snappy_get_sources.sh b/src/third_party/scripts/snappy_get_sources.sh
index c3ff32b452b..21a3703cf6a 100644
--- a/src/third_party/scripts/snappy_get_sources.sh
+++ b/src/third_party/scripts/snappy_get_sources.sh
@@ -3,14 +3,34 @@ set -o verbose
set -o errexit
# This script fetches and creates a copy of sources for snappy
-# snappy uses autotools on posix, and nothing on Windows
-# Snappy has the same config.h file on Darwin and Solaris, Linux is unique
-# The difference is byteswap.h
+# snappy uses CMake and this script will invoke CMake to generate a
+# config.h for "posix", Linux, and Windows
+#
# To get the sources for Snappy, run this script as follows:
-# 1. Run on Darwin or Solaris
+#
+# 1. Run on Darwin
# 2. Run on Linux
+# 3. Run on s390x Linux
+# 4. Run on Windows via Cygwin
+#
+# For s390x CMake is already installed on the ZAP dev machines, you'll
+# need to add it to the $PATH before running this script with:
+#
+# export PATH="/opt/cmake/bin:$PATH"
+#
+# For Windows you will need CMake installed. If using an
+# Evergreen spawn host it is not installed by default but, you can
+# easily install it with the following command. (this works in
+# cygwin):
+#
+# choco install cmake
+#
+# You will also need to add it to the $PATH with the following:
+#
+# export PATH="/cygdrive/c/Program Files/CMake/bin/:$PATH"
-VERSION=1.1.3
+
+VERSION=1.1.7
NAME=snappy
TARBALL=$NAME-$VERSION.tar.gz
TARBALL_DIR=$NAME-$VERSION
@@ -19,8 +39,12 @@ TEMP_DIR=/tmp/temp-$NAME-$VERSION
DEST_DIR=`git rev-parse --show-toplevel`/src/third_party/$NAME-$VERSION
UNAME=`uname | tr A-Z a-z`
-if [ $UNAME == "linux" ]; then
+if [ "$UNAME" == "linux" && "$(uname -m)" == "s390x" ]; then
+ TARGET_UNAME=linux_s390x
+elif [ "$UNAME" == "linux" ]
TARGET_UNAME=linux
+elif [[ "$UNAME" == "cygwin"* ]]; then
+ TARGET_UNAME=windows
else
TARGET_UNAME=posix
fi
@@ -29,7 +53,7 @@ echo TARGET_UNAME: $TARGET_UNAME
if [ ! -f $TARBALL ]; then
echo "Get tarball"
- wget https://github.com/google/$NAME/releases/download/$VERSION/$NAME-$VERSION.tar.gz
+ curl -L -o $NAME-$VERSION.tar.gz https://github.com/google/$NAME/archive/$VERSION.tar.gz
fi
echo $TARBALL
@@ -40,23 +64,37 @@ mv $TARBALL_DIR $TEMP_DIR
mkdir $DEST_DIR || true
cd $TEMP_DIR
-if [ $TARGET_UNAME != "windows" ]; then
- # Do a shallow copy, it is all we need
- cp $TEMP_DIR/* $DEST_DIR || true
- rm -f $DEST_DIR/Makefile* $DEST_DIR/config* $DEST_DIR/*sh
- rm -f $DEST_DIR/compile* $DEST_DIR/depcomp $DEST_DIR/libtool
- rm -f $DEST_DIR/test-driver $DEST_DIR/*.m4 $DEST_DIR/missing
-
- echo "Generating Config.h and other files"
- ./configure
-
- # Copy over the platform independent generated files
- cp $TEMP_DIR/snappy-stubs-public.h $DEST_DIR
-
- # Copy over config.h
- mkdir $DEST_DIR/build_$TARGET_UNAME
- cp $TEMP_DIR/config.h $DEST_DIR/build_$TARGET_UNAME
-fi
+cp $TEMP_DIR/* $DEST_DIR || true
+rm -f $DEST_DIR/Makefile* $DEST_DIR/config* $DEST_DIR/*sh
+rm -f $DEST_DIR/compile* $DEST_DIR/depcomp $DEST_DIR/libtool
+rm -f $DEST_DIR/test-driver $DEST_DIR/*.m4 $DEST_DIR/missing
+
+echo "Generating Config.h and other files"
+cmake $TEMP_DIR
+
+# Copy over the platform independent generated files
+cp $TEMP_DIR/snappy-stubs-public.h $DEST_DIR
+# Copy over config.h
+mkdir $DEST_DIR/build_$TARGET_UNAME
+cp $TEMP_DIR/config.h $DEST_DIR/build_$TARGET_UNAME
+
+# Change the snappy-stubs-public.h to use the defined variables
+# instead of hardcoded values generated by CMake
+#
+# Changes lines like:
+#
+# #if !0 // !HAVE_SYS_UIO_H
+# #if 1 // HAVE_STDINT_H
+#
+# To:
+#
+# #if !HAVE_SYS_UIO_H
+# #if HAVE_STDINT_H
+if [ "$TARGET_UNAME" = "posix" ]; then
+ sed -i '' 's/if !\{0,1\}[0-9] \/\/ \(!\{0,1\}HAVE_.*\)/if \1/' snappy-stubs-public.h
+else
+ sed -i 's/if !\{0,1\}[0-9] \/\/ \(!\{0,1\}HAVE_.*\)/if \1/' snappy-stubs-public.h
+fi
echo "Done"
diff --git a/src/third_party/snappy-1.1.3/ChangeLog b/src/third_party/snappy-1.1.3/ChangeLog
deleted file mode 100644
index 1478db55014..00000000000
--- a/src/third_party/snappy-1.1.3/ChangeLog
+++ /dev/null
@@ -1,2468 +0,0 @@
-commit eb66d8176b3d1f560ee012e1b488cb1540c45f88
-Author: Steinar H. Gunderson <sesse@google.com>
-Date: Mon Jun 22 16:10:47 2015 +0200
-
- Initialized members of SnappyArrayWriter and SnappyDecompressionValidator.
- These members were almost surely initialized before use by other member
- functions, but Coverity was warning about this. Eliminating these warnings
- minimizes clutter in that report and the likelihood of overlooking a real bug.
-
- A=cmumford
- R=jeff
-
-commit b2312c4c25883ab03b5110f1b006dce95f419a4f
-Author: Steinar H. Gunderson <sesse@google.com>
-Date: Mon Jun 22 16:03:28 2015 +0200
-
- Add support for Uncompress(source, sink). Various changes to allow
- Uncompress(source, sink) to get the same performance as the different
- variants of Uncompress to Cord/DataBuffer/String/FlatBuffer.
-
- Changes to efficiently support Uncompress(source, sink)
- --------
-
- a) For strings - we add support to StringByteSink to do GetAppendBuffer so we
- can write to it without copying.
- b) For flat array buffers, we do GetAppendBuffer and see if we can get a full buffer.
-
- With the above changes we get performance with ByteSource/ByteSink
- that is very close to directly using flat arrays and strings.
-
- We add various benchmark cases to demonstrate that.
-
- Orthogonal change
- ------------------
-
- Add support for TryFastAppend() for SnappyScatteredWriter.
-
- Benchmark results are below
-
- CPU: Intel Core2 dL1:32KB dL2:4096KB
- Benchmark Time(ns) CPU(ns) Iterations
- -----------------------------------------------------
- BM_UFlat/0 109065 108996 6410 896.0MB/s html
- BM_UFlat/1 1012175 1012343 691 661.4MB/s urls
- BM_UFlat/2 26775 26771 26149 4.4GB/s jpg
- BM_UFlat/3 48947 48940 14363 1.8GB/s pdf
- BM_UFlat/4 441029 440835 1589 886.1MB/s html4
- BM_UFlat/5 39861 39880 17823 588.3MB/s cp
- BM_UFlat/6 18315 18300 38126 581.1MB/s c
- BM_UFlat/7 5254 5254 100000 675.4MB/s lsp
- BM_UFlat/8 1568060 1567376 447 626.6MB/s xls
- BM_UFlat/9 337512 337734 2073 429.5MB/s txt1
- BM_UFlat/10 287269 287054 2434 415.9MB/s txt2
- BM_UFlat/11 890098 890219 787 457.2MB/s txt3
- BM_UFlat/12 1186593 1186863 590 387.2MB/s txt4
- BM_UFlat/13 573927 573318 1000 853.7MB/s bin
- BM_UFlat/14 64250 64294 10000 567.2MB/s sum
- BM_UFlat/15 7301 7300 96153 552.2MB/s man
- BM_UFlat/16 109617 109636 6375 1031.5MB/s pb
- BM_UFlat/17 364438 364497 1921 482.3MB/s gaviota
- BM_UFlatSink/0 108518 108465 6450 900.4MB/s html
- BM_UFlatSink/1 991952 991997 705 675.0MB/s urls
- BM_UFlatSink/2 26815 26798 26065 4.4GB/s jpg
- BM_UFlatSink/3 49127 49122 14255 1.8GB/s pdf
- BM_UFlatSink/4 436674 436731 1604 894.4MB/s html4
- BM_UFlatSink/5 39738 39733 17345 590.5MB/s cp
- BM_UFlatSink/6 18413 18416 37962 577.4MB/s c
- BM_UFlatSink/7 5677 5676 100000 625.2MB/s lsp
- BM_UFlatSink/8 1552175 1551026 451 633.2MB/s xls
- BM_UFlatSink/9 338526 338489 2065 428.5MB/s txt1
- BM_UFlatSink/10 289387 289307 2420 412.6MB/s txt2
- BM_UFlatSink/11 893803 893706 783 455.4MB/s txt3
- BM_UFlatSink/12 1195919 1195459 586 384.4MB/s txt4
- BM_UFlatSink/13 559637 559779 1000 874.3MB/s bin
- BM_UFlatSink/14 65073 65094 10000 560.2MB/s sum
- BM_UFlatSink/15 7618 7614 92823 529.5MB/s man
- BM_UFlatSink/16 110085 110121 6352 1027.0MB/s pb
- BM_UFlatSink/17 369196 368915 1896 476.5MB/s gaviota
- BM_UValidate/0 46954 46957 14899 2.0GB/s html
- BM_UValidate/1 500621 500868 1000 1.3GB/s urls
- BM_UValidate/2 283 283 2481447 417.2GB/s jpg
- BM_UValidate/3 16230 16228 43137 5.4GB/s pdf
- BM_UValidate/4 189129 189193 3701 2.0GB/s html4
-
- A=uday
- R=sanjay
-
-commit b2ad96006741d40935db2f73194a3e489b467338
-Author: Steinar H. Gunderson <sesse@google.com>
-Date: Mon Jun 22 15:48:29 2015 +0200
-
- Changes to eliminate compiler warnings on MSVC
-
- This code was not compiling under Visual Studio 2013 with warnings being treated
- as errors. Specifically:
-
- 1. Changed int -> size_t to eliminate signed/unsigned mismatch warning.
- 2. Added some missing return values to functions.
- 3. Inserting character instead of integer literals into strings to avoid type
- conversions.
-
- A=cmumford
- R=jeff
-
-commit e7a897e187e90b33f87bd9e64872cf561de9ebca
-Author: Steinar H. Gunderson <sesse@google.com>
-Date: Mon Jun 22 15:45:11 2015 +0200
-
- Fixed unit tests to compile under MSVC.
-
- 1. Including config.h in test.
- 2. Including windows.h before zippy-test.h.
- 3. Removed definition of WIN32_LEAN_AND_MEAN. This caused problems in
- build environments that define WIN32_LEAN_AND_MEAN as our
- definition didn't check for prior existence. This constant is old
- and no longer needed anyhow.
- 4. Disable MSVC warning 4722 since ~LogMessageCrash() never returns.
-
- A=cmumford
- R=jeff
-
-commit 86eb8b152bdb065ad11bf331a9f7d65b72616acf
-Author: Steinar H. Gunderson <sesse@google.com>
-Date: Mon Jun 22 15:41:30 2015 +0200
-
- Change a few branch annotations that profiling found to be wrong.
- Overall performance is neutral or slightly positive.
-
- Westmere (64-bit, opt):
-
- Benchmark Base (ns) New (ns) Improvement
- --------------------------------------------------------------------------------------
- BM_UFlat/0 73798 71464 1.3GB/s html +3.3%
- BM_UFlat/1 715223 704318 953.5MB/s urls +1.5%
- BM_UFlat/2 8137 8871 13.0GB/s jpg -8.3%
- BM_UFlat/3 200 204 935.5MB/s jpg_200 -2.0%
- BM_UFlat/4 21627 21281 4.5GB/s pdf +1.6%
- BM_UFlat/5 302806 290350 1.3GB/s html4 +4.3%
- BM_UFlat/6 218920 219017 664.1MB/s txt1 -0.0%
- BM_UFlat/7 190437 191212 626.1MB/s txt2 -0.4%
- BM_UFlat/8 584192 580484 703.4MB/s txt3 +0.6%
- BM_UFlat/9 776537 779055 591.6MB/s txt4 -0.3%
- BM_UFlat/10 76056 72606 1.5GB/s pb +4.8%
- BM_UFlat/11 235962 239043 737.4MB/s gaviota -1.3%
- BM_UFlat/12 28049 28000 840.1MB/s cp +0.2%
- BM_UFlat/13 12225 12021 886.9MB/s c +1.7%
- BM_UFlat/14 3362 3544 1004.0MB/s lsp -5.1%
- BM_UFlat/15 937015 939206 1048.9MB/s xls -0.2%
- BM_UFlat/16 236 233 823.1MB/s xls_200 +1.3%
- BM_UFlat/17 373170 361947 1.3GB/s bin +3.1%
- BM_UFlat/18 264 264 725.5MB/s bin_200 +0.0%
- BM_UFlat/19 42834 43577 839.2MB/s sum -1.7%
- BM_UFlat/20 4770 4736 853.6MB/s man +0.7%
- BM_UValidate/0 39671 39944 2.4GB/s html -0.7%
- BM_UValidate/1 443391 443391 1.5GB/s urls +0.0%
- BM_UValidate/2 163 163 703.3GB/s jpg +0.0%
- BM_UValidate/3 113 112 1.7GB/s jpg_200 +0.9%
- BM_UValidate/4 7555 7608 12.6GB/s pdf -0.7%
- BM_ZFlat/0 157616 157568 621.5MB/s html (22.31 %) +0.0%
- BM_ZFlat/1 1997290 2014486 333.4MB/s urls (47.77 %) -0.9%
- BM_ZFlat/2 23035 22237 5.2GB/s jpg (99.95 %) +3.6%
- BM_ZFlat/3 539 540 354.5MB/s jpg_200 (73.00 %) -0.2%
- BM_ZFlat/4 80709 81369 1.2GB/s pdf (81.85 %) -0.8%
- BM_ZFlat/5 639059 639220 613.0MB/s html4 (22.51 %) -0.0%
- BM_ZFlat/6 577203 583370 249.3MB/s txt1 (57.87 %) -1.1%
- BM_ZFlat/7 510887 516094 232.0MB/s txt2 (61.93 %) -1.0%
- BM_ZFlat/8 1535843 1556973 262.2MB/s txt3 (54.92 %) -1.4%
- BM_ZFlat/9 2070068 2102380 219.3MB/s txt4 (66.22 %) -1.5%
- BM_ZFlat/10 152396 152148 745.5MB/s pb (19.64 %) +0.2%
- BM_ZFlat/11 447367 445859 395.4MB/s gaviota (37.72 %) +0.3%
- BM_ZFlat/12 76375 76797 306.3MB/s cp (48.12 %) -0.5%
- BM_ZFlat/13 31518 31987 333.3MB/s c (42.40 %) -1.5%
- BM_ZFlat/14 10598 10827 328.6MB/s lsp (48.37 %) -2.1%
- BM_ZFlat/15 1782243 1802728 546.5MB/s xls (41.23 %) -1.1%
- BM_ZFlat/16 526 539 355.0MB/s xls_200 (78.00 %) -2.4%
- BM_ZFlat/17 598141 597311 822.1MB/s bin (18.11 %) +0.1%
- BM_ZFlat/18 121 120 1.6GB/s bin_200 (7.50 %) +0.8%
- BM_ZFlat/19 109981 112173 326.0MB/s sum (48.96 %) -2.0%
- BM_ZFlat/20 14355 14575 277.4MB/s man (59.36 %) -1.5%
- Sum of all benchmarks 33882722 33879325 +0.0%
-
- Sandy Bridge (64-bit, opt):
-
- Benchmark Base (ns) New (ns) Improvement
- --------------------------------------------------------------------------------------
- BM_UFlat/0 43764 41600 2.3GB/s html +5.2%
- BM_UFlat/1 517990 507058 1.3GB/s urls +2.2%
- BM_UFlat/2 6625 5529 20.8GB/s jpg +19.8%
- BM_UFlat/3 154 155 1.2GB/s jpg_200 -0.6%
- BM_UFlat/4 12795 11747 8.1GB/s pdf +8.9%
- BM_UFlat/5 200335 193413 2.0GB/s html4 +3.6%
- BM_UFlat/6 156574 156426 929.2MB/s txt1 +0.1%
- BM_UFlat/7 137574 137464 870.4MB/s txt2 +0.1%
- BM_UFlat/8 422551 421603 967.4MB/s txt3 +0.2%
- BM_UFlat/9 577749 578985 795.6MB/s txt4 -0.2%
- BM_UFlat/10 42329 39362 2.8GB/s pb +7.5%
- BM_UFlat/11 170615 169751 1037.9MB/s gaviota +0.5%
- BM_UFlat/12 12800 12719 1.8GB/s cp +0.6%
- BM_UFlat/13 6585 6579 1.6GB/s c +0.1%
- BM_UFlat/14 2066 2044 1.7GB/s lsp +1.1%
- BM_UFlat/15 750861 746911 1.3GB/s xls +0.5%
- BM_UFlat/16 188 192 996.0MB/s xls_200 -2.1%
- BM_UFlat/17 271622 264333 1.8GB/s bin +2.8%
- BM_UFlat/18 208 207 923.6MB/s bin_200 +0.5%
- BM_UFlat/19 24667 24845 1.4GB/s sum -0.7%
- BM_UFlat/20 2663 2662 1.5GB/s man +0.0%
- BM_ZFlat/0 115173 115624 846.5MB/s html (22.31 %) -0.4%
- BM_ZFlat/1 1530331 1537769 436.5MB/s urls (47.77 %) -0.5%
- BM_ZFlat/2 17503 17013 6.8GB/s jpg (99.95 %) +2.9%
- BM_ZFlat/3 385 385 496.3MB/s jpg_200 (73.00 %) +0.0%
- BM_ZFlat/4 61753 61540 1.6GB/s pdf (81.85 %) +0.3%
- BM_ZFlat/5 484806 483356 810.1MB/s html4 (22.51 %) +0.3%
- BM_ZFlat/6 464143 467609 310.9MB/s txt1 (57.87 %) -0.7%
- BM_ZFlat/7 410315 413319 289.5MB/s txt2 (61.93 %) -0.7%
- BM_ZFlat/8 1244082 1249381 326.5MB/s txt3 (54.92 %) -0.4%
- BM_ZFlat/9 1696914 1709685 269.4MB/s txt4 (66.22 %) -0.7%
- BM_ZFlat/10 104148 103372 1096.7MB/s pb (19.64 %) +0.8%
- BM_ZFlat/11 363522 359722 489.8MB/s gaviota (37.72 %) +1.1%
- BM_ZFlat/12 47021 50095 469.3MB/s cp (48.12 %) -6.1%
- BM_ZFlat/13 16888 16985 627.4MB/s c (42.40 %) -0.6%
- BM_ZFlat/14 5496 5469 650.3MB/s lsp (48.37 %) +0.5%
- BM_ZFlat/15 1460713 1448760 679.5MB/s xls (41.23 %) +0.8%
- BM_ZFlat/16 387 393 486.8MB/s xls_200 (78.00 %) -1.5%
- BM_ZFlat/17 457654 451462 1086.6MB/s bin (18.11 %) +1.4%
- BM_ZFlat/18 97 87 2.1GB/s bin_200 (7.50 %) +11.5%
- BM_ZFlat/19 77904 80924 451.7MB/s sum (48.96 %) -3.7%
- BM_ZFlat/20 7648 7663 527.1MB/s man (59.36 %) -0.2%
- Sum of all benchmarks 25493635 25482069 +0.0%
-
- A=dehao
- R=sesse
-
-commit 11ccdfb868387e56d845766d89ddab9d489c4128
-Author: Steinar H. Gunderson <sesse@google.com>
-Date: Mon Jun 22 16:07:58 2015 +0200
-
- Sync with various Google-internal changes.
-
- Should not mean much for the open-source version.
-
-commit 22acaf438ed93ab21a2ff1919d173206798b996e
-Author: Steinar H. Gunderson <sesse@google.com>
-Date: Mon Jun 22 15:39:08 2015 +0200
-
- Change some internal path names.
-
- This is mostly to sync up with some changes from Google's internal
- repositories; it does not affect the open-source distribution in itself.
-
-commit 1ff9be9b8fafc8528ca9e055646f5932aa5db9c4
-Author: snappy.mirrorbot@gmail.com <snappy.mirrorbot@gmail.com@03e5f5b5-db94-4691-08a0-1a8bf15f6143>
-Date: Fri Feb 28 11:18:07 2014 +0000
-
- Release Snappy 1.1.2.
-
- R=jeff
-
-
- git-svn-id: https://snappy.googlecode.com/svn/trunk@84 03e5f5b5-db94-4691-08a0-1a8bf15f6143
-
-commit 19690d78e83f8963f497585031efa3d9ca66b807
-Author: snappy.mirrorbot@gmail.com <snappy.mirrorbot@gmail.com@03e5f5b5-db94-4691-08a0-1a8bf15f6143>
-Date: Wed Feb 19 10:31:49 2014 +0000
-
- Fix public issue 82: Stop distributing benchmark data files that have
- unclear or unsuitable licensing.
-
- In general, we replace the files we can with liberally licensed data,
- and remove all the others (in particular all the parts of the Canterbury
- corpus that are not clearly in the public domain). The replacements
- do not always have the exact same characteristics as the original ones,
- but they are more than good enough to be useful for benchmarking.
-
-
- git-svn-id: https://snappy.googlecode.com/svn/trunk@83 03e5f5b5-db94-4691-08a0-1a8bf15f6143
-
-commit f82bff66afe0de4c9ae22f8c4ef84e3c2233e799
-Author: snappy.mirrorbot@gmail.com <snappy.mirrorbot@gmail.com@03e5f5b5-db94-4691-08a0-1a8bf15f6143>
-Date: Fri Oct 25 13:31:27 2013 +0000
-
- Add support for padding in the Snappy framed format.
-
- This is specifically motivated by DICOM's demands that embedded data
- must be of an even number of bytes, but could in principle be used for
- any sort of padding/alignment needed.
-
- R=sanjay
-
-
- git-svn-id: https://snappy.googlecode.com/svn/trunk@82 03e5f5b5-db94-4691-08a0-1a8bf15f6143
-
-commit eeead8dc38ea359f027fb6e89f345448e8e9d723
-Author: snappy.mirrorbot@gmail.com <snappy.mirrorbot@gmail.com@03e5f5b5-db94-4691-08a0-1a8bf15f6143>
-Date: Tue Oct 15 15:21:31 2013 +0000
-
- Release Snappy 1.1.1.
-
- R=jeff
-
-
- git-svn-id: https://snappy.googlecode.com/svn/trunk@81 03e5f5b5-db94-4691-08a0-1a8bf15f6143
-
-commit 6bc39e24c76adbbff26ae629fafbf7dfc795f554
-Author: snappy.mirrorbot@gmail.com <snappy.mirrorbot@gmail.com@03e5f5b5-db94-4691-08a0-1a8bf15f6143>
-Date: Tue Aug 13 12:55:00 2013 +0000
-
- Add autoconf tests for size_t and ssize_t. Sort-of resolves public issue 79;
- it would solve the problem if MSVC typically used autoconf. However, it gives
- a natural place (config.h) to put the typedef even for MSVC.
-
- R=jsbell
-
-
- git-svn-id: https://snappy.googlecode.com/svn/trunk@80 03e5f5b5-db94-4691-08a0-1a8bf15f6143
-
-commit 7c3c01df77e191ad1f8377448961fe88db2802e9
-Author: snappy.mirrorbot@gmail.com <snappy.mirrorbot@gmail.com@03e5f5b5-db94-4691-08a0-1a8bf15f6143>
-Date: Mon Jul 29 11:06:44 2013 +0000
-
- When we compare the number of bytes produced with the offset for a
- backreference, make the signedness of the bytes produced clear,
- by sticking it into a size_t. This avoids a signed/unsigned compare
- warning from MSVC (public issue 71), and also is slightly clearer.
-
- Since the line is now so long the explanatory comment about the -1u
- trick has to go somewhere else anyway, I used the opportunity to
- explain it in slightly more detail.
-
- This is a purely stylistic change; the emitted assembler from GCC
- is identical.
-
- R=jeff
-
-
- git-svn-id: https://snappy.googlecode.com/svn/trunk@79 03e5f5b5-db94-4691-08a0-1a8bf15f6143
-
-commit 2f0aaf8631d8fb2475ca1a6687c181efb14ed286
-Author: snappy.mirrorbot@gmail.com <snappy.mirrorbot@gmail.com@03e5f5b5-db94-4691-08a0-1a8bf15f6143>
-Date: Sun Jun 30 19:24:03 2013 +0000
-
- In the fast path for decompressing literals, instead of checking
- whether there's 16 bytes free and then checking right afterwards
- (when having subtracted the literal size) that there are now
- 5 bytes free, just check once for 21 bytes. This skips a compare
- and a branch; although it is easily predictable, it is still
- a few cycles on a fast path that we would like to get rid of.
-
- Benchmarking this yields very confusing results. On open-source
- GCC 4.8.1 on Haswell, we get exactly the expected results; the
- benchmarks where we hit the fast path for literals (in particular
- the two HTML benchmarks and the protobuf benchmark) give very nice
- speedups, and the others are not really affected.
-
- However, benchmarks with Google's GCC branch on other hardware
- is much less clear. It seems that we have a weak loss in some cases
- (and the win for the “typical” win cases are not nearly as clear),
- but that it depends on microarchitecture and plain luck in how we run
- the benchmark. Looking at the generated assembler, it seems that
- the removal of the if causes other large-scale changes in how the
- function is laid out, which makes it likely that this is just bad luck.
-
- Thus, we should keep this change, even though its exact current impact is
- unclear; it's a sensible change per se, and dropping it on the basis of
- microoptimization for a given compiler (or even branch of a compiler)
- would seem like a bad strategy in the long run.
-
- Microbenchmark results (all in 64-bit, opt mode):
-
- Nehalem, Google GCC:
-
- Benchmark Base (ns) New (ns) Improvement
- ------------------------------------------------------------------------------
- BM_UFlat/0 76747 75591 1.3GB/s html +1.5%
- BM_UFlat/1 765756 757040 886.3MB/s urls +1.2%
- BM_UFlat/2 10867 10893 10.9GB/s jpg -0.2%
- BM_UFlat/3 124 131 1.4GB/s jpg_200 -5.3%
- BM_UFlat/4 31663 31596 2.8GB/s pdf +0.2%
- BM_UFlat/5 314162 308176 1.2GB/s html4 +1.9%
- BM_UFlat/6 29668 29746 790.6MB/s cp -0.3%
- BM_UFlat/7 12958 13386 796.4MB/s c -3.2%
- BM_UFlat/8 3596 3682 966.0MB/s lsp -2.3%
- BM_UFlat/9 1019193 1033493 953.3MB/s xls -1.4%
- BM_UFlat/10 239 247 775.3MB/s xls_200 -3.2%
- BM_UFlat/11 236411 240271 606.9MB/s txt1 -1.6%
- BM_UFlat/12 206639 209768 571.2MB/s txt2 -1.5%
- BM_UFlat/13 627803 635722 641.4MB/s txt3 -1.2%
- BM_UFlat/14 845932 857816 538.2MB/s txt4 -1.4%
- BM_UFlat/15 402107 391670 1.2GB/s bin +2.7%
- BM_UFlat/16 283 279 683.6MB/s bin_200 +1.4%
- BM_UFlat/17 46070 46815 781.5MB/s sum -1.6%
- BM_UFlat/18 5053 5163 782.0MB/s man -2.1%
- BM_UFlat/19 79721 76581 1.4GB/s pb +4.1%
- BM_UFlat/20 251158 252330 697.5MB/s gaviota -0.5%
- Sum of all benchmarks 4966150 4980396 -0.3%
-
-
- Sandy Bridge, Google GCC:
-
- Benchmark Base (ns) New (ns) Improvement
- ------------------------------------------------------------------------------
- BM_UFlat/0 42850 42182 2.3GB/s html +1.6%
- BM_UFlat/1 525660 515816 1.3GB/s urls +1.9%
- BM_UFlat/2 7173 7283 16.3GB/s jpg -1.5%
- BM_UFlat/3 92 91 2.1GB/s jpg_200 +1.1%
- BM_UFlat/4 15147 14872 5.9GB/s pdf +1.8%
- BM_UFlat/5 199936 192116 2.0GB/s html4 +4.1%
- BM_UFlat/6 12796 12443 1.8GB/s cp +2.8%
- BM_UFlat/7 6588 6400 1.6GB/s c +2.9%
- BM_UFlat/8 2010 1951 1.8GB/s lsp +3.0%
- BM_UFlat/9 761124 763049 1.3GB/s xls -0.3%
- BM_UFlat/10 186 189 1016.1MB/s xls_200 -1.6%
- BM_UFlat/11 159354 158460 918.6MB/s txt1 +0.6%
- BM_UFlat/12 139732 139950 856.1MB/s txt2 -0.2%
- BM_UFlat/13 429917 425027 961.7MB/s txt3 +1.2%
- BM_UFlat/14 585255 587324 785.8MB/s txt4 -0.4%
- BM_UFlat/15 276186 266173 1.8GB/s bin +3.8%
- BM_UFlat/16 205 207 925.5MB/s bin_200 -1.0%
- BM_UFlat/17 24925 24935 1.4GB/s sum -0.0%
- BM_UFlat/18 2632 2576 1.5GB/s man +2.2%
- BM_UFlat/19 40546 39108 2.8GB/s pb +3.7%
- BM_UFlat/20 175803 168209 1048.9MB/s gaviota +4.5%
- Sum of all benchmarks 3408117 3368361 +1.2%
-
-
- Haswell, upstream GCC 4.8.1:
-
- Benchmark Base (ns) New (ns) Improvement
- ------------------------------------------------------------------------------
- BM_UFlat/0 46308 40641 2.3GB/s html +13.9%
- BM_UFlat/1 513385 514706 1.3GB/s urls -0.3%
- BM_UFlat/2 6197 6151 19.2GB/s jpg +0.7%
- BM_UFlat/3 61 61 3.0GB/s jpg_200 +0.0%
- BM_UFlat/4 13551 13429 6.5GB/s pdf +0.9%
- BM_UFlat/5 198317 190243 2.0GB/s html4 +4.2%
- BM_UFlat/6 14768 12560 1.8GB/s cp +17.6%
- BM_UFlat/7 6453 6447 1.6GB/s c +0.1%
- BM_UFlat/8 1991 1980 1.8GB/s lsp +0.6%
- BM_UFlat/9 766947 770424 1.2GB/s xls -0.5%
- BM_UFlat/10 170 169 1.1GB/s xls_200 +0.6%
- BM_UFlat/11 164350 163554 888.7MB/s txt1 +0.5%
- BM_UFlat/12 145444 143830 832.1MB/s txt2 +1.1%
- BM_UFlat/13 437849 438413 929.2MB/s txt3 -0.1%
- BM_UFlat/14 603587 605309 759.8MB/s txt4 -0.3%
- BM_UFlat/15 249799 248067 1.9GB/s bin +0.7%
- BM_UFlat/16 191 188 1011.4MB/s bin_200 +1.6%
- BM_UFlat/17 26064 24778 1.4GB/s sum +5.2%
- BM_UFlat/18 2620 2601 1.5GB/s man +0.7%
- BM_UFlat/19 44551 37373 3.0GB/s pb +19.2%
- BM_UFlat/20 165408 164584 1.0GB/s gaviota +0.5%
- Sum of all benchmarks 3408011 3385508 +0.7%
-
-
- git-svn-id: https://snappy.googlecode.com/svn/trunk@78 03e5f5b5-db94-4691-08a0-1a8bf15f6143
-
-commit 062bf544a61107db730b6d08cb0b159c4dd9b24c
-Author: snappy.mirrorbot@gmail.com <snappy.mirrorbot@gmail.com@03e5f5b5-db94-4691-08a0-1a8bf15f6143>
-Date: Fri Jun 14 21:42:26 2013 +0000
-
- Make the two IncrementalCopy* functions take in an ssize_t instead of a len,
- in order to avoid having to do 32-to-64-bit signed conversions on a hot path
- during decompression. (Also fixes some MSVC warnings, mentioned in public
- issue 75, but more of those remain.) They cannot be size_t because we expect
- them to go negative and test for that.
-
- This saves a few movzwl instructions, yielding ~2% speedup in decompression.
-
-
- Sandy Bridge:
-
- Benchmark Base (ns) New (ns) Improvement
- -------------------------------------------------------------------------------------------------
- BM_UFlat/0 48009 41283 2.3GB/s html +16.3%
- BM_UFlat/1 531274 513419 1.3GB/s urls +3.5%
- BM_UFlat/2 7378 7062 16.8GB/s jpg +4.5%
- BM_UFlat/3 92 92 2.0GB/s jpg_200 +0.0%
- BM_UFlat/4 15057 14974 5.9GB/s pdf +0.6%
- BM_UFlat/5 204323 193140 2.0GB/s html4 +5.8%
- BM_UFlat/6 13282 12611 1.8GB/s cp +5.3%
- BM_UFlat/7 6511 6504 1.6GB/s c +0.1%
- BM_UFlat/8 2014 2030 1.7GB/s lsp -0.8%
- BM_UFlat/9 775909 768336 1.3GB/s xls +1.0%
- BM_UFlat/10 182 184 1043.2MB/s xls_200 -1.1%
- BM_UFlat/11 167352 161630 901.2MB/s txt1 +3.5%
- BM_UFlat/12 147393 142246 842.8MB/s txt2 +3.6%
- BM_UFlat/13 449960 432853 944.4MB/s txt3 +4.0%
- BM_UFlat/14 620497 594845 775.9MB/s txt4 +4.3%
- BM_UFlat/15 265610 267356 1.8GB/s bin -0.7%
- BM_UFlat/16 206 205 932.7MB/s bin_200 +0.5%
- BM_UFlat/17 25561 24730 1.4GB/s sum +3.4%
- BM_UFlat/18 2620 2644 1.5GB/s man -0.9%
- BM_UFlat/19 45766 38589 2.9GB/s pb +18.6%
- BM_UFlat/20 171107 169832 1039.5MB/s gaviota +0.8%
- Sum of all benchmarks 3500103 3394565 +3.1%
-
-
- Westmere:
-
- Benchmark Base (ns) New (ns) Improvement
- -------------------------------------------------------------------------------------------------
- BM_UFlat/0 72624 71526 1.3GB/s html +1.5%
- BM_UFlat/1 735821 722917 930.8MB/s urls +1.8%
- BM_UFlat/2 10450 10172 11.7GB/s jpg +2.7%
- BM_UFlat/3 117 117 1.6GB/s jpg_200 +0.0%
- BM_UFlat/4 29817 29648 3.0GB/s pdf +0.6%
- BM_UFlat/5 297126 293073 1.3GB/s html4 +1.4%
- BM_UFlat/6 28252 27994 842.0MB/s cp +0.9%
- BM_UFlat/7 12672 12391 862.1MB/s c +2.3%
- BM_UFlat/8 3507 3425 1040.9MB/s lsp +2.4%
- BM_UFlat/9 1004268 969395 1018.0MB/s xls +3.6%
- BM_UFlat/10 233 227 844.8MB/s xls_200 +2.6%
- BM_UFlat/11 230054 224981 647.8MB/s txt1 +2.3%
- BM_UFlat/12 201229 196447 610.5MB/s txt2 +2.4%
- BM_UFlat/13 609547 596761 685.3MB/s txt3 +2.1%
- BM_UFlat/14 824362 804821 573.8MB/s txt4 +2.4%
- BM_UFlat/15 371095 374899 1.3GB/s bin -1.0%
- BM_UFlat/16 267 267 717.8MB/s bin_200 +0.0%
- BM_UFlat/17 44623 43828 835.9MB/s sum +1.8%
- BM_UFlat/18 5077 4815 841.0MB/s man +5.4%
- BM_UFlat/19 74964 73210 1.5GB/s pb +2.4%
- BM_UFlat/20 237987 236745 746.0MB/s gaviota +0.5%
- Sum of all benchmarks 4794092 4697659 +2.1%
-
-
- Istanbul:
-
- Benchmark Base (ns) New (ns) Improvement
- -------------------------------------------------------------------------------------------------
- BM_UFlat/0 98614 96376 1020.4MB/s html +2.3%
- BM_UFlat/1 963740 953241 707.2MB/s urls +1.1%
- BM_UFlat/2 25042 24769 4.8GB/s jpg +1.1%
- BM_UFlat/3 180 180 1065.6MB/s jpg_200 +0.0%
- BM_UFlat/4 45942 45403 1.9GB/s pdf +1.2%
- BM_UFlat/5 400135 390226 1008.2MB/s html4 +2.5%
- BM_UFlat/6 37768 37392 631.9MB/s cp +1.0%
- BM_UFlat/7 18585 18200 588.2MB/s c +2.1%
- BM_UFlat/8 5751 5690 627.7MB/s lsp +1.1%
- BM_UFlat/9 1543154 1542209 641.4MB/s xls +0.1%
- BM_UFlat/10 381 388 494.6MB/s xls_200 -1.8%
- BM_UFlat/11 339715 331973 440.1MB/s txt1 +2.3%
- BM_UFlat/12 294807 289418 415.4MB/s txt2 +1.9%
- BM_UFlat/13 906160 884094 463.3MB/s txt3 +2.5%
- BM_UFlat/14 1224221 1198435 386.1MB/s txt4 +2.2%
- BM_UFlat/15 516277 502923 979.5MB/s bin +2.7%
- BM_UFlat/16 405 402 477.2MB/s bin_200 +0.7%
- BM_UFlat/17 61640 60621 605.6MB/s sum +1.7%
- BM_UFlat/18 7326 7383 549.5MB/s man -0.8%
- BM_UFlat/19 94720 92653 1.2GB/s pb +2.2%
- BM_UFlat/20 360435 346687 510.6MB/s gaviota +4.0%
- Sum of all benchmarks 6944998 6828663 +1.7%
-
-
- git-svn-id: https://snappy.googlecode.com/svn/trunk@77 03e5f5b5-db94-4691-08a0-1a8bf15f6143
-
-commit 328aafa1980824a9afdcd50edc30d9d5157e417f
-Author: snappy.mirrorbot@gmail.com <snappy.mirrorbot@gmail.com@03e5f5b5-db94-4691-08a0-1a8bf15f6143>
-Date: Thu Jun 13 16:19:52 2013 +0000
-
- Add support for uncompressing to iovecs (scatter I/O).
- Windows does not have struct iovec defined anywhere,
- so we define our own version that's equal to what UNIX
- typically has.
-
- The bulk of this patch was contributed by Mohit Aron.
-
- R=jeff
-
-
- git-svn-id: https://snappy.googlecode.com/svn/trunk@76 03e5f5b5-db94-4691-08a0-1a8bf15f6143
-
-commit cd92eb0852e2339187b693eef3595a07d2276c1d
-Author: snappy.mirrorbot@gmail.com <snappy.mirrorbot@gmail.com@03e5f5b5-db94-4691-08a0-1a8bf15f6143>
-Date: Wed Jun 12 19:51:15 2013 +0000
-
- Some code reorganization needed for an internal change.
-
- R=fikes
-
-
- git-svn-id: https://snappy.googlecode.com/svn/trunk@75 03e5f5b5-db94-4691-08a0-1a8bf15f6143
-
-commit a3e928d62bbd61b523b988c07b560253950cf73b
-Author: snappy.mirrorbot@gmail.com <snappy.mirrorbot@gmail.com@03e5f5b5-db94-4691-08a0-1a8bf15f6143>
-Date: Tue Apr 9 15:33:30 2013 +0000
-
- Supports truncated test data in zippy benchmark.
-
- R=sesse
-
-
- git-svn-id: https://snappy.googlecode.com/svn/trunk@74 03e5f5b5-db94-4691-08a0-1a8bf15f6143
-
-commit bde324c0169763688f35ee44630a26ad1f49eec3
-Author: snappy.mirrorbot@gmail.com <snappy.mirrorbot@gmail.com@03e5f5b5-db94-4691-08a0-1a8bf15f6143>
-Date: Tue Feb 5 14:36:15 2013 +0000
-
- Release Snappy 1.1.0.
-
- R=sanjay
-
-
- git-svn-id: https://snappy.googlecode.com/svn/trunk@73 03e5f5b5-db94-4691-08a0-1a8bf15f6143
-
-commit 8168446c7eaaa0594e1f4ca923376dcf3a2846fa
-Author: snappy.mirrorbot@gmail.com <snappy.mirrorbot@gmail.com@03e5f5b5-db94-4691-08a0-1a8bf15f6143>
-Date: Tue Feb 5 14:30:05 2013 +0000
-
- Make ./snappy_unittest pass without "srcdir" being defined.
-
- Previously, snappy_unittests would read from an absolute path /testdata/..;
- convert it to use a relative path instead.
-
- Patch from Marc-Antonie Ruel.
-
- R=maruel
-
-
- git-svn-id: https://snappy.googlecode.com/svn/trunk@72 03e5f5b5-db94-4691-08a0-1a8bf15f6143
-
-commit 27a0cc394950ebdad2e8d67322f0862835b10bd9
-Author: snappy.mirrorbot@gmail.com <snappy.mirrorbot@gmail.com@03e5f5b5-db94-4691-08a0-1a8bf15f6143>
-Date: Fri Jan 18 12:16:36 2013 +0000
-
- Increase the Zippy block size from 32 kB to 64 kB, winning ~3% density
- while being effectively performance neutral.
-
- The longer story about density is that we win 3-6% density on the benchmarks
- where this has any effect at all; many of the benchmarks (cp, c, lsp, man)
- are smaller than 32 kB and thus will have no effect. Binary data also seems
- to win little or nothing; of course, the already-compressed data wins nothing.
- The protobuf benchmark wins as much as ~18% depending on architecture,
- but I wouldn't be too sure that this is representative of protobuf data in
- general.
-
- As of performance, we lose a tiny amount since we get more tags (e.g., a long
- literal might be broken up into literal-copy-literal), but we win it back with
- less clearing of the hash table, and more opportunities to skip incompressible
- data (e.g. in the jpg benchmark). Decompression seems to get ever so slightly
- slower, again due to more tags. The total net change is about as close to zero
- as we can get, so the end effect seems to be simply more density and no
- real performance change.
-
- The comment about not changing kBlockSize, scary as it is, is not really
- relevant, since we're never going to have a block-level decompressor without
- explicitly marked blocks. Replace it with something more appropriate.
-
- This affects the framing format, but it's okay to change it since it basically
- has no users yet.
-
-
- Density (note that cp, c, lsp and man are all smaller than 32 kB):
-
- Benchmark Description Base (%) New (%) Improvement
- --------------------------------------------------------------
- ZFlat/0 html 22.57 22.31 +5.6%
- ZFlat/1 urls 50.89 47.77 +6.5%
- ZFlat/2 jpg 99.88 99.87 +0.0%
- ZFlat/3 pdf 82.13 82.07 +0.1%
- ZFlat/4 html4 23.55 22.51 +4.6%
- ZFlat/5 cp 48.12 48.12 +0.0%
- ZFlat/6 c 42.40 42.40 +0.0%
- ZFlat/7 lsp 48.37 48.37 +0.0%
- ZFlat/8 xls 41.34 41.23 +0.3%
- ZFlat/9 txt1 59.81 57.87 +3.4%
- ZFlat/10 txt2 64.07 61.93 +3.5%
- ZFlat/11 txt3 57.11 54.92 +4.0%
- ZFlat/12 txt4 68.35 66.22 +3.2%
- ZFlat/13 bin 18.21 18.11 +0.6%
- ZFlat/14 sum 51.88 48.96 +6.0%
- ZFlat/15 man 59.36 59.36 +0.0%
- ZFlat/16 pb 23.15 19.64 +17.9%
- ZFlat/17 gaviota 38.27 37.72 +1.5%
- Geometric mean 45.51 44.15 +3.1%
-
-
- Microbenchmarks (64-bit, opt):
-
- Westmere 2.8 GHz:
-
- Benchmark Base (ns) New (ns) Improvement
- -------------------------------------------------------------------------------------------------
- BM_UFlat/0 75342 75027 1.3GB/s html +0.4%
- BM_UFlat/1 723767 744269 899.6MB/s urls -2.8%
- BM_UFlat/2 10072 10072 11.7GB/s jpg +0.0%
- BM_UFlat/3 30747 30388 2.9GB/s pdf +1.2%
- BM_UFlat/4 307353 306063 1.2GB/s html4 +0.4%
- BM_UFlat/5 28593 28743 816.3MB/s cp -0.5%
- BM_UFlat/6 12958 12998 818.1MB/s c -0.3%
- BM_UFlat/7 3700 3792 935.8MB/s lsp -2.4%
- BM_UFlat/8 999685 999905 982.1MB/s xls -0.0%
- BM_UFlat/9 232954 230079 630.4MB/s txt1 +1.2%
- BM_UFlat/10 200785 201468 592.6MB/s txt2 -0.3%
- BM_UFlat/11 617267 610968 666.1MB/s txt3 +1.0%
- BM_UFlat/12 821595 822475 558.7MB/s txt4 -0.1%
- BM_UFlat/13 377097 377632 1.3GB/s bin -0.1%
- BM_UFlat/14 45476 45260 805.8MB/s sum +0.5%
- BM_UFlat/15 4985 5003 805.7MB/s man -0.4%
- BM_UFlat/16 80813 77494 1.4GB/s pb +4.3%
- BM_UFlat/17 251792 241553 727.7MB/s gaviota +4.2%
- BM_UValidate/0 40343 40354 2.4GB/s html -0.0%
- BM_UValidate/1 426890 451574 1.4GB/s urls -5.5%
- BM_UValidate/2 187 179 661.9GB/s jpg +4.5%
- BM_UValidate/3 13783 13827 6.4GB/s pdf -0.3%
- BM_UValidate/4 162393 163335 2.3GB/s html4 -0.6%
- BM_UDataBuffer/0 93756 93302 1046.7MB/s html +0.5%
- BM_UDataBuffer/1 886714 916292 730.7MB/s urls -3.2%
- BM_UDataBuffer/2 15861 16401 7.2GB/s jpg -3.3%
- BM_UDataBuffer/3 38934 39224 2.2GB/s pdf -0.7%
- BM_UDataBuffer/4 381008 379428 1029.5MB/s html4 +0.4%
- BM_UCord/0 92528 91098 1072.0MB/s html +1.6%
- BM_UCord/1 858421 885287 756.3MB/s urls -3.0%
- BM_UCord/2 13140 13464 8.8GB/s jpg -2.4%
- BM_UCord/3 39012 37773 2.3GB/s pdf +3.3%
- BM_UCord/4 376869 371267 1052.1MB/s html4 +1.5%
- BM_UCordString/0 75810 75303 1.3GB/s html +0.7%
- BM_UCordString/1 735290 753841 888.2MB/s urls -2.5%
- BM_UCordString/2 11945 13113 9.0GB/s jpg -8.9%
- BM_UCordString/3 33901 32562 2.7GB/s pdf +4.1%
- BM_UCordString/4 310985 309390 1.2GB/s html4 +0.5%
- BM_UCordValidate/0 40952 40450 2.4GB/s html +1.2%
- BM_UCordValidate/1 433842 456531 1.4GB/s urls -5.0%
- BM_UCordValidate/2 1179 1173 100.8GB/s jpg +0.5%
- BM_UCordValidate/3 14481 14392 6.1GB/s pdf +0.6%
- BM_UCordValidate/4 164364 164151 2.3GB/s html4 +0.1%
- BM_ZFlat/0 160610 156601 623.6MB/s html (22.31 %) +2.6%
- BM_ZFlat/1 1995238 1993582 335.9MB/s urls (47.77 %) +0.1%
- BM_ZFlat/2 30133 24983 4.7GB/s jpg (99.87 %) +20.6%
- BM_ZFlat/3 74453 73128 1.2GB/s pdf (82.07 %) +1.8%
- BM_ZFlat/4 647674 633729 616.4MB/s html4 (22.51 %) +2.2%
- BM_ZFlat/5 76259 76090 308.4MB/s cp (48.12 %) +0.2%
- BM_ZFlat/6 31106 31084 342.1MB/s c (42.40 %) +0.1%
- BM_ZFlat/7 10507 10443 339.8MB/s lsp (48.37 %) +0.6%
- BM_ZFlat/8 1811047 1793325 547.6MB/s xls (41.23 %) +1.0%
- BM_ZFlat/9 597903 581793 249.3MB/s txt1 (57.87 %) +2.8%
- BM_ZFlat/10 525320 514522 232.0MB/s txt2 (61.93 %) +2.1%
- BM_ZFlat/11 1596591 1551636 262.3MB/s txt3 (54.92 %) +2.9%
- BM_ZFlat/12 2134523 2094033 219.5MB/s txt4 (66.22 %) +1.9%
- BM_ZFlat/13 593024 587869 832.6MB/s bin (18.11 %) +0.9%
- BM_ZFlat/14 114746 110666 329.5MB/s sum (48.96 %) +3.7%
- BM_ZFlat/15 14376 14485 278.3MB/s man (59.36 %) -0.8%
- BM_ZFlat/16 167908 150070 753.6MB/s pb (19.64 %) +11.9%
- BM_ZFlat/17 460228 442253 397.5MB/s gaviota (37.72 %) +4.1%
- BM_ZCord/0 164896 160241 609.4MB/s html +2.9%
- BM_ZCord/1 2070239 2043492 327.7MB/s urls +1.3%
- BM_ZCord/2 54402 47002 2.5GB/s jpg +15.7%
- BM_ZCord/3 85871 83832 1073.1MB/s pdf +2.4%
- BM_ZCord/4 664078 648825 602.0MB/s html4 +2.4%
- BM_ZDataBuffer/0 174874 172549 566.0MB/s html +1.3%
- BM_ZDataBuffer/1 2134410 2139173 313.0MB/s urls -0.2%
- BM_ZDataBuffer/2 71911 69551 1.7GB/s jpg +3.4%
- BM_ZDataBuffer/3 98236 99727 902.1MB/s pdf -1.5%
- BM_ZDataBuffer/4 710776 699104 558.8MB/s html4 +1.7%
- Sum of all benchmarks 27358908 27200688 +0.6%
-
-
- Sandy Bridge 2.6 GHz:
-
- Benchmark Base (ns) New (ns) Improvement
- -------------------------------------------------------------------------------------------------
- BM_UFlat/0 49356 49018 1.9GB/s html +0.7%
- BM_UFlat/1 516764 531955 1.2GB/s urls -2.9%
- BM_UFlat/2 6982 7304 16.2GB/s jpg -4.4%
- BM_UFlat/3 15285 15598 5.6GB/s pdf -2.0%
- BM_UFlat/4 206557 206669 1.8GB/s html4 -0.1%
- BM_UFlat/5 13681 13567 1.7GB/s cp +0.8%
- BM_UFlat/6 6571 6592 1.6GB/s c -0.3%
- BM_UFlat/7 2008 1994 1.7GB/s lsp +0.7%
- BM_UFlat/8 775700 773286 1.2GB/s xls +0.3%
- BM_UFlat/9 165578 164480 881.8MB/s txt1 +0.7%
- BM_UFlat/10 143707 144139 828.2MB/s txt2 -0.3%
- BM_UFlat/11 443026 436281 932.8MB/s txt3 +1.5%
- BM_UFlat/12 603129 595856 771.2MB/s txt4 +1.2%
- BM_UFlat/13 271682 270450 1.8GB/s bin +0.5%
- BM_UFlat/14 26200 25666 1.4GB/s sum +2.1%
- BM_UFlat/15 2620 2608 1.5GB/s man +0.5%
- BM_UFlat/16 48908 47756 2.3GB/s pb +2.4%
- BM_UFlat/17 174638 170346 1031.9MB/s gaviota +2.5%
- BM_UValidate/0 31922 31898 3.0GB/s html +0.1%
- BM_UValidate/1 341265 363554 1.8GB/s urls -6.1%
- BM_UValidate/2 160 151 782.8GB/s jpg +6.0%
- BM_UValidate/3 10402 10380 8.5GB/s pdf +0.2%
- BM_UValidate/4 129490 130587 2.9GB/s html4 -0.8%
- BM_UDataBuffer/0 59383 58736 1.6GB/s html +1.1%
- BM_UDataBuffer/1 619222 637786 1049.8MB/s urls -2.9%
- BM_UDataBuffer/2 10775 11941 9.9GB/s jpg -9.8%
- BM_UDataBuffer/3 18002 17930 4.9GB/s pdf +0.4%
- BM_UDataBuffer/4 259182 259306 1.5GB/s html4 -0.0%
- BM_UCord/0 59379 57814 1.6GB/s html +2.7%
- BM_UCord/1 598456 615162 1088.4MB/s urls -2.7%
- BM_UCord/2 8519 8628 13.7GB/s jpg -1.3%
- BM_UCord/3 18123 17537 5.0GB/s pdf +3.3%
- BM_UCord/4 252375 252331 1.5GB/s html4 +0.0%
- BM_UCordString/0 49494 49790 1.9GB/s html -0.6%
- BM_UCordString/1 524659 541803 1.2GB/s urls -3.2%
- BM_UCordString/2 8206 8354 14.2GB/s jpg -1.8%
- BM_UCordString/3 17235 16537 5.3GB/s pdf +4.2%
- BM_UCordString/4 210188 211072 1.8GB/s html4 -0.4%
- BM_UCordValidate/0 31956 31587 3.0GB/s html +1.2%
- BM_UCordValidate/1 340828 362141 1.8GB/s urls -5.9%
- BM_UCordValidate/2 783 744 158.9GB/s jpg +5.2%
- BM_UCordValidate/3 10543 10462 8.4GB/s pdf +0.8%
- BM_UCordValidate/4 130150 129789 2.9GB/s html4 +0.3%
- BM_ZFlat/0 113873 111200 878.2MB/s html (22.31 %) +2.4%
- BM_ZFlat/1 1473023 1489858 449.4MB/s urls (47.77 %) -1.1%
- BM_ZFlat/2 23569 19486 6.1GB/s jpg (99.87 %) +21.0%
- BM_ZFlat/3 49178 48046 1.8GB/s pdf (82.07 %) +2.4%
- BM_ZFlat/4 475063 469394 832.2MB/s html4 (22.51 %) +1.2%
- BM_ZFlat/5 46910 46816 501.2MB/s cp (48.12 %) +0.2%
- BM_ZFlat/6 16883 16916 628.6MB/s c (42.40 %) -0.2%
- BM_ZFlat/7 5381 5447 651.5MB/s lsp (48.37 %) -1.2%
- BM_ZFlat/8 1466870 1473861 666.3MB/s xls (41.23 %) -0.5%
- BM_ZFlat/9 468006 464101 312.5MB/s txt1 (57.87 %) +0.8%
- BM_ZFlat/10 408157 408957 291.9MB/s txt2 (61.93 %) -0.2%
- BM_ZFlat/11 1253348 1232910 330.1MB/s txt3 (54.92 %) +1.7%
- BM_ZFlat/12 1702373 1702977 269.8MB/s txt4 (66.22 %) -0.0%
- BM_ZFlat/13 439792 438557 1116.0MB/s bin (18.11 %) +0.3%
- BM_ZFlat/14 80766 78851 462.5MB/s sum (48.96 %) +2.4%
- BM_ZFlat/15 7420 7542 534.5MB/s man (59.36 %) -1.6%
- BM_ZFlat/16 112043 100126 1.1GB/s pb (19.64 %) +11.9%
- BM_ZFlat/17 368877 357703 491.4MB/s gaviota (37.72 %) +3.1%
- BM_ZCord/0 116402 113564 859.9MB/s html +2.5%
- BM_ZCord/1 1507156 1519911 440.5MB/s urls -0.8%
- BM_ZCord/2 39860 33686 3.5GB/s jpg +18.3%
- BM_ZCord/3 56211 54694 1.6GB/s pdf +2.8%
- BM_ZCord/4 485594 479212 815.1MB/s html4 +1.3%
- BM_ZDataBuffer/0 123185 121572 803.3MB/s html +1.3%
- BM_ZDataBuffer/1 1569111 1589380 421.3MB/s urls -1.3%
- BM_ZDataBuffer/2 53143 49556 2.4GB/s jpg +7.2%
- BM_ZDataBuffer/3 65725 66826 1.3GB/s pdf -1.6%
- BM_ZDataBuffer/4 517871 514750 758.9MB/s html4 +0.6%
- Sum of all benchmarks 20258879 20315484 -0.3%
-
-
- AMD Instanbul 2.4 GHz:
-
- Benchmark Base (ns) New (ns) Improvement
- -------------------------------------------------------------------------------------------------
- BM_UFlat/0 97120 96585 1011.1MB/s html +0.6%
- BM_UFlat/1 917473 948016 706.3MB/s urls -3.2%
- BM_UFlat/2 21496 23938 4.9GB/s jpg -10.2%
- BM_UFlat/3 44751 45639 1.9GB/s pdf -1.9%
- BM_UFlat/4 391950 391413 998.0MB/s html4 +0.1%
- BM_UFlat/5 37366 37201 630.7MB/s cp +0.4%
- BM_UFlat/6 18350 18318 580.5MB/s c +0.2%
- BM_UFlat/7 5672 5661 626.9MB/s lsp +0.2%
- BM_UFlat/8 1533390 1529441 642.1MB/s xls +0.3%
- BM_UFlat/9 335477 336553 431.0MB/s txt1 -0.3%
- BM_UFlat/10 285140 292080 408.7MB/s txt2 -2.4%
- BM_UFlat/11 888507 894758 454.9MB/s txt3 -0.7%
- BM_UFlat/12 1187643 1210928 379.5MB/s txt4 -1.9%
- BM_UFlat/13 493717 507447 964.5MB/s bin -2.7%
- BM_UFlat/14 61740 60870 599.1MB/s sum +1.4%
- BM_UFlat/15 7211 7187 560.9MB/s man +0.3%
- BM_UFlat/16 97435 93100 1.2GB/s pb +4.7%
- BM_UFlat/17 362662 356395 493.2MB/s gaviota +1.8%
- BM_UValidate/0 47475 47118 2.0GB/s html +0.8%
- BM_UValidate/1 501304 529741 1.2GB/s urls -5.4%
- BM_UValidate/2 276 243 486.2GB/s jpg +13.6%
- BM_UValidate/3 16361 16261 5.4GB/s pdf +0.6%
- BM_UValidate/4 190741 190353 2.0GB/s html4 +0.2%
- BM_UDataBuffer/0 111080 109771 889.6MB/s html +1.2%
- BM_UDataBuffer/1 1051035 1085999 616.5MB/s urls -3.2%
- BM_UDataBuffer/2 25801 25463 4.6GB/s jpg +1.3%
- BM_UDataBuffer/3 50493 49946 1.8GB/s pdf +1.1%
- BM_UDataBuffer/4 447258 444138 879.5MB/s html4 +0.7%
- BM_UCord/0 109350 107909 905.0MB/s html +1.3%
- BM_UCord/1 1023396 1054964 634.7MB/s urls -3.0%
- BM_UCord/2 25292 24371 4.9GB/s jpg +3.8%
- BM_UCord/3 48955 49736 1.8GB/s pdf -1.6%
- BM_UCord/4 440452 437331 893.2MB/s html4 +0.7%
- BM_UCordString/0 98511 98031 996.2MB/s html +0.5%
- BM_UCordString/1 933230 963495 694.9MB/s urls -3.1%
- BM_UCordString/2 23311 24076 4.9GB/s jpg -3.2%
- BM_UCordString/3 45568 46196 1.9GB/s pdf -1.4%
- BM_UCordString/4 397791 396934 984.1MB/s html4 +0.2%
- BM_UCordValidate/0 47537 46921 2.0GB/s html +1.3%
- BM_UCordValidate/1 505071 532716 1.2GB/s urls -5.2%
- BM_UCordValidate/2 1663 1621 72.9GB/s jpg +2.6%
- BM_UCordValidate/3 16890 16926 5.2GB/s pdf -0.2%
- BM_UCordValidate/4 192365 191984 2.0GB/s html4 +0.2%
- BM_ZFlat/0 184708 179103 545.3MB/s html (22.31 %) +3.1%
- BM_ZFlat/1 2293864 2302950 290.7MB/s urls (47.77 %) -0.4%
- BM_ZFlat/2 52852 47618 2.5GB/s jpg (99.87 %) +11.0%
- BM_ZFlat/3 100766 96179 935.3MB/s pdf (82.07 %) +4.8%
- BM_ZFlat/4 741220 727977 536.6MB/s html4 (22.51 %) +1.8%
- BM_ZFlat/5 85402 85418 274.7MB/s cp (48.12 %) -0.0%
- BM_ZFlat/6 36558 36494 291.4MB/s c (42.40 %) +0.2%
- BM_ZFlat/7 12706 12507 283.7MB/s lsp (48.37 %) +1.6%
- BM_ZFlat/8 2336823 2335688 420.5MB/s xls (41.23 %) +0.0%
- BM_ZFlat/9 701804 681153 212.9MB/s txt1 (57.87 %) +3.0%
- BM_ZFlat/10 606700 597194 199.9MB/s txt2 (61.93 %) +1.6%
- BM_ZFlat/11 1852283 1803238 225.7MB/s txt3 (54.92 %) +2.7%
- BM_ZFlat/12 2475527 2443354 188.1MB/s txt4 (66.22 %) +1.3%
- BM_ZFlat/13 694497 696654 702.6MB/s bin (18.11 %) -0.3%
- BM_ZFlat/14 136929 129855 280.8MB/s sum (48.96 %) +5.4%
- BM_ZFlat/15 17172 17124 235.4MB/s man (59.36 %) +0.3%
- BM_ZFlat/16 190364 171763 658.4MB/s pb (19.64 %) +10.8%
- BM_ZFlat/17 567285 555190 316.6MB/s gaviota (37.72 %) +2.2%
- BM_ZCord/0 193490 187031 522.1MB/s html +3.5%
- BM_ZCord/1 2427537 2415315 277.2MB/s urls +0.5%
- BM_ZCord/2 85378 81412 1.5GB/s jpg +4.9%
- BM_ZCord/3 121898 119419 753.3MB/s pdf +2.1%
- BM_ZCord/4 779564 762961 512.0MB/s html4 +2.2%
- BM_ZDataBuffer/0 213820 207272 471.1MB/s html +3.2%
- BM_ZDataBuffer/1 2589010 2586495 258.9MB/s urls +0.1%
- BM_ZDataBuffer/2 121871 118885 1018.4MB/s jpg +2.5%
- BM_ZDataBuffer/3 145382 145986 616.2MB/s pdf -0.4%
- BM_ZDataBuffer/4 868117 852754 458.1MB/s html4 +1.8%
- Sum of all benchmarks 33771833 33744763 +0.1%
-
-
- git-svn-id: https://snappy.googlecode.com/svn/trunk@71 03e5f5b5-db94-4691-08a0-1a8bf15f6143
-
-commit 81f34784b7b812dcda956ee489dfdc74ec2da990
-Author: snappy.mirrorbot@gmail.com <snappy.mirrorbot@gmail.com@03e5f5b5-db94-4691-08a0-1a8bf15f6143>
-Date: Sun Jan 6 19:21:26 2013 +0000
-
- Adjust the Snappy open-source distribution for the changes in Google's
- internal file API.
-
- R=sanjay
-
-
-
- git-svn-id: https://snappy.googlecode.com/svn/trunk@70 03e5f5b5-db94-4691-08a0-1a8bf15f6143
-
-commit 698af469b47fe809905e2ed173ad84241de5800f
-Author: snappy.mirrorbot@gmail.com <snappy.mirrorbot@gmail.com@03e5f5b5-db94-4691-08a0-1a8bf15f6143>
-Date: Fri Jan 4 11:54:20 2013 +0000
-
- Change a few ORs to additions where they don't matter. This helps the compiler
- use the LEA instruction more efficiently, since e.g. a + (b << 2) can be encoded
- as one instruction. Even more importantly, it can constant-fold the
- COPY_* enums together with the shifted negative constants, which also saves
- some instructions. (We don't need it for LITERAL, since it happens to be 0.)
-
- I am unsure why the compiler couldn't do this itself, but the theory is that
- it cannot prove that len-1 and len-4 cannot underflow/wrap, and thus can't
- do the optimization safely.
-
- The gains are small but measurable; 0.5-1.0% over the BM_Z* benchmarks
- (measured on Westmere, Sandy Bridge and Istanbul).
-
- R=sanjay
-
-
- git-svn-id: https://snappy.googlecode.com/svn/trunk@69 03e5f5b5-db94-4691-08a0-1a8bf15f6143
-
-commit 55209f9b92efd97e0a61be28ed94210de04c3bfc
-Author: snappy.mirrorbot@gmail.com <snappy.mirrorbot@gmail.com@03e5f5b5-db94-4691-08a0-1a8bf15f6143>
-Date: Mon Oct 8 11:37:16 2012 +0000
-
- Stop giving -Werror to automake, due to an incompatibility between current
- versions of libtool and automake on non-GNU platforms (e.g. Mac OS X).
-
- R=sanjay
-
-
- git-svn-id: https://snappy.googlecode.com/svn/trunk@68 03e5f5b5-db94-4691-08a0-1a8bf15f6143
-
-commit b86e81c8b3426a62d8ab3a7674c2506e9e678740
-Author: snappy.mirrorbot@gmail.com <snappy.mirrorbot@gmail.com@03e5f5b5-db94-4691-08a0-1a8bf15f6143>
-Date: Fri Aug 17 13:54:47 2012 +0000
-
- Fix public issue 66: Document GetUncompressedLength better, in particular that
- it leaves the source in a state that's not appropriate for RawUncompress.
-
- R=sanjay
-
-
- git-svn-id: https://snappy.googlecode.com/svn/trunk@67 03e5f5b5-db94-4691-08a0-1a8bf15f6143
-
-commit 2e225ba821b420ae28e1d427075d5589c1e892d9
-Author: snappy.mirrorbot@gmail.com <snappy.mirrorbot@gmail.com@03e5f5b5-db94-4691-08a0-1a8bf15f6143>
-Date: Tue Jul 31 11:44:44 2012 +0000
-
- Fix public issue 64: Check for <sys/time.h> at configure time,
- since MSVC seemingly does not have it.
-
- R=sanjay
-
-
- git-svn-id: https://snappy.googlecode.com/svn/trunk@66 03e5f5b5-db94-4691-08a0-1a8bf15f6143
-
-commit e89f20ab46ee11050760c6d57f05c2a3825a911c
-Author: snappy.mirrorbot@gmail.com <snappy.mirrorbot@gmail.com@03e5f5b5-db94-4691-08a0-1a8bf15f6143>
-Date: Wed Jul 4 09:34:48 2012 +0000
-
- Handle the case where gettimeofday() goes backwards or returns the same value
- twice; it could cause division by zero in the unit test framework.
- (We already had one fix for this in place, but it was incomplete.)
-
- This could in theory happen on any system, since there are few guarantees
- about gettimeofday(), but seems to only happen in practice on GNU/Hurd, where
- gettimeofday() is cached and only updated ever so often.
-
- R=sanjay
-
-
- git-svn-id: https://snappy.googlecode.com/svn/trunk@65 03e5f5b5-db94-4691-08a0-1a8bf15f6143
-
-commit 3ec60ac9878de5d0317ad38fc545080a4bfaa74f
-Author: snappy.mirrorbot@gmail.com <snappy.mirrorbot@gmail.com@03e5f5b5-db94-4691-08a0-1a8bf15f6143>
-Date: Wed Jul 4 09:28:33 2012 +0000
-
- Mark ARMv4 as not supporting unaligned accesses (not just ARMv5 and ARMv6);
- apparently Debian still targets these by default, giving us segfaults on
- armel.
-
- R=sanjay
-
-
- git-svn-id: https://snappy.googlecode.com/svn/trunk@64 03e5f5b5-db94-4691-08a0-1a8bf15f6143
-
-commit be80d6f74f9d82220e952a54f3f129aae1f13f95
-Author: snappy.mirrorbot@gmail.com <snappy.mirrorbot@gmail.com@03e5f5b5-db94-4691-08a0-1a8bf15f6143>
-Date: Tue May 22 09:46:05 2012 +0000
-
- Fix public bug #62: Remove an extraneous comma at the end of an enum list,
- causing compile errors when embedded in Mozilla on OpenBSD.
-
- R=sanjay
-
-
- git-svn-id: https://snappy.googlecode.com/svn/trunk@63 03e5f5b5-db94-4691-08a0-1a8bf15f6143
-
-commit 8b95464146dddab1c7068f879162db9a885cdafe
-Author: snappy.mirrorbot@gmail.com <snappy.mirrorbot@gmail.com@03e5f5b5-db94-4691-08a0-1a8bf15f6143>
-Date: Tue May 22 09:32:50 2012 +0000
-
- Snappy library no longer depends on iostream.
-
- Achieved by moving logging macro definitions to a test-only
- header file, and by changing non-test code to use assert,
- fprintf, and abort instead of LOG/CHECK macros.
-
- R=sesse
-
-
- git-svn-id: https://snappy.googlecode.com/svn/trunk@62 03e5f5b5-db94-4691-08a0-1a8bf15f6143
-
-commit fc723b212d6972af7051261754770b3f70a7dc03
-Author: snappy.mirrorbot@gmail.com <snappy.mirrorbot@gmail.com@03e5f5b5-db94-4691-08a0-1a8bf15f6143>
-Date: Fri Feb 24 15:46:37 2012 +0000
-
- Release Snappy 1.0.5.
-
- R=sanjay
-
-
- git-svn-id: https://snappy.googlecode.com/svn/trunk@61 03e5f5b5-db94-4691-08a0-1a8bf15f6143
-
-commit dc63e0ad9693e13390ba31b00d92ecccaf7605c3
-Author: snappy.mirrorbot@gmail.com <snappy.mirrorbot@gmail.com@03e5f5b5-db94-4691-08a0-1a8bf15f6143>
-Date: Thu Feb 23 17:00:36 2012 +0000
-
- For 32-bit platforms, do not try to accelerate multiple neighboring
- 32-bit loads with a 64-bit load during compression (it's not a win).
-
- The main target for this optimization is ARM, but 32-bit x86 gets
- a small gain, too, although there is noise in the microbenchmarks.
- It's a no-op for 64-bit x86. It does not affect decompression.
-
- Microbenchmark results on a Cortex-A9 1GHz, using g++ 4.6.2 (from
- Ubuntu/Linaro), -O2 -DNDEBUG -Wa,-march=armv7a -mtune=cortex-a9
- -mthumb-interwork, minimum 1000 iterations:
-
- Benchmark Time(ns) CPU(ns) Iterations
- ---------------------------------------------------
- BM_ZFlat/0 1158277 1160000 1000 84.2MB/s html (23.57 %) [ +4.3%]
- BM_ZFlat/1 14861782 14860000 1000 45.1MB/s urls (50.89 %) [ +1.1%]
- BM_ZFlat/2 393595 390000 1000 310.5MB/s jpg (99.88 %) [ +0.0%]
- BM_ZFlat/3 650583 650000 1000 138.4MB/s pdf (82.13 %) [ +3.1%]
- BM_ZFlat/4 4661480 4660000 1000 83.8MB/s html4 (23.55 %) [ +4.3%]
- BM_ZFlat/5 491973 490000 1000 47.9MB/s cp (48.12 %) [ +2.0%]
- BM_ZFlat/6 193575 192678 1038 55.2MB/s c (42.40 %) [ +9.0%]
- BM_ZFlat/7 62343 62754 3187 56.5MB/s lsp (48.37 %) [ +2.6%]
- BM_ZFlat/8 17708468 17710000 1000 55.5MB/s xls (41.34 %) [ -0.3%]
- BM_ZFlat/9 3755345 3760000 1000 38.6MB/s txt1 (59.81 %) [ +8.2%]
- BM_ZFlat/10 3324217 3320000 1000 36.0MB/s txt2 (64.07 %) [ +4.2%]
- BM_ZFlat/11 10139932 10140000 1000 40.1MB/s txt3 (57.11 %) [ +6.4%]
- BM_ZFlat/12 13532109 13530000 1000 34.0MB/s txt4 (68.35 %) [ +5.0%]
- BM_ZFlat/13 4690847 4690000 1000 104.4MB/s bin (18.21 %) [ +4.1%]
- BM_ZFlat/14 830682 830000 1000 43.9MB/s sum (51.88 %) [ +1.2%]
- BM_ZFlat/15 84784 85011 2235 47.4MB/s man (59.36 %) [ +1.1%]
- BM_ZFlat/16 1293254 1290000 1000 87.7MB/s pb (23.15 %) [ +2.3%]
- BM_ZFlat/17 2775155 2780000 1000 63.2MB/s gaviota (38.27 %) [+12.2%]
-
- Core i7 in 32-bit mode (only one run and 100 iterations, though, so noisy):
-
- Benchmark Time(ns) CPU(ns) Iterations
- ---------------------------------------------------
- BM_ZFlat/0 227582 223464 3043 437.0MB/s html (23.57 %) [ +7.4%]
- BM_ZFlat/1 2982430 2918455 233 229.4MB/s urls (50.89 %) [ +2.9%]
- BM_ZFlat/2 46967 46658 15217 2.5GB/s jpg (99.88 %) [ +0.0%]
- BM_ZFlat/3 115298 114864 5833 783.2MB/s pdf (82.13 %) [ +1.5%]
- BM_ZFlat/4 913440 899743 778 434.2MB/s html4 (23.55 %) [ +0.3%]
- BM_ZFlat/5 110302 108571 7000 216.1MB/s cp (48.12 %) [ +0.0%]
- BM_ZFlat/6 44409 43372 15909 245.2MB/s c (42.40 %) [ +0.8%]
- BM_ZFlat/7 15713 15643 46667 226.9MB/s lsp (48.37 %) [ +2.7%]
- BM_ZFlat/8 2625539 2602230 269 377.4MB/s xls (41.34 %) [ +1.4%]
- BM_ZFlat/9 808884 811429 875 178.8MB/s txt1 (59.81 %) [ -3.9%]
- BM_ZFlat/10 709532 700000 1000 170.5MB/s txt2 (64.07 %) [ +0.0%]
- BM_ZFlat/11 2177682 2162162 333 188.2MB/s txt3 (57.11 %) [ -1.4%]
- BM_ZFlat/12 2849640 2840000 250 161.8MB/s txt4 (68.35 %) [ -1.4%]
- BM_ZFlat/13 849760 835476 778 585.8MB/s bin (18.21 %) [ +1.2%]
- BM_ZFlat/14 165940 164571 4375 221.6MB/s sum (51.88 %) [ +1.4%]
- BM_ZFlat/15 20939 20571 35000 196.0MB/s man (59.36 %) [ +2.1%]
- BM_ZFlat/16 239209 236544 2917 478.1MB/s pb (23.15 %) [ +4.2%]
- BM_ZFlat/17 616206 610000 1000 288.2MB/s gaviota (38.27 %) [ -1.6%]
-
- R=sanjay
-
-
- git-svn-id: https://snappy.googlecode.com/svn/trunk@60 03e5f5b5-db94-4691-08a0-1a8bf15f6143
-
-commit f8829ea39d51432ba4e6a26ddaec57acea779f4c
-Author: snappy.mirrorbot@gmail.com <snappy.mirrorbot@gmail.com@03e5f5b5-db94-4691-08a0-1a8bf15f6143>
-Date: Tue Feb 21 17:02:17 2012 +0000
-
- Enable the use of unaligned loads and stores for ARM-based architectures
- where they are available (ARMv7 and higher). This gives a significant
- speed boost on ARM, both for compression and decompression.
- It should not affect x86 at all.
-
- There are more changes possible to speed up ARM, but it might not be
- that easy to do without hurting x86 or making the code uglier.
- Also, we de not try to use NEON yet.
-
- Microbenchmark results on a Cortex-A9 1GHz, using g++ 4.6.2 (from Ubuntu/Linaro),
- -O2 -DNDEBUG -Wa,-march=armv7a -mtune=cortex-a9 -mthumb-interwork:
-
- Benchmark Time(ns) CPU(ns) Iterations
- ---------------------------------------------------
- BM_UFlat/0 524806 529100 378 184.6MB/s html [+33.6%]
- BM_UFlat/1 5139790 5200000 100 128.8MB/s urls [+28.8%]
- BM_UFlat/2 86540 84166 1901 1.4GB/s jpg [ +0.6%]
- BM_UFlat/3 215351 210176 904 428.0MB/s pdf [+29.8%]
- BM_UFlat/4 2144490 2100000 100 186.0MB/s html4 [+33.3%]
- BM_UFlat/5 194482 190000 1000 123.5MB/s cp [+36.2%]
- BM_UFlat/6 91843 90175 2107 117.9MB/s c [+38.6%]
- BM_UFlat/7 28535 28426 6684 124.8MB/s lsp [+34.7%]
- BM_UFlat/8 9206600 9200000 100 106.7MB/s xls [+42.4%]
- BM_UFlat/9 1865273 1886792 106 76.9MB/s txt1 [+32.5%]
- BM_UFlat/10 1576809 1587301 126 75.2MB/s txt2 [+32.3%]
- BM_UFlat/11 4968450 4900000 100 83.1MB/s txt3 [+32.7%]
- BM_UFlat/12 6673970 6700000 100 68.6MB/s txt4 [+32.8%]
- BM_UFlat/13 2391470 2400000 100 203.9MB/s bin [+29.2%]
- BM_UFlat/14 334601 344827 522 105.8MB/s sum [+30.6%]
- BM_UFlat/15 37404 38080 5252 105.9MB/s man [+33.8%]
- BM_UFlat/16 535470 540540 370 209.2MB/s pb [+31.2%]
- BM_UFlat/17 1875245 1886792 106 93.2MB/s gaviota [+37.8%]
- BM_UValidate/0 178425 179533 1114 543.9MB/s html [ +2.7%]
- BM_UValidate/1 2100450 2000000 100 334.8MB/s urls [ +5.0%]
- BM_UValidate/2 1039 1044 172413 113.3GB/s jpg [ +3.4%]
- BM_UValidate/3 59423 59470 3363 1.5GB/s pdf [ +7.8%]
- BM_UValidate/4 760716 766283 261 509.8MB/s html4 [ +6.5%]
- BM_ZFlat/0 1204632 1204819 166 81.1MB/s html (23.57 %) [+32.8%]
- BM_ZFlat/1 15656190 15600000 100 42.9MB/s urls (50.89 %) [+27.6%]
- BM_ZFlat/2 403336 410677 487 294.8MB/s jpg (99.88 %) [+16.5%]
- BM_ZFlat/3 664073 671140 298 134.0MB/s pdf (82.13 %) [+28.4%]
- BM_ZFlat/4 4961940 4900000 100 79.7MB/s html4 (23.55 %) [+30.6%]
- BM_ZFlat/5 500664 501253 399 46.8MB/s cp (48.12 %) [+33.4%]
- BM_ZFlat/6 217276 215982 926 49.2MB/s c (42.40 %) [+25.0%]
- BM_ZFlat/7 64122 65487 3054 54.2MB/s lsp (48.37 %) [+36.1%]
- BM_ZFlat/8 18045730 18000000 100 54.6MB/s xls (41.34 %) [+34.4%]
- BM_ZFlat/9 4051530 4000000 100 36.3MB/s txt1 (59.81 %) [+25.0%]
- BM_ZFlat/10 3451800 3500000 100 34.1MB/s txt2 (64.07 %) [+25.7%]
- BM_ZFlat/11 11052340 11100000 100 36.7MB/s txt3 (57.11 %) [+24.3%]
- BM_ZFlat/12 14538690 14600000 100 31.5MB/s txt4 (68.35 %) [+24.7%]
- BM_ZFlat/13 5041850 5000000 100 97.9MB/s bin (18.21 %) [+32.0%]
- BM_ZFlat/14 908840 909090 220 40.1MB/s sum (51.88 %) [+22.2%]
- BM_ZFlat/15 86921 86206 1972 46.8MB/s man (59.36 %) [+42.2%]
- BM_ZFlat/16 1312315 1315789 152 86.0MB/s pb (23.15 %) [+34.5%]
- BM_ZFlat/17 3173120 3200000 100 54.9MB/s gaviota (38.27%) [+28.1%]
-
-
- The move from 64-bit to 32-bit operations for the copies also affected 32-bit x86;
- positive on the decompression side, and slightly negative on the compression side
- (unless that is noise; I only ran once):
-
- Benchmark Time(ns) CPU(ns) Iterations
- -----------------------------------------------------
- BM_UFlat/0 86279 86140 7778 1.1GB/s html [ +7.5%]
- BM_UFlat/1 839265 822622 778 813.9MB/s urls [ +9.4%]
- BM_UFlat/2 9180 9143 87500 12.9GB/s jpg [ +1.2%]
- BM_UFlat/3 35080 35000 20000 2.5GB/s pdf [+10.1%]
- BM_UFlat/4 350318 345000 2000 1.1GB/s html4 [ +7.0%]
- BM_UFlat/5 33808 33472 21212 701.0MB/s cp [ +9.0%]
- BM_UFlat/6 15201 15214 46667 698.9MB/s c [+14.9%]
- BM_UFlat/7 4652 4651 159091 762.9MB/s lsp [ +7.5%]
- BM_UFlat/8 1285551 1282528 538 765.7MB/s xls [+10.7%]
- BM_UFlat/9 282510 281690 2414 514.9MB/s txt1 [+13.6%]
- BM_UFlat/10 243494 239286 2800 498.9MB/s txt2 [+14.4%]
- BM_UFlat/11 743625 740000 1000 550.0MB/s txt3 [+14.3%]
- BM_UFlat/12 999441 989717 778 464.3MB/s txt4 [+16.1%]
- BM_UFlat/13 412402 410076 1707 1.2GB/s bin [ +7.3%]
- BM_UFlat/14 54876 54000 10000 675.3MB/s sum [+13.0%]
- BM_UFlat/15 6146 6100 100000 660.8MB/s man [+14.8%]
- BM_UFlat/16 90496 90286 8750 1.2GB/s pb [ +4.0%]
- BM_UFlat/17 292650 292000 2500 602.0MB/s gaviota [+18.1%]
- BM_UValidate/0 49620 49699 14286 1.9GB/s html [ +0.0%]
- BM_UValidate/1 501371 500000 1000 1.3GB/s urls [ +0.0%]
- BM_UValidate/2 232 227 3043478 521.5GB/s jpg [ +1.3%]
- BM_UValidate/3 17250 17143 43750 5.1GB/s pdf [ -1.3%]
- BM_UValidate/4 198643 200000 3500 1.9GB/s html4 [ -0.9%]
- BM_ZFlat/0 227128 229415 3182 425.7MB/s html (23.57 %) [ -1.4%]
- BM_ZFlat/1 2970089 2960000 250 226.2MB/s urls (50.89 %) [ -1.9%]
- BM_ZFlat/2 45683 44999 15556 2.6GB/s jpg (99.88 %) [ +2.2%]
- BM_ZFlat/3 114661 113136 6364 795.1MB/s pdf (82.13 %) [ -1.5%]
- BM_ZFlat/4 919702 914286 875 427.2MB/s html4 (23.55%) [ -1.3%]
- BM_ZFlat/5 108189 108422 6364 216.4MB/s cp (48.12 %) [ -1.2%]
- BM_ZFlat/6 44525 44000 15909 241.7MB/s c (42.40 %) [ -2.9%]
- BM_ZFlat/7 15973 15857 46667 223.8MB/s lsp (48.37 %) [ +0.0%]
- BM_ZFlat/8 2677888 2639405 269 372.1MB/s xls (41.34 %) [ -1.4%]
- BM_ZFlat/9 800715 780000 1000 186.0MB/s txt1 (59.81 %) [ -0.4%]
- BM_ZFlat/10 700089 700000 1000 170.5MB/s txt2 (64.07 %) [ -2.9%]
- BM_ZFlat/11 2159356 2138365 318 190.3MB/s txt3 (57.11 %) [ -0.3%]
- BM_ZFlat/12 2796143 2779923 259 165.3MB/s txt4 (68.35 %) [ -1.4%]
- BM_ZFlat/13 856458 835476 778 585.8MB/s bin (18.21 %) [ -0.1%]
- BM_ZFlat/14 166908 166857 4375 218.6MB/s sum (51.88 %) [ -1.4%]
- BM_ZFlat/15 21181 20857 35000 193.3MB/s man (59.36 %) [ -0.8%]
- BM_ZFlat/16 244009 239973 2917 471.3MB/s pb (23.15 %) [ -1.4%]
- BM_ZFlat/17 596362 590000 1000 297.9MB/s gaviota (38.27%) [ +0.0%]
-
- R=sanjay
-
-
- git-svn-id: https://snappy.googlecode.com/svn/trunk@59 03e5f5b5-db94-4691-08a0-1a8bf15f6143
-
-commit f2e184f638bdc7905f26c24faaf10fc0f5d33403
-Author: snappy.mirrorbot@gmail.com <snappy.mirrorbot@gmail.com@03e5f5b5-db94-4691-08a0-1a8bf15f6143>
-Date: Sat Feb 11 22:11:22 2012 +0000
-
- Lower the size allocated in the "corrupted input" unit test from 256 MB
- to 2 MB. This fixes issues with running the unit test on platforms with
- little RAM (e.g. some ARM boards).
-
- Also, reactivate the 2 MB test for 64-bit platforms; there's no good
- reason why it shouldn't be.
-
- R=sanjay
-
-
- git-svn-id: https://snappy.googlecode.com/svn/trunk@58 03e5f5b5-db94-4691-08a0-1a8bf15f6143
-
-commit e750dc0f054ba74b0ce76dd2013e6728cc7a41c5
-Author: snappy.mirrorbot@gmail.com <snappy.mirrorbot@gmail.com@03e5f5b5-db94-4691-08a0-1a8bf15f6143>
-Date: Sun Jan 8 17:55:48 2012 +0000
-
- Minor refactoring to accomodate changes in Google's internal code tree.
-
-
- git-svn-id: https://snappy.googlecode.com/svn/trunk@57 03e5f5b5-db94-4691-08a0-1a8bf15f6143
-
-commit d9068ee301bdf893a4d8cb7c6518eacc44c4c1f2
-Author: snappy.mirrorbot@gmail.com <snappy.mirrorbot@gmail.com@03e5f5b5-db94-4691-08a0-1a8bf15f6143>
-Date: Wed Jan 4 13:10:46 2012 +0000
-
- Fix public issue r57: Fix most warnings with -Wall, mostly signed/unsigned
- warnings. There are still some in the unit test, but the main .cc file should
- be clean. We haven't enabled -Wall for the default build, since the unit test
- is still not clean.
-
- This also fixes a real bug in the open-source implementation of
- ReadFileToStringOrDie(); it would not detect errors correctly.
-
- I had to go through some pains to avoid performance loss as the types
- were changed; I think there might still be some with 32-bit if and only if LFS
- is enabled (ie., size_t is 64-bit), but for regular 32-bit and 64-bit I can't
- see any losses, and I've diffed the generated GCC assembler between the old and
- new code without seeing any significant choices. If anything, it's ever so
- slightly faster.
-
- This may or may not enable compression of very large blocks (>2^32 bytes)
- when size_t is 64-bit, but I haven't checked, and it is still not a supported
- case.
-
-
- git-svn-id: https://snappy.googlecode.com/svn/trunk@56 03e5f5b5-db94-4691-08a0-1a8bf15f6143
-
-commit 0755c815197dacc77d8971ae917c86d7aa96bf8e
-Author: snappy.mirrorbot@gmail.com <snappy.mirrorbot@gmail.com@03e5f5b5-db94-4691-08a0-1a8bf15f6143>
-Date: Wed Jan 4 10:46:39 2012 +0000
-
- Add a framing format description. We do not have any implementation of this at
- the current point, but there seems to be enough of a general interest in the
- topic (cf. public bug #34).
-
- R=csilvers,sanjay
-
-
- git-svn-id: https://snappy.googlecode.com/svn/trunk@55 03e5f5b5-db94-4691-08a0-1a8bf15f6143
-
-commit d7eb2dc4133794b62cba691f9be40d1549bc32e2
-Author: snappy.mirrorbot@gmail.com <snappy.mirrorbot@gmail.com@03e5f5b5-db94-4691-08a0-1a8bf15f6143>
-Date: Mon Dec 5 21:27:26 2011 +0000
-
- Speed up decompression by moving the refill check to the end of the loop.
-
- This seems to work because in most of the branches, the compiler can evaluate
- “ip_limit_ - ip” in a more efficient way than reloading ip_limit_ from memory
- (either by already having the entire expression in a register, or reconstructing
- it from “avail”, or something else). Memory loads, even from L1, are seemingly
- costly in the big picture at the current decompression speeds.
-
- Microbenchmarks (64-bit, opt mode):
-
- Westmere (Intel Core i7):
-
- Benchmark Time(ns) CPU(ns) Iterations
- --------------------------------------------
- BM_UFlat/0 74492 74491 187894 1.3GB/s html [ +5.9%]
- BM_UFlat/1 712268 712263 19644 940.0MB/s urls [ +3.8%]
- BM_UFlat/2 10591 10590 1000000 11.2GB/s jpg [ -6.8%]
- BM_UFlat/3 29643 29643 469915 3.0GB/s pdf [ +7.9%]
- BM_UFlat/4 304669 304667 45930 1.3GB/s html4 [ +4.8%]
- BM_UFlat/5 28508 28507 490077 823.1MB/s cp [ +4.0%]
- BM_UFlat/6 12415 12415 1000000 856.5MB/s c [ +8.6%]
- BM_UFlat/7 3415 3415 4084723 1039.0MB/s lsp [+18.0%]
- BM_UFlat/8 979569 979563 14261 1002.5MB/s xls [ +5.8%]
- BM_UFlat/9 230150 230148 60934 630.2MB/s txt1 [ +5.2%]
- BM_UFlat/10 197167 197166 71135 605.5MB/s txt2 [ +4.7%]
- BM_UFlat/11 607394 607390 23041 670.1MB/s txt3 [ +5.6%]
- BM_UFlat/12 808502 808496 17316 568.4MB/s txt4 [ +5.0%]
- BM_UFlat/13 372791 372788 37564 1.3GB/s bin [ +3.3%]
- BM_UFlat/14 44541 44541 313969 818.8MB/s sum [ +5.7%]
- BM_UFlat/15 4833 4833 2898697 834.1MB/s man [ +4.8%]
- BM_UFlat/16 79855 79855 175356 1.4GB/s pb [ +4.8%]
- BM_UFlat/17 245845 245843 56838 715.0MB/s gaviota [ +5.8%]
-
- Clovertown (Intel Core 2):
-
- Benchmark Time(ns) CPU(ns) Iterations
- --------------------------------------------
- BM_UFlat/0 107911 107890 100000 905.1MB/s html [ +2.2%]
- BM_UFlat/1 1011237 1011041 10000 662.3MB/s urls [ +2.5%]
- BM_UFlat/2 26775 26770 523089 4.4GB/s jpg [ +0.0%]
- BM_UFlat/3 48103 48095 290618 1.8GB/s pdf [ +3.4%]
- BM_UFlat/4 437724 437644 31937 892.6MB/s html4 [ +2.1%]
- BM_UFlat/5 39607 39600 358284 592.5MB/s cp [ +2.4%]
- BM_UFlat/6 18227 18224 768191 583.5MB/s c [ +2.7%]
- BM_UFlat/7 5171 5170 2709437 686.4MB/s lsp [ +3.9%]
- BM_UFlat/8 1560291 1559989 8970 629.5MB/s xls [ +3.6%]
- BM_UFlat/9 335401 335343 41731 432.5MB/s txt1 [ +3.0%]
- BM_UFlat/10 287014 286963 48758 416.0MB/s txt2 [ +2.8%]
- BM_UFlat/11 888522 888356 15752 458.1MB/s txt3 [ +2.9%]
- BM_UFlat/12 1186600 1186378 10000 387.3MB/s txt4 [ +3.1%]
- BM_UFlat/13 572295 572188 24468 855.4MB/s bin [ +2.1%]
- BM_UFlat/14 64060 64049 218401 569.4MB/s sum [ +4.1%]
- BM_UFlat/15 7264 7263 1916168 555.0MB/s man [ +1.4%]
- BM_UFlat/16 108853 108836 100000 1039.1MB/s pb [ +1.7%]
- BM_UFlat/17 364289 364223 38419 482.6MB/s gaviota [ +4.9%]
-
- Barcelona (AMD Opteron):
-
- Benchmark Time(ns) CPU(ns) Iterations
- --------------------------------------------
- BM_UFlat/0 103900 103871 100000 940.2MB/s html [ +8.3%]
- BM_UFlat/1 1000435 1000107 10000 669.5MB/s urls [ +6.6%]
- BM_UFlat/2 24659 24652 567362 4.8GB/s jpg [ +0.1%]
- BM_UFlat/3 48206 48193 291121 1.8GB/s pdf [ +5.0%]
- BM_UFlat/4 421980 421850 33174 926.0MB/s html4 [ +7.3%]
- BM_UFlat/5 40368 40357 346994 581.4MB/s cp [ +8.7%]
- BM_UFlat/6 19836 19830 708695 536.2MB/s c [ +8.0%]
- BM_UFlat/7 6100 6098 2292774 581.9MB/s lsp [ +9.0%]
- BM_UFlat/8 1693093 1692514 8261 580.2MB/s xls [ +8.0%]
- BM_UFlat/9 365991 365886 38225 396.4MB/s txt1 [ +7.1%]
- BM_UFlat/10 311330 311238 44950 383.6MB/s txt2 [ +7.6%]
- BM_UFlat/11 975037 974737 14376 417.5MB/s txt3 [ +6.9%]
- BM_UFlat/12 1303558 1303175 10000 352.6MB/s txt4 [ +7.3%]
- BM_UFlat/13 517448 517290 27144 946.2MB/s bin [ +5.5%]
- BM_UFlat/14 66537 66518 210352 548.3MB/s sum [ +7.5%]
- BM_UFlat/15 7976 7974 1760383 505.6MB/s man [ +5.6%]
- BM_UFlat/16 103121 103092 100000 1097.0MB/s pb [ +8.7%]
- BM_UFlat/17 391431 391314 35733 449.2MB/s gaviota [ +6.5%]
-
- R=sanjay
-
-
- git-svn-id: https://snappy.googlecode.com/svn/trunk@54 03e5f5b5-db94-4691-08a0-1a8bf15f6143
-
-commit 5ed51ce15fc4ff8d2f7235704eb6b0c3f762fb88
-Author: snappy.mirrorbot@gmail.com <snappy.mirrorbot@gmail.com@03e5f5b5-db94-4691-08a0-1a8bf15f6143>
-Date: Wed Nov 23 11:14:17 2011 +0000
-
- Speed up decompression by making the fast path for literals faster.
-
- We do the fast-path step as soon as possible; in fact, as soon as we know the
- literal length. Since we usually hit the fast path, we can then skip the checks
- for long literals and available input space (beyond what the fast path check
- already does).
-
- Note that this changes the decompression Writer API; however, it does not
- change the ABI, since writers are always templatized and as such never
- cross compilation units. The new API is slightly more general, in that it
- doesn't hard-code the value 16. Note that we also take care to check
- for len <= 16 first, since the other two checks almost always succeed
- (so we don't want to waste time checking for them until we have to).
-
- The improvements are most marked on Nehalem, but are generally positive
- on other platforms as well. All microbenchmarks are 64-bit, opt.
-
- Clovertown (Core 2):
-
- Benchmark Time(ns) CPU(ns) Iterations
- --------------------------------------------
- BM_UFlat/0 110226 110224 100000 886.0MB/s html [ +1.5%]
- BM_UFlat/1 1036523 1036508 10000 646.0MB/s urls [ -0.8%]
- BM_UFlat/2 26775 26775 522570 4.4GB/s jpg [ +0.0%]
- BM_UFlat/3 49738 49737 280974 1.8GB/s pdf [ +0.3%]
- BM_UFlat/4 446790 446792 31334 874.3MB/s html4 [ +0.8%]
- BM_UFlat/5 40561 40562 350424 578.5MB/s cp [ +1.3%]
- BM_UFlat/6 18722 18722 746903 568.0MB/s c [ +1.4%]
- BM_UFlat/7 5373 5373 2608632 660.5MB/s lsp [ +8.3%]
- BM_UFlat/8 1615716 1615718 8670 607.8MB/s xls [ +2.0%]
- BM_UFlat/9 345278 345281 40481 420.1MB/s txt1 [ +1.4%]
- BM_UFlat/10 294855 294855 47452 404.9MB/s txt2 [ +1.6%]
- BM_UFlat/11 914263 914263 15316 445.2MB/s txt3 [ +1.1%]
- BM_UFlat/12 1222694 1222691 10000 375.8MB/s txt4 [ +1.4%]
- BM_UFlat/13 584495 584489 23954 837.4MB/s bin [ -0.6%]
- BM_UFlat/14 66662 66662 210123 547.1MB/s sum [ +1.2%]
- BM_UFlat/15 7368 7368 1881856 547.1MB/s man [ +4.0%]
- BM_UFlat/16 110727 110726 100000 1021.4MB/s pb [ +2.3%]
- BM_UFlat/17 382138 382141 36616 460.0MB/s gaviota [ -0.7%]
-
- Westmere (Core i7):
-
- Benchmark Time(ns) CPU(ns) Iterations
- --------------------------------------------
- BM_UFlat/0 78861 78853 177703 1.2GB/s html [ +2.1%]
- BM_UFlat/1 739560 739491 18912 905.4MB/s urls [ +3.4%]
- BM_UFlat/2 9867 9866 1419014 12.0GB/s jpg [ +3.4%]
- BM_UFlat/3 31989 31986 438385 2.7GB/s pdf [ +0.2%]
- BM_UFlat/4 319406 319380 43771 1.2GB/s html4 [ +1.9%]
- BM_UFlat/5 29639 29636 472862 791.7MB/s cp [ +5.2%]
- BM_UFlat/6 13478 13477 1000000 789.0MB/s c [ +2.3%]
- BM_UFlat/7 4030 4029 3475364 880.7MB/s lsp [ +8.7%]
- BM_UFlat/8 1036585 1036492 10000 947.5MB/s xls [ +6.9%]
- BM_UFlat/9 242127 242105 57838 599.1MB/s txt1 [ +3.0%]
- BM_UFlat/10 206499 206480 67595 578.2MB/s txt2 [ +3.4%]
- BM_UFlat/11 641635 641570 21811 634.4MB/s txt3 [ +2.4%]
- BM_UFlat/12 848847 848769 16443 541.4MB/s txt4 [ +3.1%]
- BM_UFlat/13 384968 384938 36366 1.2GB/s bin [ +0.3%]
- BM_UFlat/14 47106 47101 297770 774.3MB/s sum [ +4.4%]
- BM_UFlat/15 5063 5063 2772202 796.2MB/s man [ +7.7%]
- BM_UFlat/16 83663 83656 167697 1.3GB/s pb [ +1.8%]
- BM_UFlat/17 260224 260198 53823 675.6MB/s gaviota [ -0.5%]
-
- Barcelona (Opteron):
-
- Benchmark Time(ns) CPU(ns) Iterations
- --------------------------------------------
- BM_UFlat/0 112490 112457 100000 868.4MB/s html [ -0.4%]
- BM_UFlat/1 1066719 1066339 10000 627.9MB/s urls [ +1.0%]
- BM_UFlat/2 24679 24672 563802 4.8GB/s jpg [ +0.7%]
- BM_UFlat/3 50603 50589 277285 1.7GB/s pdf [ +2.6%]
- BM_UFlat/4 452982 452849 30900 862.6MB/s html4 [ -0.2%]
- BM_UFlat/5 43860 43848 319554 535.1MB/s cp [ +1.2%]
- BM_UFlat/6 21419 21413 653573 496.6MB/s c [ +1.0%]
- BM_UFlat/7 6646 6645 2105405 534.1MB/s lsp [ +0.3%]
- BM_UFlat/8 1828487 1827886 7658 537.3MB/s xls [ +2.6%]
- BM_UFlat/9 391824 391714 35708 370.3MB/s txt1 [ +2.2%]
- BM_UFlat/10 334913 334816 41885 356.6MB/s txt2 [ +1.7%]
- BM_UFlat/11 1042062 1041674 10000 390.7MB/s txt3 [ +1.1%]
- BM_UFlat/12 1398902 1398456 10000 328.6MB/s txt4 [ +1.7%]
- BM_UFlat/13 545706 545530 25669 897.2MB/s bin [ -0.4%]
- BM_UFlat/14 71512 71505 196035 510.0MB/s sum [ +1.4%]
- BM_UFlat/15 8422 8421 1665036 478.7MB/s man [ +2.6%]
- BM_UFlat/16 112053 112048 100000 1009.3MB/s pb [ -0.4%]
- BM_UFlat/17 416723 416713 33612 421.8MB/s gaviota [ -2.0%]
-
- R=sanjay
-
-
- git-svn-id: https://snappy.googlecode.com/svn/trunk@53 03e5f5b5-db94-4691-08a0-1a8bf15f6143
-
-commit 0c1b9c3904430f5b399bd057d76de4bc36b7a123
-Author: snappy.mirrorbot@gmail.com <snappy.mirrorbot@gmail.com@03e5f5b5-db94-4691-08a0-1a8bf15f6143>
-Date: Tue Nov 8 14:46:39 2011 +0000
-
- Fix public issue #53: Update the README to the API we actually open-sourced
- with.
-
- R=sanjay
-
-
- git-svn-id: https://snappy.googlecode.com/svn/trunk@52 03e5f5b5-db94-4691-08a0-1a8bf15f6143
-
-commit b61134bc0a6a904b41522b4e5c9e80874c730cef
-Author: snappy.mirrorbot@gmail.com <snappy.mirrorbot@gmail.com@03e5f5b5-db94-4691-08a0-1a8bf15f6143>
-Date: Wed Oct 5 12:27:12 2011 +0000
-
- In the format description, use a clearer example to emphasize that varints are
- stored in little-endian. Patch from Christian von Roques.
-
- R=csilvers
-
-
- git-svn-id: https://snappy.googlecode.com/svn/trunk@51 03e5f5b5-db94-4691-08a0-1a8bf15f6143
-
-commit 21a2e4f55758e759302cd84ad0f3580affcba7d9
-Author: snappy.mirrorbot@gmail.com <snappy.mirrorbot@gmail.com@03e5f5b5-db94-4691-08a0-1a8bf15f6143>
-Date: Thu Sep 15 19:34:06 2011 +0000
-
- Release Snappy 1.0.4.
-
- R=sanjay
-
-
- git-svn-id: https://snappy.googlecode.com/svn/trunk@50 03e5f5b5-db94-4691-08a0-1a8bf15f6143
-
-commit e2e303286813c759c5b1cdb46dad63c494f0a061
-Author: snappy.mirrorbot@gmail.com <snappy.mirrorbot@gmail.com@03e5f5b5-db94-4691-08a0-1a8bf15f6143>
-Date: Thu Sep 15 09:50:05 2011 +0000
-
- Fix public issue #50: Include generic byteswap macros.
- Also include Solaris 10 and FreeBSD versions.
-
- R=csilvers
-
-
- git-svn-id: https://snappy.googlecode.com/svn/trunk@49 03e5f5b5-db94-4691-08a0-1a8bf15f6143
-
-commit 593002da3c051f4721312869f816b41485bad3b7
-Author: snappy.mirrorbot@gmail.com <snappy.mirrorbot@gmail.com@03e5f5b5-db94-4691-08a0-1a8bf15f6143>
-Date: Wed Aug 10 18:57:27 2011 +0000
-
- Partially fix public issue 50: Remove an extra comma from the end of some
- enum declarations, as it seems the Sun compiler does not like it.
-
- Based on patch by Travis Vitek.
-
-
- git-svn-id: https://snappy.googlecode.com/svn/trunk@48 03e5f5b5-db94-4691-08a0-1a8bf15f6143
-
-commit f1063a5dc43891eed37f0586bfea57b84dddd756
-Author: snappy.mirrorbot@gmail.com <snappy.mirrorbot@gmail.com@03e5f5b5-db94-4691-08a0-1a8bf15f6143>
-Date: Wed Aug 10 18:44:16 2011 +0000
-
- Use the right #ifdef test for sys/mman.h.
-
- Based on patch by Travis Vitek.
-
-
- git-svn-id: https://snappy.googlecode.com/svn/trunk@47 03e5f5b5-db94-4691-08a0-1a8bf15f6143
-
-commit 41c827a2fa9ce048202d941187f211180feadde4
-Author: snappy.mirrorbot@gmail.com <snappy.mirrorbot@gmail.com@03e5f5b5-db94-4691-08a0-1a8bf15f6143>
-Date: Wed Aug 10 01:22:09 2011 +0000
-
- Fix public issue #47: Small comment cleanups in the unit test.
-
- Originally based on a patch by Patrick Pelletier.
-
- R=sanjay
-
-
- git-svn-id: https://snappy.googlecode.com/svn/trunk@46 03e5f5b5-db94-4691-08a0-1a8bf15f6143
-
-commit 59aeffa6049b5c2a3a467e7602c1f93630b870e7
-Author: snappy.mirrorbot@gmail.com <snappy.mirrorbot@gmail.com@03e5f5b5-db94-4691-08a0-1a8bf15f6143>
-Date: Wed Aug 10 01:14:43 2011 +0000
-
- Fix public issue #46: Format description said "3-byte offset"
- instead of "4-byte offset" for the longest copies.
-
- Also fix an inconsistency in the heading for section 2.2.3.
- Both patches by Patrick Pelletier.
-
- R=csilvers
-
-
- git-svn-id: https://snappy.googlecode.com/svn/trunk@45 03e5f5b5-db94-4691-08a0-1a8bf15f6143
-
-commit 57e7cd72559cb022ef32856f2252a4c4585e562e
-Author: snappy.mirrorbot@gmail.com <snappy.mirrorbot@gmail.com@03e5f5b5-db94-4691-08a0-1a8bf15f6143>
-Date: Tue Jun 28 11:40:25 2011 +0000
-
- Fix public issue #44: Make the definition and declaration of CompressFragment
- identical, even regarding cv-qualifiers.
-
- This is required to work around a bug in the Solaris Studio C++ compiler
- (it does not properly disregard cv-qualifiers when doing name mangling).
-
- R=sanjay
-
-
- git-svn-id: https://snappy.googlecode.com/svn/trunk@44 03e5f5b5-db94-4691-08a0-1a8bf15f6143
-
-commit 13c4a449a8ea22139c9aa441e8024eebc9dbdf6e
-Author: snappy.mirrorbot@gmail.com <snappy.mirrorbot@gmail.com@03e5f5b5-db94-4691-08a0-1a8bf15f6143>
-Date: Sat Jun 4 10:19:05 2011 +0000
-
- Correct an inaccuracy in the Snappy format description.
- (I stumbled into this when changing the way we decompress literals.)
-
- R=csilvers
-
- Revision created by MOE tool push_codebase.
-
-
- git-svn-id: https://snappy.googlecode.com/svn/trunk@43 03e5f5b5-db94-4691-08a0-1a8bf15f6143
-
-commit f5406737403119e1483a71d2084d17728663a114
-Author: snappy.mirrorbot@gmail.com <snappy.mirrorbot@gmail.com@03e5f5b5-db94-4691-08a0-1a8bf15f6143>
-Date: Fri Jun 3 20:53:06 2011 +0000
-
- Speed up decompression by removing a fast-path attempt.
-
- Whenever we try to enter a copy fast-path, there is a certain cost in checking
- that all the preconditions are in place, but it's normally offset by the fact
- that we can usually take the cheaper path. However, in a certain path we've
- already established that "avail < literal_length", which usually means that
- either the available space is small, or the literal is big. Both will disqualify
- us from taking the fast path, and thus we take the hit from the precondition
- checking without gaining much from having a fast path. Thus, simply don't try
- the fast path in this situation -- we're already on a slow path anyway
- (one where we need to refill more data from the reader).
-
- I'm a bit surprised at how much this gained; it could be that this path is
- more common than I thought, or that the simpler structure somehow makes the
- compiler happier. I haven't looked at the assembler, but it's a win across
- the board on both Core 2, Core i7 and Opteron, at least for the cases we
- typically care about. The gains seem to be the largest on Core i7, though.
- Results from my Core i7 workstation:
-
-
- Benchmark Time(ns) CPU(ns) Iterations
- ---------------------------------------------------
- BM_UFlat/0 73337 73091 190996 1.3GB/s html [ +1.7%]
- BM_UFlat/1 696379 693501 20173 965.5MB/s urls [ +2.7%]
- BM_UFlat/2 9765 9734 1472135 12.1GB/s jpg [ +0.7%]
- BM_UFlat/3 29720 29621 472973 3.0GB/s pdf [ +1.8%]
- BM_UFlat/4 294636 293834 47782 1.3GB/s html4 [ +2.3%]
- BM_UFlat/5 28399 28320 494700 828.5MB/s cp [ +3.5%]
- BM_UFlat/6 12795 12760 1000000 833.3MB/s c [ +1.2%]
- BM_UFlat/7 3984 3973 3526448 893.2MB/s lsp [ +5.7%]
- BM_UFlat/8 991996 989322 14141 992.6MB/s xls [ +3.3%]
- BM_UFlat/9 228620 227835 61404 636.6MB/s txt1 [ +4.0%]
- BM_UFlat/10 197114 196494 72165 607.5MB/s txt2 [ +3.5%]
- BM_UFlat/11 605240 603437 23217 674.4MB/s txt3 [ +3.7%]
- BM_UFlat/12 804157 802016 17456 573.0MB/s txt4 [ +3.9%]
- BM_UFlat/13 347860 346998 40346 1.4GB/s bin [ +1.2%]
- BM_UFlat/14 44684 44559 315315 818.4MB/s sum [ +2.3%]
- BM_UFlat/15 5120 5106 2739726 789.4MB/s man [ +3.3%]
- BM_UFlat/16 76591 76355 183486 1.4GB/s pb [ +2.8%]
- BM_UFlat/17 238564 237828 58824 739.1MB/s gaviota [ +1.6%]
- BM_UValidate/0 42194 42060 333333 2.3GB/s html [ -0.1%]
- BM_UValidate/1 433182 432005 32407 1.5GB/s urls [ -0.1%]
- BM_UValidate/2 197 196 71428571 603.3GB/s jpg [ +0.5%]
- BM_UValidate/3 14494 14462 972222 6.1GB/s pdf [ +0.5%]
- BM_UValidate/4 168444 167836 83832 2.3GB/s html4 [ +0.1%]
-
- R=jeff
-
- Revision created by MOE tool push_codebase.
-
-
- git-svn-id: https://snappy.googlecode.com/svn/trunk@42 03e5f5b5-db94-4691-08a0-1a8bf15f6143
-
-commit 197f3ee9f9397e98c9abf07f9da875fbcb725dba
-Author: snappy.mirrorbot@gmail.com <snappy.mirrorbot@gmail.com@03e5f5b5-db94-4691-08a0-1a8bf15f6143>
-Date: Fri Jun 3 20:47:14 2011 +0000
-
- Speed up decompression by not needing a lookup table for literal items.
-
- Looking up into and decoding the values from char_table has long shown up as a
- hotspot in the decompressor. While it turns out that it's hard to make a more
- efficient decoder for the copy ops, the literals are simple enough that we can
- decode them without needing a table lookup. (This means that 1/4 of the table
- is now unused, although that in itself doesn't buy us anything.)
-
- The gains are small, but definitely present; some tests win as much as 10%,
- but 1-4% is more typical. These results are from Core i7, in 64-bit mode;
- Core 2 and Opteron show similar results. (I've run with more iterations
- than unusual to make sure the smaller gains don't drown entirely in noise.)
-
- Benchmark Time(ns) CPU(ns) Iterations
- ---------------------------------------------------
- BM_UFlat/0 74665 74428 182055 1.3GB/s html [ +3.1%]
- BM_UFlat/1 714106 711997 19663 940.4MB/s urls [ +4.4%]
- BM_UFlat/2 9820 9789 1427115 12.1GB/s jpg [ -1.2%]
- BM_UFlat/3 30461 30380 465116 2.9GB/s pdf [ +0.8%]
- BM_UFlat/4 301445 300568 46512 1.3GB/s html4 [ +2.2%]
- BM_UFlat/5 29338 29263 479452 801.8MB/s cp [ +1.6%]
- BM_UFlat/6 13004 12970 1000000 819.9MB/s c [ +2.1%]
- BM_UFlat/7 4180 4168 3349282 851.4MB/s lsp [ +1.3%]
- BM_UFlat/8 1026149 1024000 10000 959.0MB/s xls [+10.7%]
- BM_UFlat/9 237441 236830 59072 612.4MB/s txt1 [ +0.3%]
- BM_UFlat/10 203966 203298 69307 587.2MB/s txt2 [ +0.8%]
- BM_UFlat/11 627230 625000 22400 651.2MB/s txt3 [ +0.7%]
- BM_UFlat/12 836188 833979 16787 551.0MB/s txt4 [ +1.3%]
- BM_UFlat/13 351904 350750 39886 1.4GB/s bin [ +3.8%]
- BM_UFlat/14 45685 45562 308370 800.4MB/s sum [ +5.9%]
- BM_UFlat/15 5286 5270 2656546 764.9MB/s man [ +1.5%]
- BM_UFlat/16 78774 78544 178117 1.4GB/s pb [ +4.3%]
- BM_UFlat/17 242270 241345 58091 728.3MB/s gaviota [ +1.2%]
- BM_UValidate/0 42149 42000 333333 2.3GB/s html [ -3.0%]
- BM_UValidate/1 432741 431303 32483 1.5GB/s urls [ +7.8%]
- BM_UValidate/2 198 197 71428571 600.7GB/s jpg [+16.8%]
- BM_UValidate/3 14560 14521 965517 6.1GB/s pdf [ -4.1%]
- BM_UValidate/4 169065 168671 83832 2.3GB/s html4 [ -2.9%]
-
- R=jeff
-
- Revision created by MOE tool push_codebase.
-
-
- git-svn-id: https://snappy.googlecode.com/svn/trunk@41 03e5f5b5-db94-4691-08a0-1a8bf15f6143
-
-commit 8efa2639e885ac467e7b11c662975c5844019fb9
-Author: snappy.mirrorbot@gmail.com <snappy.mirrorbot@gmail.com@03e5f5b5-db94-4691-08a0-1a8bf15f6143>
-Date: Thu Jun 2 22:57:41 2011 +0000
-
- Release Snappy 1.0.3.
-
-
- git-svn-id: https://snappy.googlecode.com/svn/trunk@40 03e5f5b5-db94-4691-08a0-1a8bf15f6143
-
-commit 2e12124bd87f39296709decc65195fa5bfced538
-Author: snappy.mirrorbot@gmail.com <snappy.mirrorbot@gmail.com@03e5f5b5-db94-4691-08a0-1a8bf15f6143>
-Date: Thu Jun 2 18:06:54 2011 +0000
-
- Remove an unneeded goto in the decompressor; it turns out that the
- state of ip_ after decompression (or attempted decompresion) is
- completely irrelevant, so we don't need the trailer.
-
- Performance is, as expected, mostly flat -- there's a curious ~3-5%
- loss in the "lsp" test, but that test case is so short it is hard to say
- anything definitive about why (most likely, it's some sort of
- unrelated effect).
-
- R=jeff
-
-
- git-svn-id: https://snappy.googlecode.com/svn/trunk@39 03e5f5b5-db94-4691-08a0-1a8bf15f6143
-
-commit c266bbf32103f8ed4a83e2272ed3d8828d5b8b34
-Author: snappy.mirrorbot@gmail.com <snappy.mirrorbot@gmail.com@03e5f5b5-db94-4691-08a0-1a8bf15f6143>
-Date: Thu Jun 2 17:59:40 2011 +0000
-
- Speed up decompression by caching ip_.
-
- It is seemingly hard for the compiler to understand that ip_, the current input
- pointer into the compressed data stream, can not alias on anything else, and
- thus using it directly will incur memory traffic as it cannot be kept in a
- register. The code already knew about this and cached it into a local
- variable, but since Step() only decoded one tag, it had to move ip_ back into
- place between every tag. This seems to have cost us a significant amount of
- performance, so changing Step() into a function that decodes as much as it can
- before it saves ip_ back and returns. (Note that Step() was already inlined,
- so it is not the manual inlining that buys the performance here.)
-
- The wins are about 3-6% for Core 2, 6-13% on Core i7 and 5-12% on Opteron
- (for plain array-to-array decompression, in 64-bit opt mode).
-
- There is a tiny difference in the behavior here; if an invalid literal is
- encountered (ie., the writer refuses the Append() operation), ip_ will now
- point to the byte past the tag byte, instead of where the literal was
- originally thought to end. However, we don't use ip_ for anything after
- DecompressAllTags() has returned, so this should not change external behavior
- in any way.
-
- Microbenchmark results for Core i7, 64-bit (Opteron results are similar):
-
- Benchmark Time(ns) CPU(ns) Iterations
- ---------------------------------------------------
- BM_UFlat/0 79134 79110 8835 1.2GB/s html [ +6.2%]
- BM_UFlat/1 786126 786096 891 851.8MB/s urls [+10.0%]
- BM_UFlat/2 9948 9948 69125 11.9GB/s jpg [ -1.3%]
- BM_UFlat/3 31999 31998 21898 2.7GB/s pdf [ +6.5%]
- BM_UFlat/4 318909 318829 2204 1.2GB/s html4 [ +6.5%]
- BM_UFlat/5 31384 31390 22363 747.5MB/s cp [ +9.2%]
- BM_UFlat/6 14037 14034 49858 757.7MB/s c [+10.6%]
- BM_UFlat/7 4612 4612 151395 769.5MB/s lsp [ +9.5%]
- BM_UFlat/8 1203174 1203007 582 816.3MB/s xls [+19.3%]
- BM_UFlat/9 253869 253955 2757 571.1MB/s txt1 [+11.4%]
- BM_UFlat/10 219292 219290 3194 544.4MB/s txt2 [+12.1%]
- BM_UFlat/11 672135 672131 1000 605.5MB/s txt3 [+11.2%]
- BM_UFlat/12 902512 902492 776 509.2MB/s txt4 [+12.5%]
- BM_UFlat/13 372110 371998 1881 1.3GB/s bin [ +5.8%]
- BM_UFlat/14 50407 50407 10000 723.5MB/s sum [+13.5%]
- BM_UFlat/15 5699 5701 100000 707.2MB/s man [+12.4%]
- BM_UFlat/16 83448 83424 8383 1.3GB/s pb [ +5.7%]
- BM_UFlat/17 256958 256963 2723 684.1MB/s gaviota [ +7.9%]
- BM_UValidate/0 42795 42796 16351 2.2GB/s html [+25.8%]
- BM_UValidate/1 490672 490622 1427 1.3GB/s urls [+22.7%]
- BM_UValidate/2 237 237 2950297 499.0GB/s jpg [+24.9%]
- BM_UValidate/3 14610 14611 47901 6.0GB/s pdf [+26.8%]
- BM_UValidate/4 171973 171990 4071 2.2GB/s html4 [+25.7%]
-
-
-
-
- git-svn-id: https://snappy.googlecode.com/svn/trunk@38 03e5f5b5-db94-4691-08a0-1a8bf15f6143
-
-commit d0ee043bc50c62c5b5ff3da044f0b5567257407d
-Author: snappy.mirrorbot@gmail.com <snappy.mirrorbot@gmail.com@03e5f5b5-db94-4691-08a0-1a8bf15f6143>
-Date: Tue May 17 08:48:25 2011 +0000
-
- Fix the numbering of the headlines in the Snappy format description.
-
- R=csilvers
- DELTA=4 (0 added, 0 deleted, 4 changed)
-
-
- Revision created by MOE tool push_codebase.
- MOE_MIGRATION=1906
-
-
- git-svn-id: https://snappy.googlecode.com/svn/trunk@37 03e5f5b5-db94-4691-08a0-1a8bf15f6143
-
-commit 6c7053871fbdb459c9c14287a138d7f82d6d84a1
-Author: snappy.mirrorbot@gmail.com <snappy.mirrorbot@gmail.com@03e5f5b5-db94-4691-08a0-1a8bf15f6143>
-Date: Mon May 16 08:59:18 2011 +0000
-
- Fix public issue #32: Add compressed format documentation for Snappy.
- This text is new, but an earlier version from Zeev Tarantov was used
- as reference.
-
- R=csilvers
- DELTA=112 (111 added, 0 deleted, 1 changed)
-
-
- Revision created by MOE tool push_codebase.
- MOE_MIGRATION=1867
-
-
- git-svn-id: https://snappy.googlecode.com/svn/trunk@36 03e5f5b5-db94-4691-08a0-1a8bf15f6143
-
-commit a1f9f9973d127992f341d442969c86fd9a0847c9
-Author: snappy.mirrorbot@gmail.com <snappy.mirrorbot@gmail.com@03e5f5b5-db94-4691-08a0-1a8bf15f6143>
-Date: Mon May 9 21:29:02 2011 +0000
-
- Fix public issue #39: Pick out the median runs based on CPU time,
- not real time. Also, use nth_element instead of sort, since we
- only need one element.
-
- R=csilvers
- DELTA=5 (3 added, 0 deleted, 2 changed)
-
-
- Revision created by MOE tool push_codebase.
- MOE_MIGRATION=1799
-
-
- git-svn-id: https://snappy.googlecode.com/svn/trunk@35 03e5f5b5-db94-4691-08a0-1a8bf15f6143
-
-commit f7b105683c074cdf233740089e245e43f63e7e55
-Author: snappy.mirrorbot@gmail.com <snappy.mirrorbot@gmail.com@03e5f5b5-db94-4691-08a0-1a8bf15f6143>
-Date: Mon May 9 21:28:45 2011 +0000
-
- Fix public issue #38: Make the microbenchmark framework handle
- properly cases where gettimeofday() can stand return the same
- result twice (as sometimes on GNU/Hurd) or go backwards
- (as when the user adjusts the clock). We avoid a division-by-zero,
- and put a lower bound on the number of iterations -- the same
- amount as we use to calibrate.
-
- We should probably use CLOCK_MONOTONIC for platforms that support
- it, to be robust against clock adjustments; we already use Windows'
- monotonic timers. However, that's for a later changelist.
-
- R=csilvers
- DELTA=7 (5 added, 0 deleted, 2 changed)
-
-
- Revision created by MOE tool push_codebase.
- MOE_MIGRATION=1798
-
-
- git-svn-id: https://snappy.googlecode.com/svn/trunk@34 03e5f5b5-db94-4691-08a0-1a8bf15f6143
-
-commit d8d481427a05b88cdb0810c29bf400153595c423
-Author: snappy.mirrorbot@gmail.com <snappy.mirrorbot@gmail.com@03e5f5b5-db94-4691-08a0-1a8bf15f6143>
-Date: Tue May 3 23:22:52 2011 +0000
-
- Fix public issue #37: Only link snappy_unittest against -lz and other autodetected
- libraries, not libsnappy.so (which doesn't need any such dependency).
-
- R=csilvers
- DELTA=20 (14 added, 0 deleted, 6 changed)
-
-
- Revision created by MOE tool push_codebase.
- MOE_MIGRATION=1710
-
-
- git-svn-id: https://snappy.googlecode.com/svn/trunk@33 03e5f5b5-db94-4691-08a0-1a8bf15f6143
-
-commit bcecf195c0aeb2c98144d3d54b4d8d228774f50d
-Author: snappy.mirrorbot@gmail.com <snappy.mirrorbot@gmail.com@03e5f5b5-db94-4691-08a0-1a8bf15f6143>
-Date: Tue May 3 23:22:33 2011 +0000
-
- Release Snappy 1.0.2, to get the license change and various other fixes into
- a release.
-
- R=csilvers
- DELTA=239 (236 added, 0 deleted, 3 changed)
-
-
- Revision created by MOE tool push_codebase.
- MOE_MIGRATION=1709
-
-
- git-svn-id: https://snappy.googlecode.com/svn/trunk@32 03e5f5b5-db94-4691-08a0-1a8bf15f6143
-
-commit 84d9f642025cda672dda0d94a8008f094500aaa6
-Author: snappy.mirrorbot@gmail.com <snappy.mirrorbot@gmail.com@03e5f5b5-db94-4691-08a0-1a8bf15f6143>
-Date: Tue Apr 26 12:34:55 2011 +0000
-
- Fix public issue #30: Stop using gettimeofday() altogether on Win32,
- as MSVC doesn't include it. Replace with QueryPerformanceCounter(),
- which is monotonic and probably reasonably high-resolution.
- (Some machines have traditionally had bugs in QPC, but they should
- be relatively rare these days, and there's really no much better
- alternative that I know of.)
-
- R=csilvers
- DELTA=74 (55 added, 19 deleted, 0 changed)
-
-
- Revision created by MOE tool push_codebase.
- MOE_MIGRATION=1556
-
-
- git-svn-id: https://snappy.googlecode.com/svn/trunk@31 03e5f5b5-db94-4691-08a0-1a8bf15f6143
-
-commit 3d8e71df8d30f980d71d4c784ebfc5ff62d5b0cb
-Author: snappy.mirrorbot@gmail.com <snappy.mirrorbot@gmail.com@03e5f5b5-db94-4691-08a0-1a8bf15f6143>
-Date: Tue Apr 26 12:34:37 2011 +0000
-
- Fix public issue #31: Don't reset PATH in autogen.sh; instead, do the trickery
- we need for our own build system internally.
-
- R=csilvers
- DELTA=16 (13 added, 1 deleted, 2 changed)
-
-
- Revision created by MOE tool push_codebase.
- MOE_MIGRATION=1555
-
-
- git-svn-id: https://snappy.googlecode.com/svn/trunk@30 03e5f5b5-db94-4691-08a0-1a8bf15f6143
-
-commit 73987351de54c88e2fc3f5dcdeceb47708df3585
-Author: snappy.mirrorbot@gmail.com <snappy.mirrorbot@gmail.com@03e5f5b5-db94-4691-08a0-1a8bf15f6143>
-Date: Fri Apr 15 22:55:56 2011 +0000
-
- When including <windows.h>, define WIN32_LEAN_AND_MEAN first,
- so we won't pull in macro definitions of things like min() and max(),
- which can conflict with <algorithm>.
-
- R=csilvers
- DELTA=1 (1 added, 0 deleted, 0 changed)
-
-
- Revision created by MOE tool push_codebase.
- MOE_MIGRATION=1485
-
-
- git-svn-id: https://snappy.googlecode.com/svn/trunk@29 03e5f5b5-db94-4691-08a0-1a8bf15f6143
-
-commit fb7e0eade471a20b009720a84fea0af1552791d5
-Author: snappy.mirrorbot@gmail.com <snappy.mirrorbot@gmail.com@03e5f5b5-db94-4691-08a0-1a8bf15f6143>
-Date: Mon Apr 11 09:07:01 2011 +0000
-
- Fix public issue #29: Write CPU timing code for Windows, based on GetProcessTimes()
- instead of getursage().
-
- I thought I'd already committed this patch, so that the 1.0.1 release already
- would have a Windows-compatible snappy_unittest, but I'd seemingly deleted it
- instead, so this is a reconstruction.
-
- R=csilvers
- DELTA=43 (39 added, 3 deleted, 1 changed)
-
-
- Revision created by MOE tool push_codebase.
- MOE_MIGRATION=1295
-
-
- git-svn-id: https://snappy.googlecode.com/svn/trunk@28 03e5f5b5-db94-4691-08a0-1a8bf15f6143
-
-commit c67fa0c755a329000da5546fff79089d62ac2f82
-Author: snappy.mirrorbot@gmail.com <snappy.mirrorbot@gmail.com@03e5f5b5-db94-4691-08a0-1a8bf15f6143>
-Date: Fri Apr 8 09:51:53 2011 +0000
-
- Include C bindings of Snappy, contributed by Martin Gieseking.
-
- I've made a few changes since Martin's version; mostly style nits, but also
- a semantic change -- most functions that return bool in the C++ version now
- return an enum, to better match typical C (and zlib) semantics.
-
- I've kept the copyright notice, since Martin is obviously the author here;
- he has signed the contributor license agreement, though, so this should not
- hinder Google's use in the future.
-
- We'll need to update the libtool version number to match the added interface,
- but as of http://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html
- I'm going to wait until public release.
-
- R=csilvers
- DELTA=238 (233 added, 0 deleted, 5 changed)
-
-
- Revision created by MOE tool push_codebase.
- MOE_MIGRATION=1294
-
-
- git-svn-id: https://snappy.googlecode.com/svn/trunk@27 03e5f5b5-db94-4691-08a0-1a8bf15f6143
-
-commit 56be85cb9ae06f2e92180ae2575bdd10c012ab73
-Author: snappy.mirrorbot@gmail.com <snappy.mirrorbot@gmail.com@03e5f5b5-db94-4691-08a0-1a8bf15f6143>
-Date: Thu Apr 7 16:36:43 2011 +0000
-
- Replace geo.protodata with a newer version.
-
- The data compresses/decompresses slightly faster than the old data, and has
- similar density.
-
- R=lookingbill
- DELTA=1 (0 added, 0 deleted, 1 changed)
-
-
- Revision created by MOE tool push_codebase.
- MOE_MIGRATION=1288
-
-
- git-svn-id: https://snappy.googlecode.com/svn/trunk@26 03e5f5b5-db94-4691-08a0-1a8bf15f6143
-
-commit 3dd93f3ec74df54a37f68bffabb058ac757bbe72
-Author: snappy.mirrorbot@gmail.com <snappy.mirrorbot@gmail.com@03e5f5b5-db94-4691-08a0-1a8bf15f6143>
-Date: Wed Mar 30 20:27:53 2011 +0000
-
- Fix public issue #27: Add HAVE_CONFIG_H tests around the config.h
- inclusion in snappy-stubs-internal.h, which eases compiling outside the
- automake/autoconf framework.
-
- R=csilvers
- DELTA=5 (4 added, 1 deleted, 0 changed)
-
-
- Revision created by MOE tool push_codebase.
- MOE_MIGRATION=1152
-
-
- git-svn-id: https://snappy.googlecode.com/svn/trunk@25 03e5f5b5-db94-4691-08a0-1a8bf15f6143
-
-commit f67bcaa61006da8b325a7ed9909a782590971815
-Author: snappy.mirrorbot@gmail.com <snappy.mirrorbot@gmail.com@03e5f5b5-db94-4691-08a0-1a8bf15f6143>
-Date: Wed Mar 30 20:27:39 2011 +0000
-
- Fix public issue #26: Take memory allocation and reallocation entirely out of the
- Measure() loop. This gives all algorithms a small speed boost, except Snappy which
- already didn't do reallocation (so the measurements were slightly biased in its
- favor).
-
- R=csilvers
- DELTA=92 (69 added, 9 deleted, 14 changed)
-
-
- Revision created by MOE tool push_codebase.
- MOE_MIGRATION=1151
-
-
- git-svn-id: https://snappy.googlecode.com/svn/trunk@24 03e5f5b5-db94-4691-08a0-1a8bf15f6143
-
-commit cc333c1c5cc4eabceceb9848ff3cac6c604ecbc6
-Author: snappy.mirrorbot@gmail.com <snappy.mirrorbot@gmail.com@03e5f5b5-db94-4691-08a0-1a8bf15f6143>
-Date: Wed Mar 30 20:25:09 2011 +0000
-
- Renamed "namespace zippy" to "namespace snappy" to reduce
- the differences from the opensource code. Will make it easier
- in the future to mix-and-match third-party code that uses
- snappy with google code.
-
- Currently, csearch shows that the only external user of
- "namespace zippy" is some bigtable code that accesses
- a TEST variable, which is temporarily kept in the zippy
- namespace.
-
- R=sesse
- DELTA=123 (18 added, 3 deleted, 102 changed)
-
-
- Revision created by MOE tool push_codebase.
- MOE_MIGRATION=1150
-
-
- git-svn-id: https://snappy.googlecode.com/svn/trunk@23 03e5f5b5-db94-4691-08a0-1a8bf15f6143
-
-commit f19fb07e6dc79d6857e37df572dba25ff30fc8f3
-Author: snappy.mirrorbot@gmail.com <snappy.mirrorbot@gmail.com@03e5f5b5-db94-4691-08a0-1a8bf15f6143>
-Date: Mon Mar 28 22:17:04 2011 +0000
-
- Put back the final few lines of what was truncated during the
- license header change.
-
- R=csilvers
- DELTA=5 (4 added, 0 deleted, 1 changed)
-
-
- Revision created by MOE tool push_codebase.
- MOE_MIGRATION=1094
-
-
- git-svn-id: https://snappy.googlecode.com/svn/trunk@22 03e5f5b5-db94-4691-08a0-1a8bf15f6143
-
-commit 7e8ca8f8315fc2ecb4eea19db695039ab2ca43a0
-Author: snappy.mirrorbot@gmail.com <snappy.mirrorbot@gmail.com@03e5f5b5-db94-4691-08a0-1a8bf15f6143>
-Date: Sat Mar 26 02:34:34 2011 +0000
-
- Change on 2011-03-25 19:18:00-07:00 by sesse
-
- Replace the Apache 2.0 license header by the BSD-type license header;
- somehow a lot of the files were missed in the last round.
-
- R=dannyb,csilvers
- DELTA=147 (74 added, 2 deleted, 71 changed)
-
- Change on 2011-03-25 19:25:07-07:00 by sesse
-
- Unbreak the build; the relicensing removed a bit too much (only comments
- were intended, but I also accidentially removed some of the top lines of
- the actual source).
-
-
-
- Revision created by MOE tool push_codebase.
- MOE_MIGRATION=1072
-
-
- git-svn-id: https://snappy.googlecode.com/svn/trunk@21 03e5f5b5-db94-4691-08a0-1a8bf15f6143
-
-commit b4bbc1041b35d844ec26fbae25f2864995361fd8
-Author: snappy.mirrorbot@gmail.com <snappy.mirrorbot@gmail.com@03e5f5b5-db94-4691-08a0-1a8bf15f6143>
-Date: Fri Mar 25 16:14:41 2011 +0000
-
- Change Snappy from the Apache 2.0 to a BSD-type license.
-
- R=dannyb
- DELTA=328 (80 added, 184 deleted, 64 changed)
-
-
- Revision created by MOE tool push_codebase.
- MOE_MIGRATION=1061
-
-
- git-svn-id: https://snappy.googlecode.com/svn/trunk@20 03e5f5b5-db94-4691-08a0-1a8bf15f6143
-
-commit c47640c510eb11cf8913edfa34f667bceb3a4401
-Author: snappy.mirrorbot@gmail.com <snappy.mirrorbot@gmail.com@03e5f5b5-db94-4691-08a0-1a8bf15f6143>
-Date: Fri Mar 25 00:39:01 2011 +0000
-
- Release Snappy 1.0.1, to soup up all the various small changes
- that have been made since release.
-
- R=csilvers
- DELTA=266 (260 added, 0 deleted, 6 changed)
-
-
- Revision created by MOE tool push_codebase.
- MOE_MIGRATION=1057
-
-
- git-svn-id: https://snappy.googlecode.com/svn/trunk@19 03e5f5b5-db94-4691-08a0-1a8bf15f6143
-
-commit b1dc1f643eaff897a5ce135f525799b99687b118
-Author: snappy.mirrorbot@gmail.com <snappy.mirrorbot@gmail.com@03e5f5b5-db94-4691-08a0-1a8bf15f6143>
-Date: Thu Mar 24 19:15:54 2011 +0000
-
- Fix a microbenchmark crash on mingw32; seemingly %lld is not universally
- supported on Windows, and %I64d is recommended instead.
-
- R=csilvers
- DELTA=6 (5 added, 0 deleted, 1 changed)
-
-
- Revision created by MOE tool push_codebase.
- MOE_MIGRATION=1034
-
-
- git-svn-id: https://snappy.googlecode.com/svn/trunk@18 03e5f5b5-db94-4691-08a0-1a8bf15f6143
-
-commit 98004ca9afc62a3279dfe9d9a359083f61db437f
-Author: snappy.mirrorbot@gmail.com <snappy.mirrorbot@gmail.com@03e5f5b5-db94-4691-08a0-1a8bf15f6143>
-Date: Thu Mar 24 19:15:27 2011 +0000
-
- Fix public issue #19: Fix unit test when Google Test is installed but the
- gflags package isn't (Google Test is not properly initialized).
-
- Patch by Martin Gieseking.
-
- R=csilvers
- DELTA=2 (1 added, 0 deleted, 1 changed)
-
-
- Revision created by MOE tool push_codebase.
- MOE_MIGRATION=1033
-
-
- git-svn-id: https://snappy.googlecode.com/svn/trunk@17 03e5f5b5-db94-4691-08a0-1a8bf15f6143
-
-commit 444a6c5f72d6f8d8f7213a5bcc08b26606eb9934
-Author: snappy.mirrorbot@gmail.com <snappy.mirrorbot@gmail.com@03e5f5b5-db94-4691-08a0-1a8bf15f6143>
-Date: Thu Mar 24 19:13:57 2011 +0000
-
- Make the unit test work on systems without mmap(). This is required for,
- among others, Windows support. For Windows in specific, we could have used
- CreateFileMapping/MapViewOfFile, but this should at least get us a bit closer
- to compiling, and is of course also relevant for embedded systems with no MMU.
-
- (Part 2/2)
-
- R=csilvers
- DELTA=15 (12 added, 3 deleted, 0 changed)
-
-
- Revision created by MOE tool push_codebase.
- MOE_MIGRATION=1032
-
-
- git-svn-id: https://snappy.googlecode.com/svn/trunk@16 03e5f5b5-db94-4691-08a0-1a8bf15f6143
-
-commit 2e182e9bb840737f9cd8817e859dc17a82f2c16b
-Author: snappy.mirrorbot@gmail.com <snappy.mirrorbot@gmail.com@03e5f5b5-db94-4691-08a0-1a8bf15f6143>
-Date: Thu Mar 24 19:12:27 2011 +0000
-
- Make the unit test work on systems without mmap(). This is required for,
- among others, Windows support. For Windows in specific, we could have used
- CreateFileMapping/MapViewOfFile, but this should at least get us a bit closer
- to compiling, and is of course also relevant for embedded systems with no MMU.
-
- (Part 1/2)
-
- R=csilvers
- DELTA=9 (8 added, 0 deleted, 1 changed)
-
-
- Revision created by MOE tool push_codebase.
- MOE_MIGRATION=1031
-
-
- git-svn-id: https://snappy.googlecode.com/svn/trunk@15 03e5f5b5-db94-4691-08a0-1a8bf15f6143
-
-commit 48662cbb7f81533977334629790d346220084527
-Author: snappy.mirrorbot@gmail.com <snappy.mirrorbot@gmail.com@03e5f5b5-db94-4691-08a0-1a8bf15f6143>
-Date: Wed Mar 23 23:17:36 2011 +0000
-
- Fix public issue #12: Don't keep autogenerated auto* files in Subversion;
- it causes problems with others sending patches etc..
-
- We can't get this 100% hermetic anyhow, due to files like lt~obsolete.m4,
- so we can just as well go cleanly in the other direction.
-
- R=csilvers
- DELTA=21038 (0 added, 21036 deleted, 2 changed)
-
-
- Revision created by MOE tool push_codebase.
- MOE_MIGRATION=1012
-
-
- git-svn-id: https://snappy.googlecode.com/svn/trunk@14 03e5f5b5-db94-4691-08a0-1a8bf15f6143
-
-commit 9e4717a586149c9538b353400312bab5ab5458c4
-Author: snappy.mirrorbot@gmail.com <snappy.mirrorbot@gmail.com@03e5f5b5-db94-4691-08a0-1a8bf15f6143>
-Date: Wed Mar 23 17:50:49 2011 +0000
-
- Fix public issue tracker bug #3: Call AC_SUBST([LIBTOOL_DEPS]), or the rule
- to rebuild libtool in Makefile.am won't work.
-
- R=csilvers
- DELTA=1 (1 added, 0 deleted, 0 changed)
-
-
- Revision created by MOE tool push_codebase.
- MOE_MIGRATION=997
-
-
- git-svn-id: https://snappy.googlecode.com/svn/trunk@13 03e5f5b5-db94-4691-08a0-1a8bf15f6143
-
-commit 519c822a34a91a0c0eb32d98e9686ee7d9cd6651
-Author: snappy.mirrorbot@gmail.com <snappy.mirrorbot@gmail.com@03e5f5b5-db94-4691-08a0-1a8bf15f6143>
-Date: Wed Mar 23 11:16:39 2011 +0000
-
- Fix public issue #10: Don't add GTEST_CPPFLAGS to snappy_unittest_CXXFLAGS;
- it's not needed (CPPFLAGS are always included when compiling).
-
- R=csilvers
- DELTA=1 (0 added, 1 deleted, 0 changed)
-
-
- Revision created by MOE tool push_codebase.
- MOE_MIGRATION=994
-
-
- git-svn-id: https://snappy.googlecode.com/svn/trunk@12 03e5f5b5-db94-4691-08a0-1a8bf15f6143
-
-commit ea6b936378583cba730c33c8a53776edc1782208
-Author: snappy.mirrorbot@gmail.com <snappy.mirrorbot@gmail.com@03e5f5b5-db94-4691-08a0-1a8bf15f6143>
-Date: Wed Mar 23 11:16:18 2011 +0000
-
- Fix public issue #9: Add -Wall -Werror to automake flags.
- (This concerns automake itself, not the C++ compiler.)
-
- R=csilvers
- DELTA=4 (3 added, 0 deleted, 1 changed)
-
-
- Revision created by MOE tool push_codebase.
- MOE_MIGRATION=993
-
-
- git-svn-id: https://snappy.googlecode.com/svn/trunk@11 03e5f5b5-db94-4691-08a0-1a8bf15f6143
-
-commit e3ca06af253094b1c3a8eae508cd97accf077535
-Author: snappy.mirrorbot@gmail.com <snappy.mirrorbot@gmail.com@03e5f5b5-db94-4691-08a0-1a8bf15f6143>
-Date: Wed Mar 23 11:13:37 2011 +0000
-
- Fix a typo in the Snappy README file.
-
- R=csilvers
- DELTA=1 (0 added, 0 deleted, 1 changed)
-
-
- Revision created by MOE tool push_codebase.
- MOE_MIGRATION=992
-
-
- git-svn-id: https://snappy.googlecode.com/svn/trunk@10 03e5f5b5-db94-4691-08a0-1a8bf15f6143
-
-commit 39d27bea23873abaa663e884261386b17b058f20
-Author: snappy.mirrorbot@gmail.com <snappy.mirrorbot@gmail.com@03e5f5b5-db94-4691-08a0-1a8bf15f6143>
-Date: Wed Mar 23 11:13:13 2011 +0000
-
- Fix public issue #6: Add a --with-gflags for disabling gflags autodetection
- and using a manually given setting (use/don't use) instead.
-
- R=csilvers
- DELTA=16 (13 added, 0 deleted, 3 changed)
-
-
- Revision created by MOE tool push_codebase.
- MOE_MIGRATION=991
-
-
- git-svn-id: https://snappy.googlecode.com/svn/trunk@9 03e5f5b5-db94-4691-08a0-1a8bf15f6143
-
-commit 60add43d99c1c31aeecd895cb555ad6f6520608e
-Author: snappy.mirrorbot@gmail.com <snappy.mirrorbot@gmail.com@03e5f5b5-db94-4691-08a0-1a8bf15f6143>
-Date: Wed Mar 23 11:12:44 2011 +0000
-
- Fix public issue #5: Replace the EXTRA_LIBSNAPPY_LDFLAGS setup with something
- slightly more standard, that also doesn't leak libtool command-line into
- configure.ac.
-
- R=csilvers
- DELTA=7 (0 added, 4 deleted, 3 changed)
-
-
- Revision created by MOE tool push_codebase.
- MOE_MIGRATION=990
-
-
- git-svn-id: https://snappy.googlecode.com/svn/trunk@8 03e5f5b5-db94-4691-08a0-1a8bf15f6143
-
-commit a8dd1700879ad646106742aa0e9c3a48dc07b01d
-Author: snappy.mirrorbot@gmail.com <snappy.mirrorbot@gmail.com@03e5f5b5-db94-4691-08a0-1a8bf15f6143>
-Date: Wed Mar 23 11:12:22 2011 +0000
-
- Fix public issue #4: Properly quote all macro arguments in configure.ac.
-
- R=csilvers
- DELTA=16 (0 added, 0 deleted, 16 changed)
-
-
- Revision created by MOE tool push_codebase.
- MOE_MIGRATION=989
-
-
- git-svn-id: https://snappy.googlecode.com/svn/trunk@7 03e5f5b5-db94-4691-08a0-1a8bf15f6143
-
-commit 79752dd7033658e28dc894de55012bdf2c9afca3
-Author: snappy.mirrorbot@gmail.com <snappy.mirrorbot@gmail.com@03e5f5b5-db94-4691-08a0-1a8bf15f6143>
-Date: Wed Mar 23 11:11:54 2011 +0000
-
- Fix public issue #7: Don't use internal variables named ac_*, as those belong
- to autoconf's namespace.
-
- R=csilvers
- DELTA=6 (0 added, 0 deleted, 6 changed)
-
-
- Revision created by MOE tool push_codebase.
- MOE_MIGRATION=988
-
-
- git-svn-id: https://snappy.googlecode.com/svn/trunk@6 03e5f5b5-db94-4691-08a0-1a8bf15f6143
-
-commit 46e39fb20c297129494b969ac4ea64fcd04b4fa0
-Author: snappy.mirrorbot@gmail.com <snappy.mirrorbot@gmail.com@03e5f5b5-db94-4691-08a0-1a8bf15f6143>
-Date: Wed Mar 23 11:11:09 2011 +0000
-
- Add missing licensing headers to a few files. (Part 2/2.)
-
- R=csilvers
- DELTA=12 (12 added, 0 deleted, 0 changed)
-
-
- Revision created by MOE tool push_codebase.
- MOE_MIGRATION=987
-
-
- git-svn-id: https://snappy.googlecode.com/svn/trunk@5 03e5f5b5-db94-4691-08a0-1a8bf15f6143
-
-commit 3e764216fc8edaafca480443b90e55c14eaae2c2
-Author: snappy.mirrorbot@gmail.com <snappy.mirrorbot@gmail.com@03e5f5b5-db94-4691-08a0-1a8bf15f6143>
-Date: Wed Mar 23 11:10:39 2011 +0000
-
- Add mising licensing headers to a few files. (Part 1/2.)
-
- R=csilvers
- DELTA=24 (24 added, 0 deleted, 0 changed)
-
-
- Revision created by MOE tool push_codebase.
- MOE_MIGRATION=986
-
-
- git-svn-id: https://snappy.googlecode.com/svn/trunk@4 03e5f5b5-db94-4691-08a0-1a8bf15f6143
-
-commit 9a59f183c8ffec62dcdabd3499d0d515e44e4ef0
-Author: snappy.mirrorbot@gmail.com <snappy.mirrorbot@gmail.com@03e5f5b5-db94-4691-08a0-1a8bf15f6143>
-Date: Wed Mar 23 11:10:04 2011 +0000
-
- Use the correct license file for the Apache 2.0 license;
- spotted by Florian Weimer.
-
- R=csilvers
- DELTA=202 (174 added, 0 deleted, 28 changed)
-
-
- Revision created by MOE tool push_codebase.
- MOE_MIGRATION=985
-
-
- git-svn-id: https://snappy.googlecode.com/svn/trunk@3 03e5f5b5-db94-4691-08a0-1a8bf15f6143
-
-commit 28a64402392c791905d6e1384ea1b48a5cb0b281
-Author: snappy.mirrorbot@gmail.com <snappy.mirrorbot@gmail.com@03e5f5b5-db94-4691-08a0-1a8bf15f6143>
-Date: Fri Mar 18 17:14:15 2011 +0000
-
- Revision created by MOE tool push_codebase.
- MOE_MIGRATION=
-
-
- git-svn-id: https://snappy.googlecode.com/svn/trunk@2 03e5f5b5-db94-4691-08a0-1a8bf15f6143
-
-commit 7c3c6077b72b4ae2237267a20f640b55e9a90569
-Author: sesse@google.com <sesse@google.com@03e5f5b5-db94-4691-08a0-1a8bf15f6143>
-Date: Fri Mar 18 17:13:52 2011 +0000
-
- Create trunk directory.
-
-
- git-svn-id: https://snappy.googlecode.com/svn/trunk@1 03e5f5b5-db94-4691-08a0-1a8bf15f6143
diff --git a/src/third_party/snappy-1.1.3/INSTALL b/src/third_party/snappy-1.1.3/INSTALL
deleted file mode 100644
index 2099840756e..00000000000
--- a/src/third_party/snappy-1.1.3/INSTALL
+++ /dev/null
@@ -1,370 +0,0 @@
-Installation Instructions
-*************************
-
-Copyright (C) 1994-1996, 1999-2002, 2004-2013 Free Software Foundation,
-Inc.
-
- Copying and distribution of this file, with or without modification,
-are permitted in any medium without royalty provided the copyright
-notice and this notice are preserved. This file is offered as-is,
-without warranty of any kind.
-
-Basic Installation
-==================
-
- Briefly, the shell command `./configure && make && make install'
-should configure, build, and install this package. The following
-more-detailed instructions are generic; see the `README' file for
-instructions specific to this package. Some packages provide this
-`INSTALL' file but do not implement all of the features documented
-below. The lack of an optional feature in a given package is not
-necessarily a bug. More recommendations for GNU packages can be found
-in *note Makefile Conventions: (standards)Makefile Conventions.
-
- The `configure' shell script attempts to guess correct values for
-various system-dependent variables used during compilation. It uses
-those values to create a `Makefile' in each directory of the package.
-It may also create one or more `.h' files containing system-dependent
-definitions. Finally, it creates a shell script `config.status' that
-you can run in the future to recreate the current configuration, and a
-file `config.log' containing compiler output (useful mainly for
-debugging `configure').
-
- It can also use an optional file (typically called `config.cache'
-and enabled with `--cache-file=config.cache' or simply `-C') that saves
-the results of its tests to speed up reconfiguring. Caching is
-disabled by default to prevent problems with accidental use of stale
-cache files.
-
- If you need to do unusual things to compile the package, please try
-to figure out how `configure' could check whether to do them, and mail
-diffs or instructions to the address given in the `README' so they can
-be considered for the next release. If you are using the cache, and at
-some point `config.cache' contains results you don't want to keep, you
-may remove or edit it.
-
- The file `configure.ac' (or `configure.in') is used to create
-`configure' by a program called `autoconf'. You need `configure.ac' if
-you want to change it or regenerate `configure' using a newer version
-of `autoconf'.
-
- The simplest way to compile this package is:
-
- 1. `cd' to the directory containing the package's source code and type
- `./configure' to configure the package for your system.
-
- Running `configure' might take a while. While running, it prints
- some messages telling which features it is checking for.
-
- 2. Type `make' to compile the package.
-
- 3. Optionally, type `make check' to run any self-tests that come with
- the package, generally using the just-built uninstalled binaries.
-
- 4. Type `make install' to install the programs and any data files and
- documentation. When installing into a prefix owned by root, it is
- recommended that the package be configured and built as a regular
- user, and only the `make install' phase executed with root
- privileges.
-
- 5. Optionally, type `make installcheck' to repeat any self-tests, but
- this time using the binaries in their final installed location.
- This target does not install anything. Running this target as a
- regular user, particularly if the prior `make install' required
- root privileges, verifies that the installation completed
- correctly.
-
- 6. You can remove the program binaries and object files from the
- source code directory by typing `make clean'. To also remove the
- files that `configure' created (so you can compile the package for
- a different kind of computer), type `make distclean'. There is
- also a `make maintainer-clean' target, but that is intended mainly
- for the package's developers. If you use it, you may have to get
- all sorts of other programs in order to regenerate files that came
- with the distribution.
-
- 7. Often, you can also type `make uninstall' to remove the installed
- files again. In practice, not all packages have tested that
- uninstallation works correctly, even though it is required by the
- GNU Coding Standards.
-
- 8. Some packages, particularly those that use Automake, provide `make
- distcheck', which can by used by developers to test that all other
- targets like `make install' and `make uninstall' work correctly.
- This target is generally not run by end users.
-
-Compilers and Options
-=====================
-
- Some systems require unusual options for compilation or linking that
-the `configure' script does not know about. Run `./configure --help'
-for details on some of the pertinent environment variables.
-
- You can give `configure' initial values for configuration parameters
-by setting variables in the command line or in the environment. Here
-is an example:
-
- ./configure CC=c99 CFLAGS=-g LIBS=-lposix
-
- *Note Defining Variables::, for more details.
-
-Compiling For Multiple Architectures
-====================================
-
- You can compile the package for more than one kind of computer at the
-same time, by placing the object files for each architecture in their
-own directory. To do this, you can use GNU `make'. `cd' to the
-directory where you want the object files and executables to go and run
-the `configure' script. `configure' automatically checks for the
-source code in the directory that `configure' is in and in `..'. This
-is known as a "VPATH" build.
-
- With a non-GNU `make', it is safer to compile the package for one
-architecture at a time in the source code directory. After you have
-installed the package for one architecture, use `make distclean' before
-reconfiguring for another architecture.
-
- On MacOS X 10.5 and later systems, you can create libraries and
-executables that work on multiple system types--known as "fat" or
-"universal" binaries--by specifying multiple `-arch' options to the
-compiler but only a single `-arch' option to the preprocessor. Like
-this:
-
- ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
- CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
- CPP="gcc -E" CXXCPP="g++ -E"
-
- This is not guaranteed to produce working output in all cases, you
-may have to build one architecture at a time and combine the results
-using the `lipo' tool if you have problems.
-
-Installation Names
-==================
-
- By default, `make install' installs the package's commands under
-`/usr/local/bin', include files under `/usr/local/include', etc. You
-can specify an installation prefix other than `/usr/local' by giving
-`configure' the option `--prefix=PREFIX', where PREFIX must be an
-absolute file name.
-
- You can specify separate installation prefixes for
-architecture-specific files and architecture-independent files. If you
-pass the option `--exec-prefix=PREFIX' to `configure', the package uses
-PREFIX as the prefix for installing programs and libraries.
-Documentation and other data files still use the regular prefix.
-
- In addition, if you use an unusual directory layout you can give
-options like `--bindir=DIR' to specify different values for particular
-kinds of files. Run `configure --help' for a list of the directories
-you can set and what kinds of files go in them. In general, the
-default for these options is expressed in terms of `${prefix}', so that
-specifying just `--prefix' will affect all of the other directory
-specifications that were not explicitly provided.
-
- The most portable way to affect installation locations is to pass the
-correct locations to `configure'; however, many packages provide one or
-both of the following shortcuts of passing variable assignments to the
-`make install' command line to change installation locations without
-having to reconfigure or recompile.
-
- The first method involves providing an override variable for each
-affected directory. For example, `make install
-prefix=/alternate/directory' will choose an alternate location for all
-directory configuration variables that were expressed in terms of
-`${prefix}'. Any directories that were specified during `configure',
-but not in terms of `${prefix}', must each be overridden at install
-time for the entire installation to be relocated. The approach of
-makefile variable overrides for each directory variable is required by
-the GNU Coding Standards, and ideally causes no recompilation.
-However, some platforms have known limitations with the semantics of
-shared libraries that end up requiring recompilation when using this
-method, particularly noticeable in packages that use GNU Libtool.
-
- The second method involves providing the `DESTDIR' variable. For
-example, `make install DESTDIR=/alternate/directory' will prepend
-`/alternate/directory' before all installation names. The approach of
-`DESTDIR' overrides is not required by the GNU Coding Standards, and
-does not work on platforms that have drive letters. On the other hand,
-it does better at avoiding recompilation issues, and works well even
-when some directory options were not specified in terms of `${prefix}'
-at `configure' time.
-
-Optional Features
-=================
-
- If the package supports it, you can cause programs to be installed
-with an extra prefix or suffix on their names by giving `configure' the
-option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
-
- Some packages pay attention to `--enable-FEATURE' options to
-`configure', where FEATURE indicates an optional part of the package.
-They may also pay attention to `--with-PACKAGE' options, where PACKAGE
-is something like `gnu-as' or `x' (for the X Window System). The
-`README' should mention any `--enable-' and `--with-' options that the
-package recognizes.
-
- For packages that use the X Window System, `configure' can usually
-find the X include and library files automatically, but if it doesn't,
-you can use the `configure' options `--x-includes=DIR' and
-`--x-libraries=DIR' to specify their locations.
-
- Some packages offer the ability to configure how verbose the
-execution of `make' will be. For these packages, running `./configure
---enable-silent-rules' sets the default to minimal output, which can be
-overridden with `make V=1'; while running `./configure
---disable-silent-rules' sets the default to verbose, which can be
-overridden with `make V=0'.
-
-Particular systems
-==================
-
- On HP-UX, the default C compiler is not ANSI C compatible. If GNU
-CC is not installed, it is recommended to use the following options in
-order to use an ANSI C compiler:
-
- ./configure CC="cc -Ae -D_XOPEN_SOURCE=500"
-
-and if that doesn't work, install pre-built binaries of GCC for HP-UX.
-
- HP-UX `make' updates targets which have the same time stamps as
-their prerequisites, which makes it generally unusable when shipped
-generated files such as `configure' are involved. Use GNU `make'
-instead.
-
- On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot
-parse its `<wchar.h>' header file. The option `-nodtk' can be used as
-a workaround. If GNU CC is not installed, it is therefore recommended
-to try
-
- ./configure CC="cc"
-
-and if that doesn't work, try
-
- ./configure CC="cc -nodtk"
-
- On Solaris, don't put `/usr/ucb' early in your `PATH'. This
-directory contains several dysfunctional programs; working variants of
-these programs are available in `/usr/bin'. So, if you need `/usr/ucb'
-in your `PATH', put it _after_ `/usr/bin'.
-
- On Haiku, software installed for all users goes in `/boot/common',
-not `/usr/local'. It is recommended to use the following options:
-
- ./configure --prefix=/boot/common
-
-Specifying the System Type
-==========================
-
- There may be some features `configure' cannot figure out
-automatically, but needs to determine by the type of machine the package
-will run on. Usually, assuming the package is built to be run on the
-_same_ architectures, `configure' can figure that out, but if it prints
-a message saying it cannot guess the machine type, give it the
-`--build=TYPE' option. TYPE can either be a short name for the system
-type, such as `sun4', or a canonical name which has the form:
-
- CPU-COMPANY-SYSTEM
-
-where SYSTEM can have one of these forms:
-
- OS
- KERNEL-OS
-
- See the file `config.sub' for the possible values of each field. If
-`config.sub' isn't included in this package, then this package doesn't
-need to know the machine type.
-
- If you are _building_ compiler tools for cross-compiling, you should
-use the option `--target=TYPE' to select the type of system they will
-produce code for.
-
- If you want to _use_ a cross compiler, that generates code for a
-platform different from the build platform, you should specify the
-"host" platform (i.e., that on which the generated programs will
-eventually be run) with `--host=TYPE'.
-
-Sharing Defaults
-================
-
- If you want to set default values for `configure' scripts to share,
-you can create a site shell script called `config.site' that gives
-default values for variables like `CC', `cache_file', and `prefix'.
-`configure' looks for `PREFIX/share/config.site' if it exists, then
-`PREFIX/etc/config.site' if it exists. Or, you can set the
-`CONFIG_SITE' environment variable to the location of the site script.
-A warning: not all `configure' scripts look for a site script.
-
-Defining Variables
-==================
-
- Variables not defined in a site shell script can be set in the
-environment passed to `configure'. However, some packages may run
-configure again during the build, and the customized values of these
-variables may be lost. In order to avoid this problem, you should set
-them in the `configure' command line, using `VAR=value'. For example:
-
- ./configure CC=/usr/local2/bin/gcc
-
-causes the specified `gcc' to be used as the C compiler (unless it is
-overridden in the site shell script).
-
-Unfortunately, this technique does not work for `CONFIG_SHELL' due to
-an Autoconf limitation. Until the limitation is lifted, you can use
-this workaround:
-
- CONFIG_SHELL=/bin/bash ./configure CONFIG_SHELL=/bin/bash
-
-`configure' Invocation
-======================
-
- `configure' recognizes the following options to control how it
-operates.
-
-`--help'
-`-h'
- Print a summary of all of the options to `configure', and exit.
-
-`--help=short'
-`--help=recursive'
- Print a summary of the options unique to this package's
- `configure', and exit. The `short' variant lists options used
- only in the top level, while the `recursive' variant lists options
- also present in any nested packages.
-
-`--version'
-`-V'
- Print the version of Autoconf used to generate the `configure'
- script, and exit.
-
-`--cache-file=FILE'
- Enable the cache: use and save the results of the tests in FILE,
- traditionally `config.cache'. FILE defaults to `/dev/null' to
- disable caching.
-
-`--config-cache'
-`-C'
- Alias for `--cache-file=config.cache'.
-
-`--quiet'
-`--silent'
-`-q'
- Do not print messages saying which checks are being made. To
- suppress all normal output, redirect it to `/dev/null' (any error
- messages will still be shown).
-
-`--srcdir=DIR'
- Look for the package's source code in directory DIR. Usually
- `configure' can determine that directory automatically.
-
-`--prefix=DIR'
- Use DIR as the installation prefix. *note Installation Names::
- for more details, including other options available for fine-tuning
- the installation locations.
-
-`--no-create'
-`-n'
- Run the configure checks, but stop before creating any output
- files.
-
-`configure' also accepts some other, not widely useful, options. Run
-`configure --help' for more details.
diff --git a/src/third_party/snappy-1.1.3/build_linux/config.h b/src/third_party/snappy-1.1.3/build_linux/config.h
deleted file mode 100644
index aaa531067ed..00000000000
--- a/src/third_party/snappy-1.1.3/build_linux/config.h
+++ /dev/null
@@ -1,135 +0,0 @@
-/* config.h. Generated from config.h.in by configure. */
-/* config.h.in. Generated from configure.ac by autoheader. */
-
-/* Define if building universal (internal helper macro) */
-/* #undef AC_APPLE_UNIVERSAL_BUILD */
-
-/* Define to 1 if the compiler supports __builtin_ctz and friends. */
-#define HAVE_BUILTIN_CTZ 1
-
-/* Define to 1 if the compiler supports __builtin_expect. */
-#define HAVE_BUILTIN_EXPECT 1
-
-/* Define to 1 if you have the <byteswap.h> header file. */
-#define HAVE_BYTESWAP_H 1
-
-/* Define to 1 if you have the <dlfcn.h> header file. */
-#define HAVE_DLFCN_H 1
-
-/* Use the gflags package for command-line parsing. */
-/* #undef HAVE_GFLAGS */
-
-/* Defined when Google Test is available. */
-/* #undef HAVE_GTEST */
-
-/* Define to 1 if you have the <inttypes.h> header file. */
-#define HAVE_INTTYPES_H 1
-
-/* Define to 1 if you have the `fastlz' library (-lfastlz). */
-/* #undef HAVE_LIBFASTLZ */
-
-/* Define to 1 if you have the `lzf' library (-llzf). */
-/* #undef HAVE_LIBLZF */
-
-/* Define to 1 if you have the `lzo2' library (-llzo2). */
-/* #undef HAVE_LIBLZO2 */
-
-/* Define to 1 if you have the `quicklz' library (-lquicklz). */
-/* #undef HAVE_LIBQUICKLZ */
-
-/* Define to 1 if you have the `z' library (-lz). */
-#define HAVE_LIBZ 1
-
-/* Define to 1 if you have the <memory.h> header file. */
-#define HAVE_MEMORY_H 1
-
-/* Define to 1 if you have the <stddef.h> header file. */
-#define HAVE_STDDEF_H 1
-
-/* Define to 1 if you have the <stdint.h> header file. */
-#define HAVE_STDINT_H 1
-
-/* Define to 1 if you have the <stdlib.h> header file. */
-#define HAVE_STDLIB_H 1
-
-/* Define to 1 if you have the <strings.h> header file. */
-#define HAVE_STRINGS_H 1
-
-/* Define to 1 if you have the <string.h> header file. */
-#define HAVE_STRING_H 1
-
-/* Define to 1 if you have the <sys/byteswap.h> header file. */
-/* #undef HAVE_SYS_BYTESWAP_H */
-
-/* Define to 1 if you have the <sys/endian.h> header file. */
-/* #undef HAVE_SYS_ENDIAN_H */
-
-/* Define to 1 if you have the <sys/mman.h> header file. */
-#define HAVE_SYS_MMAN_H 1
-
-/* Define to 1 if you have the <sys/resource.h> header file. */
-#define HAVE_SYS_RESOURCE_H 1
-
-/* Define to 1 if you have the <sys/stat.h> header file. */
-#define HAVE_SYS_STAT_H 1
-
-/* Define to 1 if you have the <sys/time.h> header file. */
-#define HAVE_SYS_TIME_H 1
-
-/* Define to 1 if you have the <sys/types.h> header file. */
-#define HAVE_SYS_TYPES_H 1
-
-/* Define to 1 if you have the <unistd.h> header file. */
-#define HAVE_UNISTD_H 1
-
-/* Define to 1 if you have the <windows.h> header file. */
-/* #undef HAVE_WINDOWS_H */
-
-/* Define to the sub-directory in which libtool stores uninstalled libraries.
- */
-#define LT_OBJDIR ".libs/"
-
-/* Name of package */
-#define PACKAGE "snappy"
-
-/* Define to the address where bug reports for this package should be sent. */
-#define PACKAGE_BUGREPORT ""
-
-/* Define to the full name of this package. */
-#define PACKAGE_NAME "snappy"
-
-/* Define to the full name and version of this package. */
-#define PACKAGE_STRING "snappy 1.1.3"
-
-/* Define to the one symbol short name of this package. */
-#define PACKAGE_TARNAME "snappy"
-
-/* Define to the home page for this package. */
-#define PACKAGE_URL ""
-
-/* Define to the version of this package. */
-#define PACKAGE_VERSION "1.1.3"
-
-/* Define to 1 if you have the ANSI C header files. */
-#define STDC_HEADERS 1
-
-/* Version number of package */
-#define VERSION "1.1.3"
-
-/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most
- significant byte first (like Motorola and SPARC, unlike Intel). */
-#if defined AC_APPLE_UNIVERSAL_BUILD
-# if defined __BIG_ENDIAN__
-# define WORDS_BIGENDIAN 1
-# endif
-#else
-# ifndef WORDS_BIGENDIAN
-/* # undef WORDS_BIGENDIAN */
-# endif
-#endif
-
-/* Define to `unsigned int' if <sys/types.h> does not define. */
-/* #undef size_t */
-
-/* Define to `int' if <sys/types.h> does not define. */
-/* #undef ssize_t */
diff --git a/src/third_party/snappy-1.1.3/build_posix/config.h b/src/third_party/snappy-1.1.3/build_posix/config.h
deleted file mode 100644
index a9b39443d09..00000000000
--- a/src/third_party/snappy-1.1.3/build_posix/config.h
+++ /dev/null
@@ -1,135 +0,0 @@
-/* config.h. Generated from config.h.in by configure. */
-/* config.h.in. Generated from configure.ac by autoheader. */
-
-/* Define if building universal (internal helper macro) */
-/* #undef AC_APPLE_UNIVERSAL_BUILD */
-
-/* Define to 1 if the compiler supports __builtin_ctz and friends. */
-#define HAVE_BUILTIN_CTZ 1
-
-/* Define to 1 if the compiler supports __builtin_expect. */
-#define HAVE_BUILTIN_EXPECT 1
-
-/* Define to 1 if you have the <byteswap.h> header file. */
-/* #undef HAVE_BYTESWAP_H */
-
-/* Define to 1 if you have the <dlfcn.h> header file. */
-#define HAVE_DLFCN_H 1
-
-/* Use the gflags package for command-line parsing. */
-/* #undef HAVE_GFLAGS */
-
-/* Defined when Google Test is available. */
-/* #undef HAVE_GTEST */
-
-/* Define to 1 if you have the <inttypes.h> header file. */
-#define HAVE_INTTYPES_H 1
-
-/* Define to 1 if you have the `fastlz' library (-lfastlz). */
-/* #undef HAVE_LIBFASTLZ */
-
-/* Define to 1 if you have the `lzf' library (-llzf). */
-/* #undef HAVE_LIBLZF */
-
-/* Define to 1 if you have the `lzo2' library (-llzo2). */
-/* #undef HAVE_LIBLZO2 */
-
-/* Define to 1 if you have the `quicklz' library (-lquicklz). */
-/* #undef HAVE_LIBQUICKLZ */
-
-/* Define to 1 if you have the `z' library (-lz). */
-#define HAVE_LIBZ 1
-
-/* Define to 1 if you have the <memory.h> header file. */
-#define HAVE_MEMORY_H 1
-
-/* Define to 1 if you have the <stddef.h> header file. */
-#define HAVE_STDDEF_H 1
-
-/* Define to 1 if you have the <stdint.h> header file. */
-#define HAVE_STDINT_H 1
-
-/* Define to 1 if you have the <stdlib.h> header file. */
-#define HAVE_STDLIB_H 1
-
-/* Define to 1 if you have the <strings.h> header file. */
-#define HAVE_STRINGS_H 1
-
-/* Define to 1 if you have the <string.h> header file. */
-#define HAVE_STRING_H 1
-
-/* Define to 1 if you have the <sys/byteswap.h> header file. */
-/* #undef HAVE_SYS_BYTESWAP_H */
-
-/* Define to 1 if you have the <sys/endian.h> header file. */
-/* #undef HAVE_SYS_ENDIAN_H */
-
-/* Define to 1 if you have the <sys/mman.h> header file. */
-#define HAVE_SYS_MMAN_H 1
-
-/* Define to 1 if you have the <sys/resource.h> header file. */
-#define HAVE_SYS_RESOURCE_H 1
-
-/* Define to 1 if you have the <sys/stat.h> header file. */
-#define HAVE_SYS_STAT_H 1
-
-/* Define to 1 if you have the <sys/time.h> header file. */
-#define HAVE_SYS_TIME_H 1
-
-/* Define to 1 if you have the <sys/types.h> header file. */
-#define HAVE_SYS_TYPES_H 1
-
-/* Define to 1 if you have the <unistd.h> header file. */
-#define HAVE_UNISTD_H 1
-
-/* Define to 1 if you have the <windows.h> header file. */
-/* #undef HAVE_WINDOWS_H */
-
-/* Define to the sub-directory in which libtool stores uninstalled libraries.
- */
-#define LT_OBJDIR ".libs/"
-
-/* Name of package */
-#define PACKAGE "snappy"
-
-/* Define to the address where bug reports for this package should be sent. */
-#define PACKAGE_BUGREPORT ""
-
-/* Define to the full name of this package. */
-#define PACKAGE_NAME "snappy"
-
-/* Define to the full name and version of this package. */
-#define PACKAGE_STRING "snappy 1.1.3"
-
-/* Define to the one symbol short name of this package. */
-#define PACKAGE_TARNAME "snappy"
-
-/* Define to the home page for this package. */
-#define PACKAGE_URL ""
-
-/* Define to the version of this package. */
-#define PACKAGE_VERSION "1.1.3"
-
-/* Define to 1 if you have the ANSI C header files. */
-#define STDC_HEADERS 1
-
-/* Version number of package */
-#define VERSION "1.1.3"
-
-/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most
- significant byte first (like Motorola and SPARC, unlike Intel). */
-#if defined AC_APPLE_UNIVERSAL_BUILD
-# if defined __BIG_ENDIAN__
-# define WORDS_BIGENDIAN 1
-# endif
-#else
-# ifndef WORDS_BIGENDIAN
-/* # undef WORDS_BIGENDIAN */
-# endif
-#endif
-
-/* Define to `unsigned int' if <sys/types.h> does not define. */
-/* #undef size_t */
-
-/* Define to `int' if <sys/types.h> does not define. */
-/* #undef ssize_t */
diff --git a/src/third_party/snappy-1.1.3/snappy-internal.h b/src/third_party/snappy-1.1.3/snappy-internal.h
deleted file mode 100644
index 0caeb35a850..00000000000
--- a/src/third_party/snappy-1.1.3/snappy-internal.h
+++ /dev/null
@@ -1,150 +0,0 @@
-// Copyright 2008 Google Inc. All Rights Reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-// Internals shared between the Snappy implementation and its unittest.
-
-#ifndef THIRD_PARTY_SNAPPY_SNAPPY_INTERNAL_H_
-#define THIRD_PARTY_SNAPPY_SNAPPY_INTERNAL_H_
-
-#include "snappy-stubs-internal.h"
-
-namespace snappy {
-namespace internal {
-
-class WorkingMemory {
- public:
- WorkingMemory() : large_table_(NULL) { }
- ~WorkingMemory() { delete[] large_table_; }
-
- // Allocates and clears a hash table using memory in "*this",
- // stores the number of buckets in "*table_size" and returns a pointer to
- // the base of the hash table.
- uint16* GetHashTable(size_t input_size, int* table_size);
-
- private:
- uint16 small_table_[1<<14]; // 32KB
- uint16* large_table_; // Allocated only when needed
-
- DISALLOW_COPY_AND_ASSIGN(WorkingMemory);
-};
-
-// Flat array compression that does not emit the "uncompressed length"
-// prefix. Compresses "input" string to the "*op" buffer.
-//
-// REQUIRES: "input_length <= kBlockSize"
-// REQUIRES: "op" points to an array of memory that is at least
-// "MaxCompressedLength(input_length)" in size.
-// REQUIRES: All elements in "table[0..table_size-1]" are initialized to zero.
-// REQUIRES: "table_size" is a power of two
-//
-// Returns an "end" pointer into "op" buffer.
-// "end - op" is the compressed size of "input".
-char* CompressFragment(const char* input,
- size_t input_length,
- char* op,
- uint16* table,
- const int table_size);
-
-// Return the largest n such that
-//
-// s1[0,n-1] == s2[0,n-1]
-// and n <= (s2_limit - s2).
-//
-// Does not read *s2_limit or beyond.
-// Does not read *(s1 + (s2_limit - s2)) or beyond.
-// Requires that s2_limit >= s2.
-//
-// Separate implementation for x86_64, for speed. Uses the fact that
-// x86_64 is little endian.
-#if defined(ARCH_K8)
-static inline int FindMatchLength(const char* s1,
- const char* s2,
- const char* s2_limit) {
- assert(s2_limit >= s2);
- int matched = 0;
-
- // Find out how long the match is. We loop over the data 64 bits at a
- // time until we find a 64-bit block that doesn't match; then we find
- // the first non-matching bit and use that to calculate the total
- // length of the match.
- while (PREDICT_TRUE(s2 <= s2_limit - 8)) {
- if (UNALIGNED_LOAD64(s2) == UNALIGNED_LOAD64(s1 + matched)) {
- s2 += 8;
- matched += 8;
- } else {
- // On current (mid-2008) Opteron models there is a 3% more
- // efficient code sequence to find the first non-matching byte.
- // However, what follows is ~10% better on Intel Core 2 and newer,
- // and we expect AMD's bsf instruction to improve.
- uint64 x = UNALIGNED_LOAD64(s2) ^ UNALIGNED_LOAD64(s1 + matched);
- int matching_bits = Bits::FindLSBSetNonZero64(x);
- matched += matching_bits >> 3;
- return matched;
- }
- }
- while (PREDICT_TRUE(s2 < s2_limit)) {
- if (s1[matched] == *s2) {
- ++s2;
- ++matched;
- } else {
- return matched;
- }
- }
- return matched;
-}
-#else
-static inline int FindMatchLength(const char* s1,
- const char* s2,
- const char* s2_limit) {
- // Implementation based on the x86-64 version, above.
- assert(s2_limit >= s2);
- int matched = 0;
-
- while (s2 <= s2_limit - 4 &&
- UNALIGNED_LOAD32(s2) == UNALIGNED_LOAD32(s1 + matched)) {
- s2 += 4;
- matched += 4;
- }
- if (LittleEndian::IsLittleEndian() && s2 <= s2_limit - 4) {
- uint32 x = UNALIGNED_LOAD32(s2) ^ UNALIGNED_LOAD32(s1 + matched);
- int matching_bits = Bits::FindLSBSetNonZero(x);
- matched += matching_bits >> 3;
- } else {
- while ((s2 < s2_limit) && (s1[matched] == *s2)) {
- ++s2;
- ++matched;
- }
- }
- return matched;
-}
-#endif
-
-} // end namespace internal
-} // end namespace snappy
-
-#endif // THIRD_PARTY_SNAPPY_SNAPPY_INTERNAL_H_
diff --git a/src/third_party/snappy-1.1.3/AUTHORS b/src/third_party/snappy-1.1.7/AUTHORS
index 4858b377c74..4858b377c74 100644
--- a/src/third_party/snappy-1.1.3/AUTHORS
+++ b/src/third_party/snappy-1.1.7/AUTHORS
diff --git a/src/third_party/snappy-1.1.7/CONTRIBUTING.md b/src/third_party/snappy-1.1.7/CONTRIBUTING.md
new file mode 100644
index 00000000000..c7b84516c2f
--- /dev/null
+++ b/src/third_party/snappy-1.1.7/CONTRIBUTING.md
@@ -0,0 +1,26 @@
+# How to Contribute
+
+We'd love to accept your patches and contributions to this project. There are
+just a few small guidelines you need to follow.
+
+## Contributor License Agreement
+
+Contributions to this project must be accompanied by a Contributor License
+Agreement. You (or your employer) retain the copyright to your contribution,
+this simply gives us permission to use and redistribute your contributions as
+part of the project. Head over to <https://cla.developers.google.com/> to see
+your current agreements on file or to sign a new one.
+
+You generally only need to submit a CLA once, so if you've already submitted one
+(even if it was for a different project), you probably don't need to do it
+again.
+
+## Code reviews
+
+All submissions, including submissions by project members, require review. We
+use GitHub pull requests for this purpose. Consult
+[GitHub Help](https://help.github.com/articles/about-pull-requests/) for more
+information on using pull requests.
+
+Please make sure that all the automated checks (CLA, AppVeyor, Travis) pass for
+your pull requests. Pull requests whose checks fail may be ignored.
diff --git a/src/third_party/snappy-1.1.3/COPYING b/src/third_party/snappy-1.1.7/COPYING
index bd0e5971dbf..bd0e5971dbf 100644
--- a/src/third_party/snappy-1.1.3/COPYING
+++ b/src/third_party/snappy-1.1.7/COPYING
diff --git a/src/third_party/snappy-1.1.3/NEWS b/src/third_party/snappy-1.1.7/NEWS
index 4eb7a1d1a92..db70b448853 100644
--- a/src/third_party/snappy-1.1.3/NEWS
+++ b/src/third_party/snappy-1.1.7/NEWS
@@ -1,3 +1,43 @@
+Snappy v1.1.7, August 24th 2017:
+
+ * Improved CMake build support for 64-bit Linux distributions.
+
+ * MSVC builds now use MSVC-specific intrinsics that map to clzll.
+
+ * ARM64 (AArch64) builds use the code paths optimized for 64-bit processors.
+
+Snappy v1.1.6, July 12th 2017:
+
+This is a re-release of v1.1.5 with proper SONAME / SOVERSION values.
+
+Snappy v1.1.5, June 28th 2017:
+
+This release has broken SONAME / SOVERSION values. Users of snappy as a shared
+library should avoid 1.1.5 and use 1.1.6 instead. SONAME / SOVERSION errors will
+manifest as the dynamic library loader complaining that it cannot find snappy's
+shared library file (libsnappy.so / libsnappy.dylib), or that the library it
+found does not have the required version. 1.1.6 has the same code as 1.1.5, but
+carries build configuration fixes for the issues above.
+
+ * Add CMake build support. The autoconf build support is now deprecated, and
+ will be removed in the next release.
+
+ * Add AppVeyor configuration, for Windows CI coverage.
+
+ * Small performance improvement on little-endian PowerPC.
+
+ * Small performance improvement on LLVM with position-independent executables.
+
+ * Fix a few issues with various build environments.
+
+Snappy v1.1.4, January 25th 2017:
+
+ * Fix a 1% performance regression when snappy is used in PIE executables.
+
+ * Improve compression performance by 5%.
+
+ * Improve decompression performance by 20%.
+
Snappy v1.1.3, July 6th 2015:
This is the first release to be done from GitHub, which means that
diff --git a/src/third_party/snappy-1.1.3/README b/src/third_party/snappy-1.1.7/README.md
index 3bc8888f991..b9db833dd5b 100644
--- a/src/third_party/snappy-1.1.3/README
+++ b/src/third_party/snappy-1.1.7/README.md
@@ -29,12 +29,12 @@ and the like.
Performance
===========
-
+
Snappy is intended to be fast. On a single core of a Core i7 processor
in 64-bit mode, it compresses at about 250 MB/sec or more and decompresses at
about 500 MB/sec or more. (These numbers are for the slowest inputs in our
benchmark suite; others are much faster.) In our tests, Snappy usually
-is faster than algorithms in the same class (e.g. LZO, LZF, FastLZ, QuickLZ,
+is faster than algorithms in the same class (e.g. LZO, LZF, QuickLZ,
etc.) while achieving comparable compression ratios.
Typical compression ratios (based on the benchmark suite) are about 1.5-1.7x
@@ -52,7 +52,7 @@ In particular:
- Snappy uses 64-bit operations in several places to process more data at
once than would otherwise be possible.
- Snappy assumes unaligned 32- and 64-bit loads and stores are cheap.
- On some platforms, these must be emulated with single-byte loads
+ On some platforms, these must be emulated with single-byte loads
and stores, which is much slower.
- Snappy assumes little-endian throughout, and needs to byte-swap data in
several places if running on a big-endian platform.
@@ -62,12 +62,22 @@ Performance optimizations, whether for 64-bit x86 or other platforms,
are of course most welcome; see "Contact", below.
+Building
+========
+
+CMake is supported and autotools will soon be deprecated.
+You need CMake 3.4 or above to build:
+
+ mkdir build
+ cd build && cmake ../ && make
+
+
Usage
=====
Note that Snappy, both the implementation and the main interface,
is written in C++. However, several third-party bindings to other languages
-are available; see the Google Code page at http://code.google.com/p/snappy/
+are available; see the home page at http://google.github.io/snappy/
for more information. Also, if you want to use Snappy from C code, you can
use the included C bindings in snappy-c.h.
@@ -102,12 +112,12 @@ tests to verify you have not broken anything. Note that if you have the
Google Test library installed, unit test behavior (especially failures) will be
significantly more user-friendly. You can find Google Test at
- http://code.google.com/p/googletest/
+ http://github.com/google/googletest
You probably also want the gflags library for handling of command-line flags;
you can find it at
- http://code.google.com/p/google-gflags/
+ http://gflags.github.io/gflags/
In addition to the unit tests, snappy contains microbenchmarks used to
tune compression and decompression performance. These are automatically run
@@ -116,7 +126,7 @@ before the unit tests, but you can disable them using the flag
need to edit the source).
Finally, snappy can benchmark Snappy against a few other compression libraries
-(zlib, LZO, LZF, FastLZ and QuickLZ), if they were detected at configure time.
+(zlib, LZO, LZF, and QuickLZ), if they were detected at configure time.
To benchmark using a given file, give the compression algorithm you want to test
Snappy against (e.g. --zlib) and then a list of one or more file names on the
command line. The testdata/ directory contains the files used by the
@@ -129,7 +139,11 @@ test.)
Contact
=======
-Snappy is distributed through Google Code. For the latest version, a bug tracker,
+Snappy is distributed through GitHub. For the latest version, a bug tracker,
and other information, see
- http://code.google.com/p/snappy/
+ http://google.github.io/snappy/
+
+or the repository at
+
+ https://github.com/google/snappy
diff --git a/src/third_party/snappy-1.1.3/SConscript b/src/third_party/snappy-1.1.7/SConscript
index ce0e3cd628a..6102daab87e 100644
--- a/src/third_party/snappy-1.1.3/SConscript
+++ b/src/third_party/snappy-1.1.7/SConscript
@@ -5,25 +5,25 @@ Import("endian")
env = env.Clone()
-if env.TargetOSIs('linux'):
+if env['TARGET_ARCH'] == 's390x':
+ env.Append(CPPPATH=["build_linux_s390x"])
+elif env.TargetOSIs('linux'):
env.Append(CPPPATH=["build_linux"])
- env.Append( CPPDEFINES=[ "HAVE_CONFIG_H", ] )
elif env.TargetOSIs('windows'):
# C4996: 'memccpy': The POSIX name for this item is deprecated. Instead, use the ISO C and C++
# conformant name: _memccpy. See online help for details
env.Append(CCFLAGS=['/wd4996'])
# C4018: '<': signed/unsigned mismatch
env.Append(CCFLAGS=['/wd4018'])
+ env.Append(CPPPATH=["build_windows"])
elif not env.TargetOSIs('windows'):
env.Append(CPPPATH=["build_posix"])
- env.Append( CPPDEFINES=[ "HAVE_CONFIG_H", ] )
+
+env.Append( CPPDEFINES=[ "HAVE_CONFIG_H", ] )
if env.ToolchainIs('clang', 'GCC'):
env.Append(CCFLAGS=['-Wno-sign-compare', '-Wno-unused-function'])
-if endian == "big":
- env.Append(CPPDEFINES=['WORDS_BIGENDIAN'])
-
env.Library(
target='snappy',
source=[
diff --git a/src/third_party/snappy-1.1.7/build_linux/config.h b/src/third_party/snappy-1.1.7/build_linux/config.h
new file mode 100644
index 00000000000..2595d0e0caa
--- /dev/null
+++ b/src/third_party/snappy-1.1.7/build_linux/config.h
@@ -0,0 +1,62 @@
+#ifndef THIRD_PARTY_SNAPPY_OPENSOURCE_CMAKE_CONFIG_H_
+#define THIRD_PARTY_SNAPPY_OPENSOURCE_CMAKE_CONFIG_H_
+
+/* Define to 1 if the compiler supports __builtin_ctz and friends. */
+#define HAVE_BUILTIN_CTZ 1
+
+/* Define to 1 if the compiler supports __builtin_expect. */
+#define HAVE_BUILTIN_EXPECT 1
+
+/* Define to 1 if you have the <byteswap.h> header file. */
+#define HAVE_BYTESWAP_H 1
+
+/* Define to 1 if you have a definition for mmap() in <sys/mman.h>. */
+#define HAVE_FUNC_MMAP 1
+
+/* Define to 1 if you have a definition for sysconf() in <unistd.h>. */
+#define HAVE_FUNC_SYSCONF 1
+
+/* Define to 1 to use the gflags package for command-line parsing. */
+/* #undef HAVE_GFLAGS */
+
+/* Define to 1 if you have Google Test. */
+/* #undef HAVE_GTEST */
+
+/* Define to 1 if you have the `lzo2' library (-llzo2). */
+/* #undef HAVE_LIBLZO2 */
+
+/* Define to 1 if you have the `z' library (-lz). */
+#define HAVE_LIBZ 1
+
+/* Define to 1 if you have the <stddef.h> header file. */
+#define HAVE_STDDEF_H 1
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#define HAVE_STDINT_H 1
+
+/* Define to 1 if you have the <sys/endian.h> header file. */
+/* #undef HAVE_SYS_ENDIAN_H */
+
+/* Define to 1 if you have the <sys/mman.h> header file. */
+#define HAVE_SYS_MMAN_H 1
+
+/* Define to 1 if you have the <sys/resource.h> header file. */
+#define HAVE_SYS_RESOURCE_H 1
+
+/* Define to 1 if you have the <sys/time.h> header file. */
+#define HAVE_SYS_TIME_H 1
+
+/* Define to 1 if you have the <sys/uio.h> header file. */
+#define HAVE_SYS_UIO_H 1
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#define HAVE_UNISTD_H 1
+
+/* Define to 1 if you have the <windows.h> header file. */
+/* #undef HAVE_WINDOWS_H */
+
+/* Define to 1 if your processor stores words with the most significant byte
+ first (like Motorola and SPARC, unlike Intel and VAX). */
+/* #undef SNAPPY_IS_BIG_ENDIAN */
+
+#endif // THIRD_PARTY_SNAPPY_OPENSOURCE_CMAKE_CONFIG_H_
diff --git a/src/third_party/snappy-1.1.7/build_linux_s390x/config.h b/src/third_party/snappy-1.1.7/build_linux_s390x/config.h
new file mode 100644
index 00000000000..e0adb3df1a4
--- /dev/null
+++ b/src/third_party/snappy-1.1.7/build_linux_s390x/config.h
@@ -0,0 +1,62 @@
+#ifndef THIRD_PARTY_SNAPPY_OPENSOURCE_CMAKE_CONFIG_H_
+#define THIRD_PARTY_SNAPPY_OPENSOURCE_CMAKE_CONFIG_H_
+
+/* Define to 1 if the compiler supports __builtin_ctz and friends. */
+#define HAVE_BUILTIN_CTZ 1
+
+/* Define to 1 if the compiler supports __builtin_expect. */
+#define HAVE_BUILTIN_EXPECT 1
+
+/* Define to 1 if you have the <byteswap.h> header file. */
+#define HAVE_BYTESWAP_H 1
+
+/* Define to 1 if you have a definition for mmap() in <sys/mman.h>. */
+#define HAVE_FUNC_MMAP 1
+
+/* Define to 1 if you have a definition for sysconf() in <unistd.h>. */
+#define HAVE_FUNC_SYSCONF 1
+
+/* Define to 1 to use the gflags package for command-line parsing. */
+/* #undef HAVE_GFLAGS */
+
+/* Define to 1 if you have Google Test. */
+/* #undef HAVE_GTEST */
+
+/* Define to 1 if you have the `lzo2' library (-llzo2). */
+/* #undef HAVE_LIBLZO2 */
+
+/* Define to 1 if you have the `z' library (-lz). */
+#define HAVE_LIBZ 1
+
+/* Define to 1 if you have the <stddef.h> header file. */
+#define HAVE_STDDEF_H 1
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#define HAVE_STDINT_H 1
+
+/* Define to 1 if you have the <sys/endian.h> header file. */
+/* #undef HAVE_SYS_ENDIAN_H */
+
+/* Define to 1 if you have the <sys/mman.h> header file. */
+#define HAVE_SYS_MMAN_H 1
+
+/* Define to 1 if you have the <sys/resource.h> header file. */
+#define HAVE_SYS_RESOURCE_H 1
+
+/* Define to 1 if you have the <sys/time.h> header file. */
+#define HAVE_SYS_TIME_H 1
+
+/* Define to 1 if you have the <sys/uio.h> header file. */
+#define HAVE_SYS_UIO_H 1
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#define HAVE_UNISTD_H 1
+
+/* Define to 1 if you have the <windows.h> header file. */
+/* #undef HAVE_WINDOWS_H */
+
+/* Define to 1 if your processor stores words with the most significant byte
+ first (like Motorola and SPARC, unlike Intel and VAX). */
+#define SNAPPY_IS_BIG_ENDIAN 1
+
+#endif // THIRD_PARTY_SNAPPY_OPENSOURCE_CMAKE_CONFIG_H_
diff --git a/src/third_party/snappy-1.1.7/build_posix/config.h b/src/third_party/snappy-1.1.7/build_posix/config.h
new file mode 100644
index 00000000000..16bb03153f2
--- /dev/null
+++ b/src/third_party/snappy-1.1.7/build_posix/config.h
@@ -0,0 +1,62 @@
+#ifndef THIRD_PARTY_SNAPPY_OPENSOURCE_CMAKE_CONFIG_H_
+#define THIRD_PARTY_SNAPPY_OPENSOURCE_CMAKE_CONFIG_H_
+
+/* Define to 1 if the compiler supports __builtin_ctz and friends. */
+#define HAVE_BUILTIN_CTZ 1
+
+/* Define to 1 if the compiler supports __builtin_expect. */
+#define HAVE_BUILTIN_EXPECT 1
+
+/* Define to 1 if you have the <byteswap.h> header file. */
+/* #undef HAVE_BYTESWAP_H */
+
+/* Define to 1 if you have a definition for mmap() in <sys/mman.h>. */
+#define HAVE_FUNC_MMAP 1
+
+/* Define to 1 if you have a definition for sysconf() in <unistd.h>. */
+#define HAVE_FUNC_SYSCONF 1
+
+/* Define to 1 to use the gflags package for command-line parsing. */
+/* #undef HAVE_GFLAGS */
+
+/* Define to 1 if you have Google Test. */
+/* #undef HAVE_GTEST */
+
+/* Define to 1 if you have the `lzo2' library (-llzo2). */
+/* #undef HAVE_LIBLZO2 */
+
+/* Define to 1 if you have the `z' library (-lz). */
+#define HAVE_LIBZ 1
+
+/* Define to 1 if you have the <stddef.h> header file. */
+#define HAVE_STDDEF_H 1
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#define HAVE_STDINT_H 1
+
+/* Define to 1 if you have the <sys/endian.h> header file. */
+/* #undef HAVE_SYS_ENDIAN_H */
+
+/* Define to 1 if you have the <sys/mman.h> header file. */
+#define HAVE_SYS_MMAN_H 1
+
+/* Define to 1 if you have the <sys/resource.h> header file. */
+#define HAVE_SYS_RESOURCE_H 1
+
+/* Define to 1 if you have the <sys/time.h> header file. */
+#define HAVE_SYS_TIME_H 1
+
+/* Define to 1 if you have the <sys/uio.h> header file. */
+#define HAVE_SYS_UIO_H 1
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#define HAVE_UNISTD_H 1
+
+/* Define to 1 if you have the <windows.h> header file. */
+/* #undef HAVE_WINDOWS_H */
+
+/* Define to 1 if your processor stores words with the most significant byte
+ first (like Motorola and SPARC, unlike Intel and VAX). */
+/* #undef SNAPPY_IS_BIG_ENDIAN */
+
+#endif // THIRD_PARTY_SNAPPY_OPENSOURCE_CMAKE_CONFIG_H_
diff --git a/src/third_party/snappy-1.1.7/build_windows/config.h b/src/third_party/snappy-1.1.7/build_windows/config.h
new file mode 100644
index 00000000000..8bb6650dce8
--- /dev/null
+++ b/src/third_party/snappy-1.1.7/build_windows/config.h
@@ -0,0 +1,62 @@
+#ifndef THIRD_PARTY_SNAPPY_OPENSOURCE_CMAKE_CONFIG_H_
+#define THIRD_PARTY_SNAPPY_OPENSOURCE_CMAKE_CONFIG_H_
+
+/* Define to 1 if the compiler supports __builtin_ctz and friends. */
+/* #undef HAVE_BUILTIN_CTZ */
+
+/* Define to 1 if the compiler supports __builtin_expect. */
+/* #undef HAVE_BUILTIN_EXPECT */
+
+/* Define to 1 if you have the <byteswap.h> header file. */
+/* #undef HAVE_BYTESWAP_H */
+
+/* Define to 1 if you have a definition for mmap() in <sys/mman.h>. */
+/* #undef HAVE_FUNC_MMAP */
+
+/* Define to 1 if you have a definition for sysconf() in <unistd.h>. */
+/* #undef HAVE_FUNC_SYSCONF */
+
+/* Define to 1 to use the gflags package for command-line parsing. */
+/* #undef HAVE_GFLAGS */
+
+/* Define to 1 if you have Google Test. */
+/* #undef HAVE_GTEST */
+
+/* Define to 1 if you have the `lzo2' library (-llzo2). */
+/* #undef HAVE_LIBLZO2 */
+
+/* Define to 1 if you have the `z' library (-lz). */
+/* #undef HAVE_LIBZ */
+
+/* Define to 1 if you have the <stddef.h> header file. */
+#define HAVE_STDDEF_H 1
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#define HAVE_STDINT_H 1
+
+/* Define to 1 if you have the <sys/endian.h> header file. */
+/* #undef HAVE_SYS_ENDIAN_H */
+
+/* Define to 1 if you have the <sys/mman.h> header file. */
+/* #undef HAVE_SYS_MMAN_H */
+
+/* Define to 1 if you have the <sys/resource.h> header file. */
+/* #undef HAVE_SYS_RESOURCE_H */
+
+/* Define to 1 if you have the <sys/time.h> header file. */
+/* #undef HAVE_SYS_TIME_H */
+
+/* Define to 1 if you have the <sys/uio.h> header file. */
+/* #undef HAVE_SYS_UIO_H */
+
+/* Define to 1 if you have the <unistd.h> header file. */
+/* #undef HAVE_UNISTD_H */
+
+/* Define to 1 if you have the <windows.h> header file. */
+#define HAVE_WINDOWS_H 1
+
+/* Define to 1 if your processor stores words with the most significant byte
+ first (like Motorola and SPARC, unlike Intel and VAX). */
+/* #undef SNAPPY_IS_BIG_ENDIAN */
+
+#endif // THIRD_PARTY_SNAPPY_OPENSOURCE_CMAKE_CONFIG_H_
diff --git a/src/third_party/snappy-1.1.3/format_description.txt b/src/third_party/snappy-1.1.7/format_description.txt
index 20db66c1f26..20db66c1f26 100644
--- a/src/third_party/snappy-1.1.3/format_description.txt
+++ b/src/third_party/snappy-1.1.7/format_description.txt
diff --git a/src/third_party/snappy-1.1.3/framing_format.txt b/src/third_party/snappy-1.1.7/framing_format.txt
index 9764e83de66..9764e83de66 100644
--- a/src/third_party/snappy-1.1.3/framing_format.txt
+++ b/src/third_party/snappy-1.1.7/framing_format.txt
diff --git a/src/third_party/snappy-1.1.3/snappy-c.cc b/src/third_party/snappy-1.1.7/snappy-c.cc
index 473a0b09786..473a0b09786 100644
--- a/src/third_party/snappy-1.1.3/snappy-c.cc
+++ b/src/third_party/snappy-1.1.7/snappy-c.cc
diff --git a/src/third_party/snappy-1.1.3/snappy-c.h b/src/third_party/snappy-1.1.7/snappy-c.h
index 32aa0c6b8b5..32aa0c6b8b5 100644
--- a/src/third_party/snappy-1.1.3/snappy-c.h
+++ b/src/third_party/snappy-1.1.7/snappy-c.h
diff --git a/src/third_party/snappy-1.1.7/snappy-internal.h b/src/third_party/snappy-1.1.7/snappy-internal.h
new file mode 100644
index 00000000000..a283544dc19
--- /dev/null
+++ b/src/third_party/snappy-1.1.7/snappy-internal.h
@@ -0,0 +1,224 @@
+// Copyright 2008 Google Inc. All Rights Reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Internals shared between the Snappy implementation and its unittest.
+
+#ifndef THIRD_PARTY_SNAPPY_SNAPPY_INTERNAL_H_
+#define THIRD_PARTY_SNAPPY_SNAPPY_INTERNAL_H_
+
+#include "snappy-stubs-internal.h"
+
+namespace snappy {
+namespace internal {
+
+class WorkingMemory {
+ public:
+ WorkingMemory() : large_table_(NULL) { }
+ ~WorkingMemory() { delete[] large_table_; }
+
+ // Allocates and clears a hash table using memory in "*this",
+ // stores the number of buckets in "*table_size" and returns a pointer to
+ // the base of the hash table.
+ uint16* GetHashTable(size_t input_size, int* table_size);
+
+ private:
+ uint16 small_table_[1<<14]; // 32KB
+ uint16* large_table_; // Allocated only when needed
+
+ // No copying
+ WorkingMemory(const WorkingMemory&);
+ void operator=(const WorkingMemory&);
+};
+
+// Flat array compression that does not emit the "uncompressed length"
+// prefix. Compresses "input" string to the "*op" buffer.
+//
+// REQUIRES: "input_length <= kBlockSize"
+// REQUIRES: "op" points to an array of memory that is at least
+// "MaxCompressedLength(input_length)" in size.
+// REQUIRES: All elements in "table[0..table_size-1]" are initialized to zero.
+// REQUIRES: "table_size" is a power of two
+//
+// Returns an "end" pointer into "op" buffer.
+// "end - op" is the compressed size of "input".
+char* CompressFragment(const char* input,
+ size_t input_length,
+ char* op,
+ uint16* table,
+ const int table_size);
+
+// Find the largest n such that
+//
+// s1[0,n-1] == s2[0,n-1]
+// and n <= (s2_limit - s2).
+//
+// Return make_pair(n, n < 8).
+// Does not read *s2_limit or beyond.
+// Does not read *(s1 + (s2_limit - s2)) or beyond.
+// Requires that s2_limit >= s2.
+//
+// Separate implementation for 64-bit, little-endian cpus.
+#if !defined(SNAPPY_IS_BIG_ENDIAN) && \
+ (defined(ARCH_K8) || defined(ARCH_PPC) || defined(ARCH_ARM))
+static inline std::pair<size_t, bool> FindMatchLength(const char* s1,
+ const char* s2,
+ const char* s2_limit) {
+ assert(s2_limit >= s2);
+ size_t matched = 0;
+
+ // This block isn't necessary for correctness; we could just start looping
+ // immediately. As an optimization though, it is useful. It creates some not
+ // uncommon code paths that determine, without extra effort, whether the match
+ // length is less than 8. In short, we are hoping to avoid a conditional
+ // branch, and perhaps get better code layout from the C++ compiler.
+ if (SNAPPY_PREDICT_TRUE(s2 <= s2_limit - 8)) {
+ uint64 a1 = UNALIGNED_LOAD64(s1);
+ uint64 a2 = UNALIGNED_LOAD64(s2);
+ if (a1 != a2) {
+ return std::pair<size_t, bool>(Bits::FindLSBSetNonZero64(a1 ^ a2) >> 3,
+ true);
+ } else {
+ matched = 8;
+ s2 += 8;
+ }
+ }
+
+ // Find out how long the match is. We loop over the data 64 bits at a
+ // time until we find a 64-bit block that doesn't match; then we find
+ // the first non-matching bit and use that to calculate the total
+ // length of the match.
+ while (SNAPPY_PREDICT_TRUE(s2 <= s2_limit - 8)) {
+ if (UNALIGNED_LOAD64(s2) == UNALIGNED_LOAD64(s1 + matched)) {
+ s2 += 8;
+ matched += 8;
+ } else {
+ uint64 x = UNALIGNED_LOAD64(s2) ^ UNALIGNED_LOAD64(s1 + matched);
+ int matching_bits = Bits::FindLSBSetNonZero64(x);
+ matched += matching_bits >> 3;
+ assert(matched >= 8);
+ return std::pair<size_t, bool>(matched, false);
+ }
+ }
+ while (SNAPPY_PREDICT_TRUE(s2 < s2_limit)) {
+ if (s1[matched] == *s2) {
+ ++s2;
+ ++matched;
+ } else {
+ return std::pair<size_t, bool>(matched, matched < 8);
+ }
+ }
+ return std::pair<size_t, bool>(matched, matched < 8);
+}
+#else
+static inline std::pair<size_t, bool> FindMatchLength(const char* s1,
+ const char* s2,
+ const char* s2_limit) {
+ // Implementation based on the x86-64 version, above.
+ assert(s2_limit >= s2);
+ int matched = 0;
+
+ while (s2 <= s2_limit - 4 &&
+ UNALIGNED_LOAD32(s2) == UNALIGNED_LOAD32(s1 + matched)) {
+ s2 += 4;
+ matched += 4;
+ }
+ if (LittleEndian::IsLittleEndian() && s2 <= s2_limit - 4) {
+ uint32 x = UNALIGNED_LOAD32(s2) ^ UNALIGNED_LOAD32(s1 + matched);
+ int matching_bits = Bits::FindLSBSetNonZero(x);
+ matched += matching_bits >> 3;
+ } else {
+ while ((s2 < s2_limit) && (s1[matched] == *s2)) {
+ ++s2;
+ ++matched;
+ }
+ }
+ return std::pair<size_t, bool>(matched, matched < 8);
+}
+#endif
+
+// Lookup tables for decompression code. Give --snappy_dump_decompression_table
+// to the unit test to recompute char_table.
+
+enum {
+ LITERAL = 0,
+ COPY_1_BYTE_OFFSET = 1, // 3 bit length + 3 bits of offset in opcode
+ COPY_2_BYTE_OFFSET = 2,
+ COPY_4_BYTE_OFFSET = 3
+};
+static const int kMaximumTagLength = 5; // COPY_4_BYTE_OFFSET plus the actual offset.
+
+// Data stored per entry in lookup table:
+// Range Bits-used Description
+// ------------------------------------
+// 1..64 0..7 Literal/copy length encoded in opcode byte
+// 0..7 8..10 Copy offset encoded in opcode byte / 256
+// 0..4 11..13 Extra bytes after opcode
+//
+// We use eight bits for the length even though 7 would have sufficed
+// because of efficiency reasons:
+// (1) Extracting a byte is faster than a bit-field
+// (2) It properly aligns copy offset so we do not need a <<8
+static const uint16 char_table[256] = {
+ 0x0001, 0x0804, 0x1001, 0x2001, 0x0002, 0x0805, 0x1002, 0x2002,
+ 0x0003, 0x0806, 0x1003, 0x2003, 0x0004, 0x0807, 0x1004, 0x2004,
+ 0x0005, 0x0808, 0x1005, 0x2005, 0x0006, 0x0809, 0x1006, 0x2006,
+ 0x0007, 0x080a, 0x1007, 0x2007, 0x0008, 0x080b, 0x1008, 0x2008,
+ 0x0009, 0x0904, 0x1009, 0x2009, 0x000a, 0x0905, 0x100a, 0x200a,
+ 0x000b, 0x0906, 0x100b, 0x200b, 0x000c, 0x0907, 0x100c, 0x200c,
+ 0x000d, 0x0908, 0x100d, 0x200d, 0x000e, 0x0909, 0x100e, 0x200e,
+ 0x000f, 0x090a, 0x100f, 0x200f, 0x0010, 0x090b, 0x1010, 0x2010,
+ 0x0011, 0x0a04, 0x1011, 0x2011, 0x0012, 0x0a05, 0x1012, 0x2012,
+ 0x0013, 0x0a06, 0x1013, 0x2013, 0x0014, 0x0a07, 0x1014, 0x2014,
+ 0x0015, 0x0a08, 0x1015, 0x2015, 0x0016, 0x0a09, 0x1016, 0x2016,
+ 0x0017, 0x0a0a, 0x1017, 0x2017, 0x0018, 0x0a0b, 0x1018, 0x2018,
+ 0x0019, 0x0b04, 0x1019, 0x2019, 0x001a, 0x0b05, 0x101a, 0x201a,
+ 0x001b, 0x0b06, 0x101b, 0x201b, 0x001c, 0x0b07, 0x101c, 0x201c,
+ 0x001d, 0x0b08, 0x101d, 0x201d, 0x001e, 0x0b09, 0x101e, 0x201e,
+ 0x001f, 0x0b0a, 0x101f, 0x201f, 0x0020, 0x0b0b, 0x1020, 0x2020,
+ 0x0021, 0x0c04, 0x1021, 0x2021, 0x0022, 0x0c05, 0x1022, 0x2022,
+ 0x0023, 0x0c06, 0x1023, 0x2023, 0x0024, 0x0c07, 0x1024, 0x2024,
+ 0x0025, 0x0c08, 0x1025, 0x2025, 0x0026, 0x0c09, 0x1026, 0x2026,
+ 0x0027, 0x0c0a, 0x1027, 0x2027, 0x0028, 0x0c0b, 0x1028, 0x2028,
+ 0x0029, 0x0d04, 0x1029, 0x2029, 0x002a, 0x0d05, 0x102a, 0x202a,
+ 0x002b, 0x0d06, 0x102b, 0x202b, 0x002c, 0x0d07, 0x102c, 0x202c,
+ 0x002d, 0x0d08, 0x102d, 0x202d, 0x002e, 0x0d09, 0x102e, 0x202e,
+ 0x002f, 0x0d0a, 0x102f, 0x202f, 0x0030, 0x0d0b, 0x1030, 0x2030,
+ 0x0031, 0x0e04, 0x1031, 0x2031, 0x0032, 0x0e05, 0x1032, 0x2032,
+ 0x0033, 0x0e06, 0x1033, 0x2033, 0x0034, 0x0e07, 0x1034, 0x2034,
+ 0x0035, 0x0e08, 0x1035, 0x2035, 0x0036, 0x0e09, 0x1036, 0x2036,
+ 0x0037, 0x0e0a, 0x1037, 0x2037, 0x0038, 0x0e0b, 0x1038, 0x2038,
+ 0x0039, 0x0f04, 0x1039, 0x2039, 0x003a, 0x0f05, 0x103a, 0x203a,
+ 0x003b, 0x0f06, 0x103b, 0x203b, 0x003c, 0x0f07, 0x103c, 0x203c,
+ 0x0801, 0x0f08, 0x103d, 0x203d, 0x1001, 0x0f09, 0x103e, 0x203e,
+ 0x1801, 0x0f0a, 0x103f, 0x203f, 0x2001, 0x0f0b, 0x1040, 0x2040
+};
+
+} // end namespace internal
+} // end namespace snappy
+
+#endif // THIRD_PARTY_SNAPPY_SNAPPY_INTERNAL_H_
diff --git a/src/third_party/snappy-1.1.3/snappy-sinksource.cc b/src/third_party/snappy-1.1.7/snappy-sinksource.cc
index 369a13215bc..369a13215bc 100644
--- a/src/third_party/snappy-1.1.3/snappy-sinksource.cc
+++ b/src/third_party/snappy-1.1.7/snappy-sinksource.cc
diff --git a/src/third_party/snappy-1.1.3/snappy-sinksource.h b/src/third_party/snappy-1.1.7/snappy-sinksource.h
index 8afcdaaa2cc..8afcdaaa2cc 100644
--- a/src/third_party/snappy-1.1.3/snappy-sinksource.h
+++ b/src/third_party/snappy-1.1.7/snappy-sinksource.h
diff --git a/src/third_party/snappy-1.1.3/snappy-stubs-internal.cc b/src/third_party/snappy-1.1.7/snappy-stubs-internal.cc
index 6ed334371f1..6ed334371f1 100644
--- a/src/third_party/snappy-1.1.3/snappy-stubs-internal.cc
+++ b/src/third_party/snappy-1.1.7/snappy-stubs-internal.cc
diff --git a/src/third_party/snappy-1.1.3/snappy-stubs-internal.h b/src/third_party/snappy-1.1.7/snappy-stubs-internal.h
index f81c8e35d32..7b29991d1a2 100644
--- a/src/third_party/snappy-1.1.3/snappy-stubs-internal.h
+++ b/src/third_party/snappy-1.1.7/snappy-stubs-internal.h
@@ -45,6 +45,14 @@
#include <sys/mman.h>
#endif
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#if defined(_MSC_VER)
+#include <intrin.h>
+#endif // defined(_MSC_VER)
+
#include "snappy-stubs-public.h"
#if defined(__x86_64__)
@@ -52,6 +60,14 @@
// Enable 64-bit optimized versions of some routines.
#define ARCH_K8 1
+#elif defined(__ppc64__)
+
+#define ARCH_PPC 1
+
+#elif defined(__aarch64__)
+
+#define ARCH_ARM 1
+
#endif
// Needed by OS X, among others.
@@ -59,10 +75,6 @@
#define MAP_ANONYMOUS MAP_ANON
#endif
-// Pull in std::min, std::ostream, and the likes. This is safe because this
-// header file is never used from any public header files.
-using namespace std;
-
// The size of an array, if known at compile-time.
// Will give unexpected results if used on a pointer.
// We undefine it first, since some compilers already have a definition.
@@ -73,11 +85,11 @@ using namespace std;
// Static prediction hints.
#ifdef HAVE_BUILTIN_EXPECT
-#define PREDICT_FALSE(x) (__builtin_expect(x, 0))
-#define PREDICT_TRUE(x) (__builtin_expect(!!(x), 1))
+#define SNAPPY_PREDICT_FALSE(x) (__builtin_expect(x, 0))
+#define SNAPPY_PREDICT_TRUE(x) (__builtin_expect(!!(x), 1))
#else
-#define PREDICT_FALSE(x) x
-#define PREDICT_TRUE(x) x
+#define SNAPPY_PREDICT_FALSE(x) x
+#define SNAPPY_PREDICT_TRUE(x) x
#endif
// This is only used for recomputing the tag byte table used during
@@ -96,11 +108,12 @@ static const int64 kint64max = static_cast<int64>(0x7FFFFFFFFFFFFFFFLL);
// Potentially unaligned loads and stores.
-// x86 and PowerPC can simply do these loads and stores native.
+// x86, PowerPC, and ARM64 can simply do these loads and stores native.
// MongoDB customization: Prefer memcpy on all architectures. Using reinterpret_cast is undefined
// behavior.
-#if 0 && (defined(__i386__) || defined(__x86_64__) || defined(__powerpc__))
+#if 0 && defined(__i386__) || defined(__x86_64__) || defined(__powerpc__) || \
+ defined(__aarch64__)
#define UNALIGNED_LOAD16(_p) (*reinterpret_cast<const uint16 *>(_p))
#define UNALIGNED_LOAD32(_p) (*reinterpret_cast<const uint32 *>(_p))
@@ -118,9 +131,18 @@ static const int64 kint64max = static_cast<int64>(0x7FFFFFFFFFFFFFFFLL);
// sub-architectures.
//
// This is a mess, but there's not much we can do about it.
-
-// MongoDB customization: see memcpy notes above
-#elif 0 && (defined(__arm__) && \
+//
+// To further complicate matters, only LDR instructions (single reads) are
+// allowed to be unaligned, not LDRD (two reads) or LDM (many reads). Unless we
+// explicitly tell the compiler that these accesses can be unaligned, it can and
+// will combine accesses. On armcc, the way to signal this is done by accessing
+// through the type (uint32 __packed *), but GCC has no such attribute
+// (it ignores __attribute__((packed)) on individual variables). However,
+// we can tell it that a _struct_ is unaligned, which has the same effect,
+// so we do that.
+
+// MongoDB customization: See memcpy notes above
+#elif 0 && defined(__arm__) && \
!defined(__ARM_ARCH_4__) && \
!defined(__ARM_ARCH_4T__) && \
!defined(__ARM_ARCH_5__) && \
@@ -132,13 +154,41 @@ static const int64 kint64max = static_cast<int64>(0x7FFFFFFFFFFFFFFFLL);
!defined(__ARM_ARCH_6K__) && \
!defined(__ARM_ARCH_6Z__) && \
!defined(__ARM_ARCH_6ZK__) && \
- !defined(__ARM_ARCH_6T2__))
+ !defined(__ARM_ARCH_6T2__)
-#define UNALIGNED_LOAD16(_p) (*reinterpret_cast<const uint16 *>(_p))
-#define UNALIGNED_LOAD32(_p) (*reinterpret_cast<const uint32 *>(_p))
+#if __GNUC__
+#define ATTRIBUTE_PACKED __attribute__((__packed__))
+#else
+#define ATTRIBUTE_PACKED
+#endif
-#define UNALIGNED_STORE16(_p, _val) (*reinterpret_cast<uint16 *>(_p) = (_val))
-#define UNALIGNED_STORE32(_p, _val) (*reinterpret_cast<uint32 *>(_p) = (_val))
+namespace base {
+namespace internal {
+
+struct Unaligned16Struct {
+ uint16 value;
+ uint8 dummy; // To make the size non-power-of-two.
+} ATTRIBUTE_PACKED;
+
+struct Unaligned32Struct {
+ uint32 value;
+ uint8 dummy; // To make the size non-power-of-two.
+} ATTRIBUTE_PACKED;
+
+} // namespace internal
+} // namespace base
+
+#define UNALIGNED_LOAD16(_p) \
+ ((reinterpret_cast<const ::snappy::base::internal::Unaligned16Struct *>(_p))->value)
+#define UNALIGNED_LOAD32(_p) \
+ ((reinterpret_cast<const ::snappy::base::internal::Unaligned32Struct *>(_p))->value)
+
+#define UNALIGNED_STORE16(_p, _val) \
+ ((reinterpret_cast< ::snappy::base::internal::Unaligned16Struct *>(_p))->value = \
+ (_val))
+#define UNALIGNED_STORE32(_p, _val) \
+ ((reinterpret_cast< ::snappy::base::internal::Unaligned32Struct *>(_p))->value = \
+ (_val))
// TODO(user): NEON supports unaligned 64-bit loads and stores.
// See if that would be more efficient on platforms supporting it,
@@ -191,22 +241,8 @@ inline void UNALIGNED_STORE64(void *p, uint64 v) {
#endif
-// This can be more efficient than UNALIGNED_LOAD64 + UNALIGNED_STORE64
-// on some platforms, in particular ARM.
-inline void UnalignedCopy64(const void *src, void *dst) {
- if (sizeof(void *) == 8) {
- UNALIGNED_STORE64(dst, UNALIGNED_LOAD64(src));
- } else {
- const char *src_char = reinterpret_cast<const char *>(src);
- char *dst_char = reinterpret_cast<char *>(dst);
-
- UNALIGNED_STORE32(dst_char, UNALIGNED_LOAD32(src_char));
- UNALIGNED_STORE32(dst_char + 4, UNALIGNED_LOAD32(src_char + 4));
- }
-}
-
// The following guarantees declaration of the byte swap functions.
-#ifdef WORDS_BIGENDIAN
+#if defined(SNAPPY_IS_BIG_ENDIAN)
#ifdef HAVE_SYS_BYTEORDER_H
#include <sys/byteorder.h>
@@ -263,7 +299,7 @@ inline uint64 bswap_64(uint64 x) {
#endif
-#endif // WORDS_BIGENDIAN
+#endif // defined(SNAPPY_IS_BIG_ENDIAN)
// Convert to little-endian storage, opposite of network format.
// Convert x from host to little endian: x = LittleEndian.FromHost(x);
@@ -277,7 +313,7 @@ inline uint64 bswap_64(uint64 x) {
class LittleEndian {
public:
// Conversion functions.
-#ifdef WORDS_BIGENDIAN
+#if defined(SNAPPY_IS_BIG_ENDIAN)
static uint16 FromHost16(uint16 x) { return bswap_16(x); }
static uint16 ToHost16(uint16 x) { return bswap_16(x); }
@@ -287,7 +323,7 @@ class LittleEndian {
static bool IsLittleEndian() { return false; }
-#else // !defined(WORDS_BIGENDIAN)
+#else // !defined(SNAPPY_IS_BIG_ENDIAN)
static uint16 FromHost16(uint16 x) { return x; }
static uint16 ToHost16(uint16 x) { return x; }
@@ -297,7 +333,7 @@ class LittleEndian {
static bool IsLittleEndian() { return true; }
-#endif // !defined(WORDS_BIGENDIAN)
+#endif // !defined(SNAPPY_IS_BIG_ENDIAN)
// Functions to do unaligned loads and stores in little-endian order.
static uint16 Load16(const void *p) {
@@ -327,10 +363,15 @@ class Bits {
// undefined value if n == 0. FindLSBSetNonZero() is similar to ffs() except
// that it's 0-indexed.
static int FindLSBSetNonZero(uint32 n);
+
+#if defined(ARCH_K8) || defined(ARCH_PPC) || defined(ARCH_ARM)
static int FindLSBSetNonZero64(uint64 n);
+#endif // defined(ARCH_K8) || defined(ARCH_PPC) || defined(ARCH_ARM)
private:
- DISALLOW_COPY_AND_ASSIGN(Bits);
+ // No copying
+ Bits(const Bits&);
+ void operator=(const Bits&);
};
#ifdef HAVE_BUILTIN_CTZ
@@ -343,9 +384,36 @@ inline int Bits::FindLSBSetNonZero(uint32 n) {
return __builtin_ctz(n);
}
+#if defined(ARCH_K8) || defined(ARCH_PPC) || defined(ARCH_ARM)
inline int Bits::FindLSBSetNonZero64(uint64 n) {
return __builtin_ctzll(n);
}
+#endif // defined(ARCH_K8) || defined(ARCH_PPC) || defined(ARCH_ARM)
+
+#elif defined(_MSC_VER)
+
+inline int Bits::Log2Floor(uint32 n) {
+ unsigned long where;
+ if (_BitScanReverse(&where, n)) {
+ return where;
+ } else {
+ return -1;
+ }
+}
+
+inline int Bits::FindLSBSetNonZero(uint32 n) {
+ unsigned long where;
+ if (_BitScanForward(&where, n)) return static_cast<int>(where);
+ return 32;
+}
+
+#if defined(ARCH_K8) || defined(ARCH_PPC) || defined(ARCH_ARM)
+inline int Bits::FindLSBSetNonZero64(uint64 n) {
+ unsigned long where;
+ if (_BitScanForward64(&where, n)) return static_cast<int>(where);
+ return 64;
+}
+#endif // defined(ARCH_K8) || defined(ARCH_PPC) || defined(ARCH_ARM)
#else // Portable versions.
@@ -379,6 +447,7 @@ inline int Bits::FindLSBSetNonZero(uint32 n) {
return rc;
}
+#if defined(ARCH_K8) || defined(ARCH_PPC) || defined(ARCH_ARM)
// FindLSBSetNonZero64() is defined in terms of FindLSBSetNonZero().
inline int Bits::FindLSBSetNonZero64(uint64 n) {
const uint32 bottombits = static_cast<uint32>(n);
@@ -389,6 +458,7 @@ inline int Bits::FindLSBSetNonZero64(uint64 n) {
return FindLSBSetNonZero(bottombits);
}
}
+#endif // defined(ARCH_K8) || defined(ARCH_PPC) || defined(ARCH_ARM)
#endif // End portable versions.
diff --git a/src/third_party/snappy-1.1.3/snappy-stubs-public.h b/src/third_party/snappy-1.1.7/snappy-stubs-public.h
index c156ba48e88..419c539fcf3 100644
--- a/src/third_party/snappy-1.1.3/snappy-stubs-public.h
+++ b/src/third_party/snappy-1.1.7/snappy-stubs-public.h
@@ -36,21 +36,21 @@
#ifndef THIRD_PARTY_SNAPPY_OPENSOURCE_SNAPPY_STUBS_PUBLIC_H_
#define THIRD_PARTY_SNAPPY_OPENSOURCE_SNAPPY_STUBS_PUBLIC_H_
-#if 1
+#if HAVE_STDINT_H // HAVE_STDINT_H
#include <stdint.h>
-#endif
+#endif // HAVE_STDDEF_H
-#if 1
+#if HAVE_STDDEF_H // HAVE_STDDEF_H
#include <stddef.h>
-#endif
+#endif // HAVE_STDDEF_H
-#if 0
+#if HAVE_SYS_UIO_H // HAVE_SYS_UIO_H
#include <sys/uio.h>
-#endif
+#endif // HAVE_SYS_UIO_H
-#define SNAPPY_MAJOR 1
-#define SNAPPY_MINOR 1
-#define SNAPPY_PATCHLEVEL 3
+#define SNAPPY_MAJOR
+#define SNAPPY_MINOR
+#define SNAPPY_PATCHLEVEL
#define SNAPPY_VERSION \
((SNAPPY_MAJOR << 16) | (SNAPPY_MINOR << 8) | SNAPPY_PATCHLEVEL)
@@ -58,7 +58,7 @@
namespace snappy {
-#if 1
+#if HAVE_STDINT_H // HAVE_STDINT_H
typedef int8_t int8;
typedef uint8_t uint8;
typedef int16_t int16;
@@ -76,22 +76,18 @@ typedef int int32;
typedef unsigned int uint32;
typedef long long int64;
typedef unsigned long long uint64;
-#endif
+#endif // HAVE_STDINT_H
typedef std::string string;
-#define DISALLOW_COPY_AND_ASSIGN(TypeName) \
- TypeName(const TypeName&); \
- void operator=(const TypeName&)
-
-#if !0
+#if !HAVE_SYS_UIO_H // !HAVE_SYS_UIO_H
// Windows does not have an iovec type, yet the concept is universally useful.
// It is simple to define it ourselves, so we put it inside our own namespace.
struct iovec {
void* iov_base;
size_t iov_len;
};
-#endif
+#endif // !HAVE_SYS_UIO_H
} // namespace snappy
diff --git a/src/third_party/snappy-1.1.3/snappy-stubs-public.h.in b/src/third_party/snappy-1.1.7/snappy-stubs-public.h.in
index ebe676cc1d6..3fd79bb157e 100644
--- a/src/third_party/snappy-1.1.3/snappy-stubs-public.h.in
+++ b/src/third_party/snappy-1.1.7/snappy-stubs-public.h.in
@@ -36,21 +36,21 @@
#ifndef THIRD_PARTY_SNAPPY_OPENSOURCE_SNAPPY_STUBS_PUBLIC_H_
#define THIRD_PARTY_SNAPPY_OPENSOURCE_SNAPPY_STUBS_PUBLIC_H_
-#if @ac_cv_have_stdint_h@
+#if ${HAVE_STDINT_H_01} // HAVE_STDINT_H
#include <stdint.h>
-#endif
+#endif // HAVE_STDDEF_H
-#if @ac_cv_have_stddef_h@
+#if ${HAVE_STDDEF_H_01} // HAVE_STDDEF_H
#include <stddef.h>
-#endif
+#endif // HAVE_STDDEF_H
-#if @ac_cv_have_sys_uio_h@
+#if ${HAVE_SYS_UIO_H_01} // HAVE_SYS_UIO_H
#include <sys/uio.h>
-#endif
+#endif // HAVE_SYS_UIO_H
-#define SNAPPY_MAJOR @SNAPPY_MAJOR@
-#define SNAPPY_MINOR @SNAPPY_MINOR@
-#define SNAPPY_PATCHLEVEL @SNAPPY_PATCHLEVEL@
+#define SNAPPY_MAJOR ${SNAPPY_MAJOR}
+#define SNAPPY_MINOR ${SNAPPY_MINOR}
+#define SNAPPY_PATCHLEVEL ${SNAPPY_PATCHLEVEL}
#define SNAPPY_VERSION \
((SNAPPY_MAJOR << 16) | (SNAPPY_MINOR << 8) | SNAPPY_PATCHLEVEL)
@@ -58,7 +58,7 @@
namespace snappy {
-#if @ac_cv_have_stdint_h@
+#if ${HAVE_STDINT_H_01} // HAVE_STDINT_H
typedef int8_t int8;
typedef uint8_t uint8;
typedef int16_t int16;
@@ -76,22 +76,18 @@ typedef int int32;
typedef unsigned int uint32;
typedef long long int64;
typedef unsigned long long uint64;
-#endif
+#endif // HAVE_STDINT_H
typedef std::string string;
-#define DISALLOW_COPY_AND_ASSIGN(TypeName) \
- TypeName(const TypeName&); \
- void operator=(const TypeName&)
-
-#if !@ac_cv_have_sys_uio_h@
+#if !${HAVE_SYS_UIO_H_01} // !HAVE_SYS_UIO_H
// Windows does not have an iovec type, yet the concept is universally useful.
// It is simple to define it ourselves, so we put it inside our own namespace.
struct iovec {
void* iov_base;
size_t iov_len;
};
-#endif
+#endif // !HAVE_SYS_UIO_H
} // namespace snappy
diff --git a/src/third_party/snappy-1.1.3/snappy-test.cc b/src/third_party/snappy-1.1.7/snappy-test.cc
index 7f1d0a8d1a7..01d5541fd2c 100644
--- a/src/third_party/snappy-1.1.3/snappy-test.cc
+++ b/src/third_party/snappy-1.1.7/snappy-test.cc
@@ -33,6 +33,9 @@
#endif
#ifdef HAVE_WINDOWS_H
+// Needed to be able to use std::max without workarounds in the source code.
+// https://support.microsoft.com/en-us/help/143208/prb-using-stl-in-windows-program-can-cause-min-max-conflicts
+#define NOMINMAX
#include <windows.h>
#endif
@@ -201,7 +204,7 @@ void Benchmark::Run() {
if (benchmark_real_time_us > 0) {
num_iterations = 200000 * kCalibrateIterations / benchmark_real_time_us;
}
- num_iterations = max(num_iterations, kCalibrateIterations);
+ num_iterations = std::max(num_iterations, kCalibrateIterations);
BenchmarkRun benchmark_runs[kNumRuns];
for (int run = 0; run < kNumRuns; ++run) {
@@ -217,10 +220,10 @@ void Benchmark::Run() {
string heading = StringPrintf("%s/%d", name_.c_str(), test_case_num);
string human_readable_speed;
- nth_element(benchmark_runs,
- benchmark_runs + kMedianPos,
- benchmark_runs + kNumRuns,
- BenchmarkCompareCPUTime());
+ std::nth_element(benchmark_runs,
+ benchmark_runs + kMedianPos,
+ benchmark_runs + kNumRuns,
+ BenchmarkCompareCPUTime());
int64 real_time_us = benchmark_runs[kMedianPos].real_time_us;
int64 cpu_time_us = benchmark_runs[kMedianPos].cpu_time_us;
if (cpu_time_us <= 0) {
@@ -523,8 +526,8 @@ int ZLib::UncompressAtMostOrAll(Bytef *dest, uLongf *destLen,
LOG(WARNING)
<< "UncompressChunkOrAll: Received some extra data, bytes total: "
<< uncomp_stream_.avail_in << " bytes: "
- << string(reinterpret_cast<const char *>(uncomp_stream_.next_in),
- min(int(uncomp_stream_.avail_in), 20));
+ << std::string(reinterpret_cast<const char *>(uncomp_stream_.next_in),
+ std::min(int(uncomp_stream_.avail_in), 20));
UncompressErrorInit();
return Z_DATA_ERROR; // what's the extra data for?
} else if (err != Z_OK && err != Z_STREAM_END && err != Z_BUF_ERROR) {
diff --git a/src/third_party/snappy-1.1.3/snappy-test.h b/src/third_party/snappy-1.1.7/snappy-test.h
index dbc55b9819d..078f3211046 100644
--- a/src/third_party/snappy-1.1.3/snappy-test.h
+++ b/src/third_party/snappy-1.1.7/snappy-test.h
@@ -110,26 +110,8 @@
#include "lzo/lzo1x.h"
#endif
-#ifdef HAVE_LIBLZF
-extern "C" {
-#include "lzf.h"
-}
-#endif
-
-#ifdef HAVE_LIBFASTLZ
-#include "fastlz.h"
-#endif
-
-#ifdef HAVE_LIBQUICKLZ
-#include "quicklz.h"
-#endif
-
namespace {
-namespace File {
- void Init() { }
-} // namespace File
-
namespace file {
int Defaults() { return 0; }
@@ -138,7 +120,8 @@ namespace file {
void CheckSuccess() { }
};
- DummyStatus GetContents(const string& filename, string* data, int unused) {
+ DummyStatus GetContents(
+ const std::string& filename, std::string* data, int unused) {
FILE* fp = fopen(filename.c_str(), "rb");
if (fp == NULL) {
perror(filename.c_str());
@@ -153,7 +136,7 @@ namespace file {
perror("fread");
exit(1);
}
- data->append(string(buf, ret));
+ data->append(std::string(buf, ret));
}
fclose(fp);
@@ -161,9 +144,8 @@ namespace file {
return DummyStatus();
}
- DummyStatus SetContents(const string& filename,
- const string& str,
- int unused) {
+ inline DummyStatus SetContents(
+ const std::string& filename, const std::string& str, int unused) {
FILE* fp = fopen(filename.c_str(), "wb");
if (fp == NULL) {
perror(filename.c_str());
@@ -196,6 +178,7 @@ void Test_Snappy_RandomData();
void Test_Snappy_FourByteOffset();
void Test_SnappyCorruption_TruncatedVarint();
void Test_SnappyCorruption_UnterminatedVarint();
+void Test_SnappyCorruption_OverflowingVarint();
void Test_Snappy_ReadPastEndOfBuffer();
void Test_Snappy_FindMatchLength();
void Test_Snappy_FindMatchLengthRandom();
@@ -466,7 +449,7 @@ class ZLib {
DECLARE_bool(run_microbenchmarks);
-static void RunSpecifiedBenchmarks() {
+static inline void RunSpecifiedBenchmarks() {
if (!FLAGS_run_microbenchmarks) {
return;
}
@@ -500,6 +483,7 @@ static inline int RUN_ALL_TESTS() {
snappy::Test_Snappy_FourByteOffset();
snappy::Test_SnappyCorruption_TruncatedVarint();
snappy::Test_SnappyCorruption_UnterminatedVarint();
+ snappy::Test_SnappyCorruption_OverflowingVarint();
snappy::Test_Snappy_ReadPastEndOfBuffer();
snappy::Test_Snappy_FindMatchLength();
snappy::Test_Snappy_FindMatchLengthRandom();
@@ -513,10 +497,6 @@ static inline int RUN_ALL_TESTS() {
// For main().
namespace snappy {
-static void CompressFile(const char* fname);
-static void UncompressFile(const char* fname);
-static void MeasureFile(const char* fname);
-
// Logging.
#define LOG(level) LogMessage()
@@ -527,15 +507,15 @@ class LogMessage {
public:
LogMessage() { }
~LogMessage() {
- cerr << endl;
+ std::cerr << std::endl;
}
LogMessage& operator<<(const std::string& msg) {
- cerr << msg;
+ std::cerr << msg;
return *this;
}
LogMessage& operator<<(int x) {
- cerr << x;
+ std::cerr << x;
return *this;
}
};
@@ -544,7 +524,7 @@ class LogMessage {
// and ones that are always active.
#define CRASH_UNLESS(condition) \
- PREDICT_TRUE(condition) ? (void)0 : \
+ SNAPPY_PREDICT_TRUE(condition) ? (void)0 : \
snappy::LogMessageVoidify() & snappy::LogMessageCrash()
#ifdef _MSC_VER
@@ -558,7 +538,7 @@ class LogMessageCrash : public LogMessage {
public:
LogMessageCrash() { }
~LogMessageCrash() {
- cerr << endl;
+ std::cerr << std::endl;
abort();
}
};
@@ -588,10 +568,6 @@ class LogMessageVoidify {
#define CHECK_GT(a, b) CRASH_UNLESS((a) > (b))
#define CHECK_OK(cond) (cond).CheckSuccess()
-} // namespace
-
-using snappy::CompressFile;
-using snappy::UncompressFile;
-using snappy::MeasureFile;
+} // namespace snappy
#endif // THIRD_PARTY_SNAPPY_OPENSOURCE_SNAPPY_TEST_H_
diff --git a/src/third_party/snappy-1.1.3/snappy.cc b/src/third_party/snappy-1.1.7/snappy.cc
index a50a4acd522..96abd53cb0a 100644
--- a/src/third_party/snappy-1.1.3/snappy.cc
+++ b/src/third_party/snappy-1.1.7/snappy.cc
@@ -33,13 +33,24 @@
#include "snappy-internal.h"
#include "snappy-sinksource.h"
+#ifndef SNAPPY_HAVE_SSE2
+#if defined(__SSE2__) || defined(_M_X64) || \
+ (defined(_M_IX86_FP) && _M_IX86_FP >= 2)
+#define SNAPPY_HAVE_SSE2 1
+#else
+#define SNAPPY_HAVE_SSE2 0
+#endif
+#endif
+
+#if SNAPPY_HAVE_SSE2
+#include <emmintrin.h>
+#endif
#include <stdio.h>
#include <algorithm>
#include <string>
#include <vector>
-
// Fixes missing ssize_t under Windows.
// Used in IncrementalCopy and IncrementalCopyFastPath.
// See:
@@ -50,8 +61,15 @@
typedef SSIZE_T ssize_t;
#endif // _WIN32
+
namespace snappy {
+using internal::COPY_1_BYTE_OFFSET;
+using internal::COPY_2_BYTE_OFFSET;
+using internal::LITERAL;
+using internal::char_table;
+using internal::kMaximumTagLength;
+
// Any hash function will produce a valid compressed bitstream, but a good
// hash function reduces the number of collisions and thus yields better
// compression for compressible input, and more speed for incompressible
@@ -89,79 +107,129 @@ size_t MaxCompressedLength(size_t source_len) {
return 32 + source_len + source_len/6;
}
-enum {
- LITERAL = 0,
- COPY_1_BYTE_OFFSET = 1, // 3 bit length + 3 bits of offset in opcode
- COPY_2_BYTE_OFFSET = 2,
- COPY_4_BYTE_OFFSET = 3
-};
-static const int kMaximumTagLength = 5; // COPY_4_BYTE_OFFSET plus the actual offset.
-
-// Copy "len" bytes from "src" to "op", one byte at a time. Used for
-// handling COPY operations where the input and output regions may
-// overlap. For example, suppose:
-// src == "ab"
-// op == src + 2
-// len == 20
-// After IncrementalCopy(src, op, len), the result will have
-// eleven copies of "ab"
-// ababababababababababab
-// Note that this does not match the semantics of either memcpy()
-// or memmove().
-static inline void IncrementalCopy(const char* src, char* op, ssize_t len) {
- assert(len > 0);
- do {
- *op++ = *src++;
- } while (--len > 0);
+namespace {
+
+void UnalignedCopy64(const void* src, void* dst) {
+ char tmp[8];
+ memcpy(tmp, src, 8);
+ memcpy(dst, tmp, 8);
}
-// Equivalent to IncrementalCopy except that it can write up to ten extra
-// bytes after the end of the copy, and that it is faster.
-//
-// The main part of this loop is a simple copy of eight bytes at a time until
-// we've copied (at least) the requested amount of bytes. However, if op and
-// src are less than eight bytes apart (indicating a repeating pattern of
-// length < 8), we first need to expand the pattern in order to get the correct
-// results. For instance, if the buffer looks like this, with the eight-byte
-// <src> and <op> patterns marked as intervals:
-//
-// abxxxxxxxxxxxx
-// [------] src
-// [------] op
-//
-// a single eight-byte copy from <src> to <op> will repeat the pattern once,
-// after which we can move <op> two bytes without moving <src>:
-//
-// ababxxxxxxxxxx
-// [------] src
-// [------] op
-//
-// and repeat the exercise until the two no longer overlap.
-//
-// This allows us to do very well in the special case of one single byte
-// repeated many times, without taking a big hit for more general cases.
-//
-// The worst case of extra writing past the end of the match occurs when
-// op - src == 1 and len == 1; the last copy will read from byte positions
-// [0..7] and write to [4..11], whereas it was only supposed to write to
-// position 1. Thus, ten excess bytes.
+void UnalignedCopy128(const void* src, void* dst) {
+ // TODO(alkis): Remove this when we upgrade to a recent compiler that emits
+ // SSE2 moves for memcpy(dst, src, 16).
+#if SNAPPY_HAVE_SSE2
+ __m128i x = _mm_loadu_si128(static_cast<const __m128i*>(src));
+ _mm_storeu_si128(static_cast<__m128i*>(dst), x);
+#else
+ char tmp[16];
+ memcpy(tmp, src, 16);
+ memcpy(dst, tmp, 16);
+#endif
+}
-namespace {
+// Copy [src, src+(op_limit-op)) to [op, (op_limit-op)) a byte at a time. Used
+// for handling COPY operations where the input and output regions may overlap.
+// For example, suppose:
+// src == "ab"
+// op == src + 2
+// op_limit == op + 20
+// After IncrementalCopySlow(src, op, op_limit), the result will have eleven
+// copies of "ab"
+// ababababababababababab
+// Note that this does not match the semantics of either memcpy() or memmove().
+inline char* IncrementalCopySlow(const char* src, char* op,
+ char* const op_limit) {
+ while (op < op_limit) {
+ *op++ = *src++;
+ }
+ return op_limit;
+}
-const int kMaxIncrementCopyOverflow = 10;
+// Copy [src, src+(op_limit-op)) to [op, (op_limit-op)) but faster than
+// IncrementalCopySlow. buf_limit is the address past the end of the writable
+// region of the buffer.
+inline char* IncrementalCopy(const char* src, char* op, char* const op_limit,
+ char* const buf_limit) {
+ // Terminology:
+ //
+ // slop = buf_limit - op
+ // pat = op - src
+ // len = limit - op
+ assert(src < op);
+ assert(op_limit <= buf_limit);
+ // NOTE: The compressor always emits 4 <= len <= 64. It is ok to assume that
+ // to optimize this function but we have to also handle these cases in case
+ // the input does not satisfy these conditions.
+
+ size_t pattern_size = op - src;
+ // The cases are split into different branches to allow the branch predictor,
+ // FDO, and static prediction hints to work better. For each input we list the
+ // ratio of invocations that match each condition.
+ //
+ // input slop < 16 pat < 8 len > 16
+ // ------------------------------------------
+ // html|html4|cp 0% 1.01% 27.73%
+ // urls 0% 0.88% 14.79%
+ // jpg 0% 64.29% 7.14%
+ // pdf 0% 2.56% 58.06%
+ // txt[1-4] 0% 0.23% 0.97%
+ // pb 0% 0.96% 13.88%
+ // bin 0.01% 22.27% 41.17%
+ //
+ // It is very rare that we don't have enough slop for doing block copies. It
+ // is also rare that we need to expand a pattern. Small patterns are common
+ // for incompressible formats and for those we are plenty fast already.
+ // Lengths are normally not greater than 16 but they vary depending on the
+ // input. In general if we always predict len <= 16 it would be an ok
+ // prediction.
+ //
+ // In order to be fast we want a pattern >= 8 bytes and an unrolled loop
+ // copying 2x 8 bytes at a time.
+
+ // Handle the uncommon case where pattern is less than 8 bytes.
+ if (SNAPPY_PREDICT_FALSE(pattern_size < 8)) {
+ // Expand pattern to at least 8 bytes. The worse case scenario in terms of
+ // buffer usage is when the pattern is size 3. ^ is the original position
+ // of op. x are irrelevant bytes copied by the last UnalignedCopy64.
+ //
+ // abc
+ // abcabcxxxxx
+ // abcabcabcabcxxxxx
+ // ^
+ // The last x is 14 bytes after ^.
+ if (SNAPPY_PREDICT_TRUE(op <= buf_limit - 14)) {
+ while (pattern_size < 8) {
+ UnalignedCopy64(src, op);
+ op += pattern_size;
+ pattern_size *= 2;
+ }
+ if (SNAPPY_PREDICT_TRUE(op >= op_limit)) return op_limit;
+ } else {
+ return IncrementalCopySlow(src, op, op_limit);
+ }
+ }
+ assert(pattern_size >= 8);
-inline void IncrementalCopyFastPath(const char* src, char* op, ssize_t len) {
- while (PREDICT_FALSE(op - src < 8)) {
+ // Copy 2x 8 bytes at a time. Because op - src can be < 16, a single
+ // UnalignedCopy128 might overwrite data in op. UnalignedCopy64 is safe
+ // because expanding the pattern to at least 8 bytes guarantees that
+ // op - src >= 8.
+ while (op <= buf_limit - 16) {
UnalignedCopy64(src, op);
- len -= op - src;
- op += op - src;
- }
- while (len > 0) {
+ UnalignedCopy64(src + 8, op + 8);
+ src += 16;
+ op += 16;
+ if (SNAPPY_PREDICT_TRUE(op >= op_limit)) return op_limit;
+ }
+ // We only take this branch if we didn't have enough slop and we can do a
+ // single 8 byte copy.
+ if (SNAPPY_PREDICT_FALSE(op <= buf_limit - 8)) {
UnalignedCopy64(src, op);
src += 8;
op += 8;
- len -= 8;
}
+ return IncrementalCopySlow(src, op, op_limit);
}
} // namespace
@@ -170,26 +238,29 @@ static inline char* EmitLiteral(char* op,
const char* literal,
int len,
bool allow_fast_path) {
- int n = len - 1; // Zero-length literals are disallowed
- if (n < 60) {
+ // The vast majority of copies are below 16 bytes, for which a
+ // call to memcpy is overkill. This fast path can sometimes
+ // copy up to 15 bytes too much, but that is okay in the
+ // main loop, since we have a bit to go on for both sides:
+ //
+ // - The input will always have kInputMarginBytes = 15 extra
+ // available bytes, as long as we're in the main loop, and
+ // if not, allow_fast_path = false.
+ // - The output will always have 32 spare bytes (see
+ // MaxCompressedLength).
+ assert(len > 0); // Zero-length literals are disallowed
+ int n = len - 1;
+ if (allow_fast_path && len <= 16) {
// Fits in tag byte
*op++ = LITERAL | (n << 2);
- // The vast majority of copies are below 16 bytes, for which a
- // call to memcpy is overkill. This fast path can sometimes
- // copy up to 15 bytes too much, but that is okay in the
- // main loop, since we have a bit to go on for both sides:
- //
- // - The input will always have kInputMarginBytes = 15 extra
- // available bytes, as long as we're in the main loop, and
- // if not, allow_fast_path = false.
- // - The output will always have 32 spare bytes (see
- // MaxCompressedLength).
- if (allow_fast_path && len <= 16) {
- UnalignedCopy64(literal, op);
- UnalignedCopy64(literal + 8, op + 8);
- return op + len;
- }
+ UnalignedCopy128(literal, op);
+ return op + len;
+ }
+
+ if (n < 60) {
+ // Fits in tag byte
+ *op++ = LITERAL | (n << 2);
} else {
// Encode in upcoming bytes
char* base = op;
@@ -208,42 +279,54 @@ static inline char* EmitLiteral(char* op,
return op + len;
}
-static inline char* EmitCopyLessThan64(char* op, size_t offset, int len) {
+static inline char* EmitCopyAtMost64(char* op, size_t offset, size_t len,
+ bool len_less_than_12) {
assert(len <= 64);
assert(len >= 4);
assert(offset < 65536);
+ assert(len_less_than_12 == (len < 12));
- if ((len < 12) && (offset < 2048)) {
- size_t len_minus_4 = len - 4;
- assert(len_minus_4 < 8); // Must fit in 3 bits
- *op++ = COPY_1_BYTE_OFFSET + ((len_minus_4) << 2) + ((offset >> 8) << 5);
+ if (len_less_than_12 && SNAPPY_PREDICT_TRUE(offset < 2048)) {
+ // offset fits in 11 bits. The 3 highest go in the top of the first byte,
+ // and the rest go in the second byte.
+ *op++ = COPY_1_BYTE_OFFSET + ((len - 4) << 2) + ((offset >> 3) & 0xe0);
*op++ = offset & 0xff;
} else {
- *op++ = COPY_2_BYTE_OFFSET + ((len-1) << 2);
- LittleEndian::Store16(op, offset);
- op += 2;
+ // Write 4 bytes, though we only care about 3 of them. The output buffer
+ // is required to have some slack, so the extra byte won't overrun it.
+ uint32 u = COPY_2_BYTE_OFFSET + ((len - 1) << 2) + (offset << 8);
+ LittleEndian::Store32(op, u);
+ op += 3;
}
return op;
}
-static inline char* EmitCopy(char* op, size_t offset, int len) {
- // Emit 64 byte copies but make sure to keep at least four bytes reserved
- while (PREDICT_FALSE(len >= 68)) {
- op = EmitCopyLessThan64(op, offset, 64);
- len -= 64;
- }
+static inline char* EmitCopy(char* op, size_t offset, size_t len,
+ bool len_less_than_12) {
+ assert(len_less_than_12 == (len < 12));
+ if (len_less_than_12) {
+ return EmitCopyAtMost64(op, offset, len, true);
+ } else {
+ // A special case for len <= 64 might help, but so far measurements suggest
+ // it's in the noise.
- // Emit an extra 60 byte copy if have too much data to fit in one copy
- if (len > 64) {
- op = EmitCopyLessThan64(op, offset, 60);
- len -= 60;
- }
+ // Emit 64 byte copies but make sure to keep at least four bytes reserved.
+ while (SNAPPY_PREDICT_FALSE(len >= 68)) {
+ op = EmitCopyAtMost64(op, offset, 64, false);
+ len -= 64;
+ }
- // Emit remainder
- op = EmitCopyLessThan64(op, offset, len);
- return op;
-}
+ // One or two copies will now finish the job.
+ if (len > 64) {
+ op = EmitCopyAtMost64(op, offset, 60, false);
+ len -= 60;
+ }
+ // Emit remainder.
+ op = EmitCopyAtMost64(op, offset, len, len < 12);
+ return op;
+ }
+}
bool GetUncompressedLength(const char* start, size_t n, size_t* result) {
uint32 v = 0;
@@ -357,7 +440,7 @@ char* CompressFragment(const char* input,
const char* next_emit = ip;
const size_t kInputMarginBytes = 15;
- if (PREDICT_TRUE(input_size >= kInputMarginBytes)) {
+ if (SNAPPY_PREDICT_TRUE(input_size >= kInputMarginBytes)) {
const char* ip_limit = input + input_size - kInputMarginBytes;
for (uint32 next_hash = Hash(++ip, shift); ; ) {
@@ -377,9 +460,9 @@ char* CompressFragment(const char* input,
//
// Heuristic match skipping: If 32 bytes are scanned with no matches
// found, start looking only at every other byte. If 32 more bytes are
- // scanned, look at every third byte, etc.. When a match is found,
- // immediately go back to looking at every byte. This is a small loss
- // (~5% performance, ~0.1% density) for compressible data due to more
+ // scanned (or skipped), look at every third byte, etc.. When a match is
+ // found, immediately go back to looking at every byte. This is a small
+ // loss (~5% performance, ~0.1% density) for compressible data due to more
// bookkeeping, but for non-compressible data (such as JPEG) it's a huge
// win since the compressor quickly "realizes" the data is incompressible
// and doesn't bother looking for matches everywhere.
@@ -395,9 +478,10 @@ char* CompressFragment(const char* input,
ip = next_ip;
uint32 hash = next_hash;
assert(hash == Hash(ip, shift));
- uint32 bytes_between_hash_lookups = skip++ >> 5;
+ uint32 bytes_between_hash_lookups = skip >> 5;
+ skip += bytes_between_hash_lookups;
next_ip = ip + bytes_between_hash_lookups;
- if (PREDICT_FALSE(next_ip > ip_limit)) {
+ if (SNAPPY_PREDICT_FALSE(next_ip > ip_limit)) {
goto emit_remainder;
}
next_hash = Hash(next_ip, shift);
@@ -406,8 +490,8 @@ char* CompressFragment(const char* input,
assert(candidate < ip);
table[hash] = ip - base_ip;
- } while (PREDICT_TRUE(UNALIGNED_LOAD32(ip) !=
- UNALIGNED_LOAD32(candidate)));
+ } while (SNAPPY_PREDICT_TRUE(UNALIGNED_LOAD32(ip) !=
+ UNALIGNED_LOAD32(candidate)));
// Step 2: A 4-byte match has been found. We'll later see if more
// than 4 bytes match. But, prior to the match, input
@@ -430,19 +514,21 @@ char* CompressFragment(const char* input,
// We have a 4-byte match at ip, and no need to emit any
// "literal bytes" prior to ip.
const char* base = ip;
- int matched = 4 + FindMatchLength(candidate + 4, ip + 4, ip_end);
+ std::pair<size_t, bool> p =
+ FindMatchLength(candidate + 4, ip + 4, ip_end);
+ size_t matched = 4 + p.first;
ip += matched;
size_t offset = base - candidate;
assert(0 == memcmp(base, candidate, matched));
- op = EmitCopy(op, offset, matched);
- // We could immediately start working at ip now, but to improve
- // compression we first update table[Hash(ip - 1, ...)].
- const char* insert_tail = ip - 1;
+ op = EmitCopy(op, offset, matched, p.second);
next_emit = ip;
- if (PREDICT_FALSE(ip >= ip_limit)) {
+ if (SNAPPY_PREDICT_FALSE(ip >= ip_limit)) {
goto emit_remainder;
}
- input_bytes = GetEightBytesAt(insert_tail);
+ // We are now looking for a 4-byte match again. We read
+ // table[Hash(ip, shift)] for that. To improve compression,
+ // we also update table[Hash(ip - 1, shift)] and table[Hash(ip, shift)].
+ input_bytes = GetEightBytesAt(ip - 1);
uint32 prev_hash = HashBytes(GetUint32AtOffset(input_bytes, 0), shift);
table[prev_hash] = ip - base_ip - 1;
uint32 cur_hash = HashBytes(GetUint32AtOffset(input_bytes, 1), shift);
@@ -466,6 +552,10 @@ char* CompressFragment(const char* input,
}
} // end namespace internal
+// Called back at avery compression call to trace parameters and sizes.
+static inline void Report(const char *algorithm, size_t compressed_size,
+ size_t uncompressed_size) {}
+
// Signature of output types needed by decompression code.
// The decompression code is templatized on a type that obeys this
// signature so that we do not pay virtual function call overhead in
@@ -506,162 +596,14 @@ char* CompressFragment(const char* input,
// bool TryFastAppend(const char* ip, size_t available, size_t length);
// };
-// -----------------------------------------------------------------------
-// Lookup table for decompression code. Generated by ComputeTable() below.
-// -----------------------------------------------------------------------
+namespace internal {
// Mapping from i in range [0,4] to a mask to extract the bottom 8*i bits
static const uint32 wordmask[] = {
0u, 0xffu, 0xffffu, 0xffffffu, 0xffffffffu
};
-// Data stored per entry in lookup table:
-// Range Bits-used Description
-// ------------------------------------
-// 1..64 0..7 Literal/copy length encoded in opcode byte
-// 0..7 8..10 Copy offset encoded in opcode byte / 256
-// 0..4 11..13 Extra bytes after opcode
-//
-// We use eight bits for the length even though 7 would have sufficed
-// because of efficiency reasons:
-// (1) Extracting a byte is faster than a bit-field
-// (2) It properly aligns copy offset so we do not need a <<8
-static const uint16 char_table[256] = {
- 0x0001, 0x0804, 0x1001, 0x2001, 0x0002, 0x0805, 0x1002, 0x2002,
- 0x0003, 0x0806, 0x1003, 0x2003, 0x0004, 0x0807, 0x1004, 0x2004,
- 0x0005, 0x0808, 0x1005, 0x2005, 0x0006, 0x0809, 0x1006, 0x2006,
- 0x0007, 0x080a, 0x1007, 0x2007, 0x0008, 0x080b, 0x1008, 0x2008,
- 0x0009, 0x0904, 0x1009, 0x2009, 0x000a, 0x0905, 0x100a, 0x200a,
- 0x000b, 0x0906, 0x100b, 0x200b, 0x000c, 0x0907, 0x100c, 0x200c,
- 0x000d, 0x0908, 0x100d, 0x200d, 0x000e, 0x0909, 0x100e, 0x200e,
- 0x000f, 0x090a, 0x100f, 0x200f, 0x0010, 0x090b, 0x1010, 0x2010,
- 0x0011, 0x0a04, 0x1011, 0x2011, 0x0012, 0x0a05, 0x1012, 0x2012,
- 0x0013, 0x0a06, 0x1013, 0x2013, 0x0014, 0x0a07, 0x1014, 0x2014,
- 0x0015, 0x0a08, 0x1015, 0x2015, 0x0016, 0x0a09, 0x1016, 0x2016,
- 0x0017, 0x0a0a, 0x1017, 0x2017, 0x0018, 0x0a0b, 0x1018, 0x2018,
- 0x0019, 0x0b04, 0x1019, 0x2019, 0x001a, 0x0b05, 0x101a, 0x201a,
- 0x001b, 0x0b06, 0x101b, 0x201b, 0x001c, 0x0b07, 0x101c, 0x201c,
- 0x001d, 0x0b08, 0x101d, 0x201d, 0x001e, 0x0b09, 0x101e, 0x201e,
- 0x001f, 0x0b0a, 0x101f, 0x201f, 0x0020, 0x0b0b, 0x1020, 0x2020,
- 0x0021, 0x0c04, 0x1021, 0x2021, 0x0022, 0x0c05, 0x1022, 0x2022,
- 0x0023, 0x0c06, 0x1023, 0x2023, 0x0024, 0x0c07, 0x1024, 0x2024,
- 0x0025, 0x0c08, 0x1025, 0x2025, 0x0026, 0x0c09, 0x1026, 0x2026,
- 0x0027, 0x0c0a, 0x1027, 0x2027, 0x0028, 0x0c0b, 0x1028, 0x2028,
- 0x0029, 0x0d04, 0x1029, 0x2029, 0x002a, 0x0d05, 0x102a, 0x202a,
- 0x002b, 0x0d06, 0x102b, 0x202b, 0x002c, 0x0d07, 0x102c, 0x202c,
- 0x002d, 0x0d08, 0x102d, 0x202d, 0x002e, 0x0d09, 0x102e, 0x202e,
- 0x002f, 0x0d0a, 0x102f, 0x202f, 0x0030, 0x0d0b, 0x1030, 0x2030,
- 0x0031, 0x0e04, 0x1031, 0x2031, 0x0032, 0x0e05, 0x1032, 0x2032,
- 0x0033, 0x0e06, 0x1033, 0x2033, 0x0034, 0x0e07, 0x1034, 0x2034,
- 0x0035, 0x0e08, 0x1035, 0x2035, 0x0036, 0x0e09, 0x1036, 0x2036,
- 0x0037, 0x0e0a, 0x1037, 0x2037, 0x0038, 0x0e0b, 0x1038, 0x2038,
- 0x0039, 0x0f04, 0x1039, 0x2039, 0x003a, 0x0f05, 0x103a, 0x203a,
- 0x003b, 0x0f06, 0x103b, 0x203b, 0x003c, 0x0f07, 0x103c, 0x203c,
- 0x0801, 0x0f08, 0x103d, 0x203d, 0x1001, 0x0f09, 0x103e, 0x203e,
- 0x1801, 0x0f0a, 0x103f, 0x203f, 0x2001, 0x0f0b, 0x1040, 0x2040
-};
-
-// In debug mode, allow optional computation of the table at startup.
-// Also, check that the decompression table is correct.
-#ifndef NDEBUG
-DEFINE_bool(snappy_dump_decompression_table, false,
- "If true, we print the decompression table at startup.");
-
-static uint16 MakeEntry(unsigned int extra,
- unsigned int len,
- unsigned int copy_offset) {
- // Check that all of the fields fit within the allocated space
- assert(extra == (extra & 0x7)); // At most 3 bits
- assert(copy_offset == (copy_offset & 0x7)); // At most 3 bits
- assert(len == (len & 0x7f)); // At most 7 bits
- return len | (copy_offset << 8) | (extra << 11);
-}
-
-static void ComputeTable() {
- uint16 dst[256];
-
- // Place invalid entries in all places to detect missing initialization
- int assigned = 0;
- for (int i = 0; i < 256; i++) {
- dst[i] = 0xffff;
- }
-
- // Small LITERAL entries. We store (len-1) in the top 6 bits.
- for (unsigned int len = 1; len <= 60; len++) {
- dst[LITERAL | ((len-1) << 2)] = MakeEntry(0, len, 0);
- assigned++;
- }
-
- // Large LITERAL entries. We use 60..63 in the high 6 bits to
- // encode the number of bytes of length info that follow the opcode.
- for (unsigned int extra_bytes = 1; extra_bytes <= 4; extra_bytes++) {
- // We set the length field in the lookup table to 1 because extra
- // bytes encode len-1.
- dst[LITERAL | ((extra_bytes+59) << 2)] = MakeEntry(extra_bytes, 1, 0);
- assigned++;
- }
-
- // COPY_1_BYTE_OFFSET.
- //
- // The tag byte in the compressed data stores len-4 in 3 bits, and
- // offset/256 in 5 bits. offset%256 is stored in the next byte.
- //
- // This format is used for length in range [4..11] and offset in
- // range [0..2047]
- for (unsigned int len = 4; len < 12; len++) {
- for (unsigned int offset = 0; offset < 2048; offset += 256) {
- dst[COPY_1_BYTE_OFFSET | ((len-4)<<2) | ((offset>>8)<<5)] =
- MakeEntry(1, len, offset>>8);
- assigned++;
- }
- }
-
- // COPY_2_BYTE_OFFSET.
- // Tag contains len-1 in top 6 bits, and offset in next two bytes.
- for (unsigned int len = 1; len <= 64; len++) {
- dst[COPY_2_BYTE_OFFSET | ((len-1)<<2)] = MakeEntry(2, len, 0);
- assigned++;
- }
-
- // COPY_4_BYTE_OFFSET.
- // Tag contents len-1 in top 6 bits, and offset in next four bytes.
- for (unsigned int len = 1; len <= 64; len++) {
- dst[COPY_4_BYTE_OFFSET | ((len-1)<<2)] = MakeEntry(4, len, 0);
- assigned++;
- }
-
- // Check that each entry was initialized exactly once.
- if (assigned != 256) {
- fprintf(stderr, "ComputeTable: assigned only %d of 256\n", assigned);
- abort();
- }
- for (int i = 0; i < 256; i++) {
- if (dst[i] == 0xffff) {
- fprintf(stderr, "ComputeTable: did not assign byte %d\n", i);
- abort();
- }
- }
-
- if (FLAGS_snappy_dump_decompression_table) {
- printf("static const uint16 char_table[256] = {\n ");
- for (int i = 0; i < 256; i++) {
- printf("0x%04x%s",
- dst[i],
- ((i == 255) ? "\n" : (((i%8) == 7) ? ",\n " : ", ")));
- }
- printf("};\n");
- }
-
- // Check that computed table matched recorded table
- for (int i = 0; i < 256; i++) {
- if (dst[i] != char_table[i]) {
- fprintf(stderr, "ComputeTable: byte %d: computed (%x), expect (%x)\n",
- i, static_cast<int>(dst[i]), static_cast<int>(char_table[i]));
- abort();
- }
- }
-}
-#endif /* !NDEBUG */
+} // end namespace internal
// Helper class for decompression
class SnappyDecompressor {
@@ -714,7 +656,9 @@ class SnappyDecompressor {
if (n == 0) return false;
const unsigned char c = *(reinterpret_cast<const unsigned char*>(ip));
reader_->Skip(1);
- *result |= static_cast<uint32>(c & 0x7f) << shift;
+ uint32 val = c & 0x7f;
+ if (((val << shift) >> shift) != val) return false;
+ *result |= val << shift;
if (c < 128) {
break;
}
@@ -728,6 +672,19 @@ class SnappyDecompressor {
template <class Writer>
void DecompressAllTags(Writer* writer) {
const char* ip = ip_;
+ // For position-independent executables, accessing global arrays can be
+ // slow. Move wordmask array onto the stack to mitigate this.
+ uint32 wordmask[sizeof(internal::wordmask)/sizeof(uint32)];
+ // Do not use memcpy to copy internal::wordmask to
+ // wordmask. LLVM converts stack arrays to global arrays if it detects
+ // const stack arrays and this hurts the performance of position
+ // independent code. This change is temporary and can be reverted when
+ // https://reviews.llvm.org/D30759 is approved.
+ wordmask[0] = internal::wordmask[0];
+ wordmask[1] = internal::wordmask[1];
+ wordmask[2] = internal::wordmask[2];
+ wordmask[3] = internal::wordmask[3];
+ wordmask[4] = internal::wordmask[4];
// We could have put this refill fragment only at the beginning of the loop.
// However, duplicating it at the end of each branch gives the compiler more
@@ -741,10 +698,29 @@ class SnappyDecompressor {
}
MAYBE_REFILL();
+ // Add loop alignment directive. Without this directive, we observed
+ // significant performance degradation on several intel architectures
+ // in snappy benchmark built with LLVM. The degradation was caused by
+ // increased branch miss prediction.
+#if defined(__clang__) && defined(__x86_64__)
+ asm volatile (".p2align 5");
+#endif
for ( ;; ) {
const unsigned char c = *(reinterpret_cast<const unsigned char*>(ip++));
- if ((c & 0x3) == LITERAL) {
+ // Ratio of iterations that have LITERAL vs non-LITERAL for different
+ // inputs.
+ //
+ // input LITERAL NON_LITERAL
+ // -----------------------------------
+ // html|html4|cp 23% 77%
+ // urls 36% 64%
+ // jpg 47% 53%
+ // pdf 19% 81%
+ // txt[1-4] 25% 75%
+ // pb 24% 76%
+ // bin 24% 76%
+ if (SNAPPY_PREDICT_FALSE((c & 0x3) == LITERAL)) {
size_t literal_length = (c >> 2) + 1u;
if (writer->TryFastAppend(ip, ip_limit_ - ip, literal_length)) {
assert(literal_length < 61);
@@ -754,7 +730,7 @@ class SnappyDecompressor {
// bytes in addition to the literal.
continue;
}
- if (PREDICT_FALSE(literal_length >= 61)) {
+ if (SNAPPY_PREDICT_FALSE(literal_length >= 61)) {
// Long literal.
const size_t literal_length_length = literal_length - 60;
literal_length =
@@ -780,15 +756,15 @@ class SnappyDecompressor {
ip += literal_length;
MAYBE_REFILL();
} else {
- const uint32 entry = char_table[c];
- const uint32 trailer = LittleEndian::Load32(ip) & wordmask[entry >> 11];
- const uint32 length = entry & 0xff;
+ const size_t entry = char_table[c];
+ const size_t trailer = LittleEndian::Load32(ip) & wordmask[entry >> 11];
+ const size_t length = entry & 0xff;
ip += entry >> 11;
// copy_offset/256 is encoded in bits 8..10. By just fetching
// those bits, we get copy_offset (since the bit-field starts at
// bit 8).
- const uint32 copy_offset = entry & 0x700;
+ const size_t copy_offset = entry & 0x700;
if (!writer->AppendFromSelf(copy_offset + trailer, length)) {
return;
}
@@ -808,10 +784,8 @@ bool SnappyDecompressor::RefillTag() {
size_t n;
ip = reader_->Peek(&n);
peeked_ = n;
- if (n == 0) {
- eof_ = true;
- return false;
- }
+ eof_ = (n == 0);
+ if (eof_) return false;
ip_limit_ = ip + n;
}
@@ -836,7 +810,7 @@ bool SnappyDecompressor::RefillTag() {
size_t length;
const char* src = reader_->Peek(&length);
if (length == 0) return false;
- uint32 to_add = min<uint32>(needed - nbuf, length);
+ uint32 to_add = std::min<uint32>(needed - nbuf, length);
memcpy(scratch_ + nbuf, src, to_add);
nbuf += to_add;
reader_->Skip(to_add);
@@ -865,13 +839,18 @@ static bool InternalUncompress(Source* r, Writer* writer) {
SnappyDecompressor decompressor(r);
uint32 uncompressed_len = 0;
if (!decompressor.ReadUncompressedLength(&uncompressed_len)) return false;
- return InternalUncompressAllTags(&decompressor, writer, uncompressed_len);
+
+ return InternalUncompressAllTags(&decompressor, writer, r->Available(),
+ uncompressed_len);
}
template <typename Writer>
static bool InternalUncompressAllTags(SnappyDecompressor* decompressor,
Writer* writer,
+ uint32 compressed_len,
uint32 uncompressed_len) {
+ Report("snappy_uncompress", compressed_len, uncompressed_len);
+
writer->SetExpectedLength(uncompressed_len);
// Process the entire input
@@ -888,6 +867,7 @@ bool GetUncompressedLength(Source* source, uint32* result) {
size_t Compress(Source* reader, Sink* writer) {
size_t written = 0;
size_t N = reader->Available();
+ const size_t uncompressed_size = N;
char ulength[Varint::kMax32];
char* p = Varint::Encode32(ulength, N);
writer->Append(ulength, p-ulength);
@@ -902,7 +882,7 @@ size_t Compress(Source* reader, Sink* writer) {
size_t fragment_size;
const char* fragment = reader->Peek(&fragment_size);
assert(fragment_size != 0); // premature end of input
- const size_t num_to_read = min(N, kBlockSize);
+ const size_t num_to_read = std::min(N, kBlockSize);
size_t bytes_read = fragment_size;
size_t pending_advance = 0;
@@ -923,7 +903,7 @@ size_t Compress(Source* reader, Sink* writer) {
while (bytes_read < num_to_read) {
fragment = reader->Peek(&fragment_size);
- size_t n = min<size_t>(fragment_size, num_to_read - bytes_read);
+ size_t n = std::min<size_t>(fragment_size, num_to_read - bytes_read);
memcpy(scratch + bytes_read, fragment, n);
bytes_read += n;
reader->Skip(n);
@@ -960,6 +940,8 @@ size_t Compress(Source* reader, Sink* writer) {
reader->Skip(pending_advance);
}
+ Report("snappy_compress", written, uncompressed_size);
+
delete[] scratch;
delete[] scratch_output;
@@ -979,7 +961,7 @@ class SnappyIOVecWriter {
const size_t output_iov_count_;
// We are currently writing into output_iov_[curr_iov_index_].
- int curr_iov_index_;
+ size_t curr_iov_index_;
// Bytes written to output_iov_[curr_iov_index_] so far.
size_t curr_iov_written_;
@@ -990,7 +972,7 @@ class SnappyIOVecWriter {
// Maximum number of bytes that will be decompressed into output_iov_.
size_t output_limit_;
- inline char* GetIOVecPointer(int index, size_t offset) {
+ inline char* GetIOVecPointer(size_t index, size_t offset) {
return reinterpret_cast<char*>(output_iov_[index].iov_base) +
offset;
}
@@ -1051,8 +1033,7 @@ class SnappyIOVecWriter {
output_iov_[curr_iov_index_].iov_len - curr_iov_written_ >= 16) {
// Fast path, used for the majority (about 95%) of invocations.
char* ptr = GetIOVecPointer(curr_iov_index_, curr_iov_written_);
- UnalignedCopy64(ip, ptr);
- UnalignedCopy64(ip + 8, ptr + 8);
+ UnalignedCopy128(ip, ptr);
curr_iov_written_ += len;
total_written_ += len;
return true;
@@ -1071,7 +1052,7 @@ class SnappyIOVecWriter {
}
// Locate the iovec from which we need to start the copy.
- int from_iov_index = curr_iov_index_;
+ size_t from_iov_index = curr_iov_index_;
size_t from_iov_offset = curr_iov_written_;
while (offset > 0) {
if (from_iov_offset >= offset) {
@@ -1080,8 +1061,8 @@ class SnappyIOVecWriter {
}
offset -= from_iov_offset;
+ assert(from_iov_index > 0);
--from_iov_index;
- assert(from_iov_index >= 0);
from_iov_offset = output_iov_[from_iov_index].iov_len;
}
@@ -1116,9 +1097,10 @@ class SnappyIOVecWriter {
if (to_copy > len) {
to_copy = len;
}
- IncrementalCopy(GetIOVecPointer(from_iov_index, from_iov_offset),
- GetIOVecPointer(curr_iov_index_, curr_iov_written_),
- to_copy);
+ IncrementalCopySlow(
+ GetIOVecPointer(from_iov_index, from_iov_offset),
+ GetIOVecPointer(curr_iov_index_, curr_iov_written_),
+ GetIOVecPointer(curr_iov_index_, curr_iov_written_) + to_copy);
curr_iov_written_ += to_copy;
from_iov_offset += to_copy;
total_written_ += to_copy;
@@ -1188,8 +1170,7 @@ class SnappyArrayWriter {
const size_t space_left = op_limit_ - op;
if (len <= 16 && available >= 16 + kMaximumTagLength && space_left >= 16) {
// Fast path, used for the majority (about 95%) of invocations.
- UnalignedCopy64(ip, op);
- UnalignedCopy64(ip + 8, op + 8);
+ UnalignedCopy128(ip, op);
op_ = op + len;
return true;
} else {
@@ -1198,8 +1179,7 @@ class SnappyArrayWriter {
}
inline bool AppendFromSelf(size_t offset, size_t len) {
- char* op = op_;
- const size_t space_left = op_limit_ - op;
+ char* const op_end = op_ + len;
// Check if we try to append from before the start of the buffer.
// Normally this would just be a check for "produced < offset",
@@ -1208,30 +1188,13 @@ class SnappyArrayWriter {
// to a very big number. This is convenient, as offset==0 is another
// invalid case that we also want to catch, so that we do not go
// into an infinite loop.
- assert(op >= base_);
- size_t produced = op - base_;
- if (produced <= offset - 1u) {
- return false;
- }
- if (len <= 16 && offset >= 8 && space_left >= 16) {
- // Fast path, used for the majority (70-80%) of dynamic invocations.
- UnalignedCopy64(op - offset, op);
- UnalignedCopy64(op - offset + 8, op + 8);
- } else {
- if (space_left >= len + kMaxIncrementCopyOverflow) {
- IncrementalCopyFastPath(op - offset, op, len);
- } else {
- if (space_left < len) {
- return false;
- }
- IncrementalCopy(op - offset, op, len);
- }
- }
+ if (Produced() <= offset - 1u || op_end > op_limit_) return false;
+ op_ = IncrementalCopy(op_ - offset, op_, op_end, op_limit_);
- op_ = op + len;
return true;
}
inline size_t Produced() const {
+ assert(op_ >= base_);
return op_ - base_;
}
inline void Flush() {}
@@ -1317,7 +1280,7 @@ void RawCompress(const char* input,
size_t Compress(const char* input, size_t input_length, string* compressed) {
// Pre-grow the buffer to the max length of the compressed output
- compressed->resize(MaxCompressedLength(input_length));
+ STLStringResizeUninitialized(compressed, MaxCompressedLength(input_length));
size_t compressed_length;
RawCompress(input, input_length, string_as_array(compressed),
@@ -1340,7 +1303,7 @@ class SnappyScatteredWriter {
// We need random access into the data generated so far. Therefore
// we keep track of all of the generated data as an array of blocks.
// All of the blocks except the last have length kBlockSize.
- vector<char*> blocks_;
+ std::vector<char*> blocks_;
size_t expected_;
// Total size of all fully generated blocks so far
@@ -1399,8 +1362,7 @@ class SnappyScatteredWriter {
if (length <= 16 && available >= 16 + kMaximumTagLength &&
space_left >= 16) {
// Fast path, used for the majority (about 95%) of invocations.
- UNALIGNED_STORE64(op, UNALIGNED_LOAD64(ip));
- UNALIGNED_STORE64(op + 8, UNALIGNED_LOAD64(ip + 8));
+ UnalignedCopy128(ip, op);
op_ptr_ = op + length;
return true;
} else {
@@ -1409,16 +1371,14 @@ class SnappyScatteredWriter {
}
inline bool AppendFromSelf(size_t offset, size_t len) {
+ char* const op_end = op_ptr_ + len;
// See SnappyArrayWriter::AppendFromSelf for an explanation of
// the "offset - 1u" trick.
- if (offset - 1u < op_ptr_ - op_base_) {
- const size_t space_left = op_limit_ - op_ptr_;
- if (space_left >= len + kMaxIncrementCopyOverflow) {
- // Fast path: src and dst in current block.
- IncrementalCopyFastPath(op_ptr_ - offset, op_ptr_, len);
- op_ptr_ += len;
- return true;
- }
+ if (SNAPPY_PREDICT_TRUE(offset - 1u < op_ptr_ - op_base_ &&
+ op_end <= op_limit_)) {
+ // Fast path: src and dst in current block.
+ op_ptr_ = IncrementalCopy(op_ptr_ - offset, op_ptr_, op_end, op_limit_);
+ return true;
}
return SlowAppendFromSelf(offset, len);
}
@@ -1446,7 +1406,7 @@ bool SnappyScatteredWriter<Allocator>::SlowAppend(const char* ip, size_t len) {
}
// Make new block
- size_t bsize = min<size_t>(kBlockSize, expected_ - full_size_);
+ size_t bsize = std::min<size_t>(kBlockSize, expected_ - full_size_);
op_base_ = allocator_.Allocate(bsize);
op_ptr_ = op_base_;
op_limit_ = op_base_ + bsize;
@@ -1503,7 +1463,7 @@ class SnappySinkAllocator {
size_t size_written = 0;
size_t block_size;
for (int i = 0; i < blocks_.size(); ++i) {
- block_size = min<size_t>(blocks_[i].size, size - size_written);
+ block_size = std::min<size_t>(blocks_[i].size, size - size_written);
dest_->AppendAndTakeOwnership(blocks_[i].data, block_size,
&SnappySinkAllocator::Deleter, NULL);
size_written += block_size;
@@ -1523,7 +1483,7 @@ class SnappySinkAllocator {
}
Sink* dest_;
- vector<Datablock> blocks_;
+ std::vector<Datablock> blocks_;
// Note: copying this object is allowed
};
@@ -1548,18 +1508,20 @@ bool Uncompress(Source* compressed, Sink* uncompressed) {
char* buf = uncompressed->GetAppendBufferVariable(
1, uncompressed_len, &c, 1, &allocated_size);
+ const size_t compressed_len = compressed->Available();
// If we can get a flat buffer, then use it, otherwise do block by block
// uncompression
if (allocated_size >= uncompressed_len) {
SnappyArrayWriter writer(buf);
- bool result = InternalUncompressAllTags(
- &decompressor, &writer, uncompressed_len);
+ bool result = InternalUncompressAllTags(&decompressor, &writer,
+ compressed_len, uncompressed_len);
uncompressed->Append(buf, writer.Produced());
return result;
} else {
SnappySinkAllocator allocator(uncompressed);
SnappyScatteredWriter<SnappySinkAllocator> writer(allocator);
- return InternalUncompressAllTags(&decompressor, &writer, uncompressed_len);
+ return InternalUncompressAllTags(&decompressor, &writer, compressed_len,
+ uncompressed_len);
}
}
diff --git a/src/third_party/snappy-1.1.3/snappy.h b/src/third_party/snappy-1.1.7/snappy.h
index 4568db890d6..4568db890d6 100644
--- a/src/third_party/snappy-1.1.3/snappy.h
+++ b/src/third_party/snappy-1.1.7/snappy.h
diff --git a/src/third_party/snappy-1.1.3/snappy_unittest.cc b/src/third_party/snappy-1.1.7/snappy_unittest.cc
index 4a80f2ad6d4..fcb3261d20a 100644
--- a/src/third_party/snappy-1.1.3/snappy_unittest.cc
+++ b/src/third_party/snappy-1.1.7/snappy_unittest.cc
@@ -32,6 +32,7 @@
#include <algorithm>
#include <string>
+#include <utility>
#include <vector>
#include "snappy.h"
@@ -50,13 +51,6 @@ DEFINE_bool(zlib, false,
"Run zlib compression (http://www.zlib.net)");
DEFINE_bool(lzo, false,
"Run LZO compression (http://www.oberhumer.com/opensource/lzo/)");
-DEFINE_bool(quicklz, false,
- "Run quickLZ compression (http://www.quicklz.com/)");
-DEFINE_bool(liblzf, false,
- "Run libLZF compression "
- "(http://www.goof.com/pcg/marc/liblzf.html)");
-DEFINE_bool(fastlz, false,
- "Run FastLZ compression (http://www.fastlz.org/");
DEFINE_bool(snappy, true, "Run snappy compression");
DEFINE_bool(write_compressed, false,
@@ -64,10 +58,12 @@ DEFINE_bool(write_compressed, false,
DEFINE_bool(write_uncompressed, false,
"Write uncompressed versions of each file to <file>.uncomp");
-namespace snappy {
+DEFINE_bool(snappy_dump_decompression_table, false,
+ "If true, we print the decompression table during tests.");
+namespace snappy {
-#ifdef HAVE_FUNC_MMAP
+#if defined(HAVE_FUNC_MMAP) && defined(HAVE_FUNC_SYSCONF)
// To test against code that reads beyond its input, this class copies a
// string to a newly allocated group of pages, the last of which
@@ -78,7 +74,7 @@ namespace snappy {
class DataEndingAtUnreadablePage {
public:
explicit DataEndingAtUnreadablePage(const string& s) {
- const size_t page_size = getpagesize();
+ const size_t page_size = sysconf(_SC_PAGESIZE);
const size_t size = s.size();
// Round up space for string to a multiple of page_size.
size_t space_for_string = (size + page_size - 1) & ~(page_size - 1);
@@ -96,8 +92,9 @@ class DataEndingAtUnreadablePage {
}
~DataEndingAtUnreadablePage() {
+ const size_t page_size = sysconf(_SC_PAGESIZE);
// Undo the mprotect.
- CHECK_EQ(0, mprotect(protected_page_, getpagesize(), PROT_READ|PROT_WRITE));
+ CHECK_EQ(0, mprotect(protected_page_, page_size, PROT_READ|PROT_WRITE));
CHECK_EQ(0, munmap(mem_, alloc_size_));
}
@@ -112,7 +109,7 @@ class DataEndingAtUnreadablePage {
size_t size_;
};
-#else // HAVE_FUNC_MMAP
+#else // defined(HAVE_FUNC_MMAP) && defined(HAVE_FUNC_SYSCONF)
// Fallback for systems without mmap.
typedef string DataEndingAtUnreadablePage;
@@ -120,11 +117,11 @@ typedef string DataEndingAtUnreadablePage;
#endif
enum CompressorType {
- ZLIB, LZO, LIBLZF, QUICKLZ, FASTLZ, SNAPPY
+ ZLIB, LZO, SNAPPY
};
const char* names[] = {
- "ZLIB", "LZO", "LIBLZF", "QUICKLZ", "FASTLZ", "SNAPPY"
+ "ZLIB", "LZO", "SNAPPY"
};
static size_t MinimumRequiredOutputSpace(size_t input_size,
@@ -140,21 +137,6 @@ static size_t MinimumRequiredOutputSpace(size_t input_size,
return input_size + input_size/64 + 16 + 3;
#endif // LZO_VERSION
-#ifdef LZF_VERSION
- case LIBLZF:
- return input_size;
-#endif // LZF_VERSION
-
-#ifdef QLZ_VERSION_MAJOR
- case QUICKLZ:
- return input_size + 36000; // 36000 is used for scratch.
-#endif // QLZ_VERSION_MAJOR
-
-#ifdef FASTLZ_VERSION
- case FASTLZ:
- return max(static_cast<int>(ceil(input_size * 1.05)), 66);
-#endif // FASTLZ_VERSION
-
case SNAPPY:
return snappy::MaxCompressedLength(input_size);
@@ -214,58 +196,6 @@ static bool Compress(const char* input, size_t input_size, CompressorType comp,
}
#endif // LZO_VERSION
-#ifdef LZF_VERSION
- case LIBLZF: {
- int destlen = lzf_compress(input,
- input_size,
- string_as_array(compressed),
- input_size);
- if (destlen == 0) {
- // lzf *can* cause lots of blowup when compressing, so they
- // recommend to limit outsize to insize, and just not compress
- // if it's bigger. Ideally, we'd just swap input and output.
- compressed->assign(input, input_size);
- destlen = input_size;
- }
- if (!compressed_is_preallocated) {
- compressed->resize(destlen);
- }
- break;
- }
-#endif // LZF_VERSION
-
-#ifdef QLZ_VERSION_MAJOR
- case QUICKLZ: {
- qlz_state_compress *state_compress = new qlz_state_compress;
- int destlen = qlz_compress(input,
- string_as_array(compressed),
- input_size,
- state_compress);
- delete state_compress;
- CHECK_NE(0, destlen);
- if (!compressed_is_preallocated) {
- compressed->resize(destlen);
- }
- break;
- }
-#endif // QLZ_VERSION_MAJOR
-
-#ifdef FASTLZ_VERSION
- case FASTLZ: {
- // Use level 1 compression since we mostly care about speed.
- int destlen = fastlz_compress_level(
- 1,
- input,
- input_size,
- string_as_array(compressed));
- if (!compressed_is_preallocated) {
- compressed->resize(destlen);
- }
- CHECK_NE(destlen, 0);
- break;
- }
-#endif // FASTLZ_VERSION
-
case SNAPPY: {
size_t destlen;
snappy::RawCompress(input, input_size,
@@ -320,49 +250,6 @@ static bool Uncompress(const string& compressed, CompressorType comp,
}
#endif // LZO_VERSION
-#ifdef LZF_VERSION
- case LIBLZF: {
- output->resize(size);
- int destlen = lzf_decompress(compressed.data(),
- compressed.size(),
- string_as_array(output),
- output->size());
- if (destlen == 0) {
- // This error probably means we had decided not to compress,
- // and thus have stored input in output directly.
- output->assign(compressed.data(), compressed.size());
- destlen = compressed.size();
- }
- CHECK_EQ(destlen, size);
- break;
- }
-#endif // LZF_VERSION
-
-#ifdef QLZ_VERSION_MAJOR
- case QUICKLZ: {
- output->resize(size);
- qlz_state_decompress *state_decompress = new qlz_state_decompress;
- int destlen = qlz_decompress(compressed.data(),
- string_as_array(output),
- state_decompress);
- delete state_decompress;
- CHECK_EQ(destlen, size);
- break;
- }
-#endif // QLZ_VERSION_MAJOR
-
-#ifdef FASTLZ_VERSION
- case FASTLZ: {
- output->resize(size);
- int destlen = fastlz_decompress(compressed.data(),
- compressed.length(),
- string_as_array(output),
- size);
- CHECK_EQ(destlen, size);
- break;
- }
-#endif // FASTLZ_VERSION
-
case SNAPPY: {
snappy::RawUncompress(compressed.data(), compressed.size(),
string_as_array(output));
@@ -390,13 +277,13 @@ static void Measure(const char* data,
{
// Chop the input into blocks
int num_blocks = (length + block_size - 1) / block_size;
- vector<const char*> input(num_blocks);
- vector<size_t> input_length(num_blocks);
- vector<string> compressed(num_blocks);
- vector<string> output(num_blocks);
+ std::vector<const char*> input(num_blocks);
+ std::vector<size_t> input_length(num_blocks);
+ std::vector<string> compressed(num_blocks);
+ std::vector<string> output(num_blocks);
for (int b = 0; b < num_blocks; b++) {
int input_start = b * block_size;
- int input_limit = min<int>((b+1)*block_size, length);
+ int input_limit = std::min<int>((b+1)*block_size, length);
input[b] = data+input_start;
input_length[b] = input_limit-input_start;
@@ -451,8 +338,8 @@ static void Measure(const char* data,
}
}
- sort(ctime, ctime + kRuns);
- sort(utime, utime + kRuns);
+ std::sort(ctime, ctime + kRuns);
+ std::sort(utime, utime + kRuns);
const int med = kRuns/2;
float comp_rate = (length / ctime[med]) * repeats / 1048576.0;
@@ -467,7 +354,7 @@ static void Measure(const char* data,
x.c_str(),
block_size/(1<<20),
static_cast<int>(length), static_cast<uint32>(compressed_size),
- (compressed_size * 100.0) / max<int>(1, length),
+ (compressed_size * 100.0) / std::max<int>(1, length),
comp_rate,
urate.c_str());
}
@@ -1004,6 +891,20 @@ TEST(SnappyCorruption, UnterminatedVarint) {
&uncompressed));
}
+TEST(SnappyCorruption, OverflowingVarint) {
+ string compressed, uncompressed;
+ size_t ulength;
+ compressed.push_back('\xfb');
+ compressed.push_back('\xff');
+ compressed.push_back('\xff');
+ compressed.push_back('\xff');
+ compressed.push_back('\x7f');
+ CHECK(!CheckUncompressedLength(compressed, &ulength));
+ CHECK(!snappy::IsValidCompressedBuffer(compressed.data(), compressed.size()));
+ CHECK(!snappy::Uncompress(compressed.data(), compressed.size(),
+ &uncompressed));
+}
+
TEST(Snappy, ReadPastEndOfBuffer) {
// Check that we do not read past end of input
@@ -1037,7 +938,10 @@ TEST(Snappy, ZeroOffsetCopyValidation) {
namespace {
int TestFindMatchLength(const char* s1, const char *s2, unsigned length) {
- return snappy::internal::FindMatchLength(s1, s2, s2 + length);
+ std::pair<size_t, bool> p =
+ snappy::internal::FindMatchLength(s1, s2, s2 + length);
+ CHECK_EQ(p.first < 8, p.second);
+ return p.first;
}
} // namespace
@@ -1147,8 +1051,7 @@ TEST(Snappy, FindMatchLengthRandom) {
}
DataEndingAtUnreadablePage u(s);
DataEndingAtUnreadablePage v(t);
- int matched = snappy::internal::FindMatchLength(
- u.data(), v.data(), v.data() + t.size());
+ int matched = TestFindMatchLength(u.data(), v.data(), t.size());
if (matched == t.size()) {
EXPECT_EQ(s, t);
} else {
@@ -1160,6 +1063,99 @@ TEST(Snappy, FindMatchLengthRandom) {
}
}
+static uint16 MakeEntry(unsigned int extra,
+ unsigned int len,
+ unsigned int copy_offset) {
+ // Check that all of the fields fit within the allocated space
+ assert(extra == (extra & 0x7)); // At most 3 bits
+ assert(copy_offset == (copy_offset & 0x7)); // At most 3 bits
+ assert(len == (len & 0x7f)); // At most 7 bits
+ return len | (copy_offset << 8) | (extra << 11);
+}
+
+// Check that the decompression table is correct, and optionally print out
+// the computed one.
+TEST(Snappy, VerifyCharTable) {
+ using snappy::internal::LITERAL;
+ using snappy::internal::COPY_1_BYTE_OFFSET;
+ using snappy::internal::COPY_2_BYTE_OFFSET;
+ using snappy::internal::COPY_4_BYTE_OFFSET;
+ using snappy::internal::char_table;
+
+ uint16 dst[256];
+
+ // Place invalid entries in all places to detect missing initialization
+ int assigned = 0;
+ for (int i = 0; i < 256; i++) {
+ dst[i] = 0xffff;
+ }
+
+ // Small LITERAL entries. We store (len-1) in the top 6 bits.
+ for (unsigned int len = 1; len <= 60; len++) {
+ dst[LITERAL | ((len-1) << 2)] = MakeEntry(0, len, 0);
+ assigned++;
+ }
+
+ // Large LITERAL entries. We use 60..63 in the high 6 bits to
+ // encode the number of bytes of length info that follow the opcode.
+ for (unsigned int extra_bytes = 1; extra_bytes <= 4; extra_bytes++) {
+ // We set the length field in the lookup table to 1 because extra
+ // bytes encode len-1.
+ dst[LITERAL | ((extra_bytes+59) << 2)] = MakeEntry(extra_bytes, 1, 0);
+ assigned++;
+ }
+
+ // COPY_1_BYTE_OFFSET.
+ //
+ // The tag byte in the compressed data stores len-4 in 3 bits, and
+ // offset/256 in 5 bits. offset%256 is stored in the next byte.
+ //
+ // This format is used for length in range [4..11] and offset in
+ // range [0..2047]
+ for (unsigned int len = 4; len < 12; len++) {
+ for (unsigned int offset = 0; offset < 2048; offset += 256) {
+ dst[COPY_1_BYTE_OFFSET | ((len-4)<<2) | ((offset>>8)<<5)] =
+ MakeEntry(1, len, offset>>8);
+ assigned++;
+ }
+ }
+
+ // COPY_2_BYTE_OFFSET.
+ // Tag contains len-1 in top 6 bits, and offset in next two bytes.
+ for (unsigned int len = 1; len <= 64; len++) {
+ dst[COPY_2_BYTE_OFFSET | ((len-1)<<2)] = MakeEntry(2, len, 0);
+ assigned++;
+ }
+
+ // COPY_4_BYTE_OFFSET.
+ // Tag contents len-1 in top 6 bits, and offset in next four bytes.
+ for (unsigned int len = 1; len <= 64; len++) {
+ dst[COPY_4_BYTE_OFFSET | ((len-1)<<2)] = MakeEntry(4, len, 0);
+ assigned++;
+ }
+
+ // Check that each entry was initialized exactly once.
+ EXPECT_EQ(256, assigned) << "Assigned only " << assigned << " of 256";
+ for (int i = 0; i < 256; i++) {
+ EXPECT_NE(0xffff, dst[i]) << "Did not assign byte " << i;
+ }
+
+ if (FLAGS_snappy_dump_decompression_table) {
+ printf("static const uint16 char_table[256] = {\n ");
+ for (int i = 0; i < 256; i++) {
+ printf("0x%04x%s",
+ dst[i],
+ ((i == 255) ? "\n" : (((i%8) == 7) ? ",\n " : ", ")));
+ }
+ printf("};\n");
+ }
+
+ // Check that computed table matched recorded table.
+ for (int i = 0; i < 256; i++) {
+ EXPECT_EQ(dst[i], char_table[i]) << "Mismatch in byte " << i;
+ }
+}
+
static void CompressFile(const char* fname) {
string fullinput;
CHECK_OK(file::GetContents(fname, &fullinput, file::Defaults()));
@@ -1194,16 +1190,13 @@ static void MeasureFile(const char* fname) {
int start_len = (FLAGS_start_len < 0) ? fullinput.size() : FLAGS_start_len;
int end_len = fullinput.size();
if (FLAGS_end_len >= 0) {
- end_len = min<int>(fullinput.size(), FLAGS_end_len);
+ end_len = std::min<int>(fullinput.size(), FLAGS_end_len);
}
for (int len = start_len; len <= end_len; len++) {
const char* const input = fullinput.data();
int repeats = (FLAGS_bytes + len) / (len + 1);
if (FLAGS_zlib) Measure(input, len, ZLIB, repeats, 1024<<10);
if (FLAGS_lzo) Measure(input, len, LZO, repeats, 1024<<10);
- if (FLAGS_liblzf) Measure(input, len, LIBLZF, repeats, 1024<<10);
- if (FLAGS_quicklz) Measure(input, len, QUICKLZ, repeats, 1024<<10);
- if (FLAGS_fastlz) Measure(input, len, FASTLZ, repeats, 1024<<10);
if (FLAGS_snappy) Measure(input, len, SNAPPY, repeats, 4096<<10);
// For block-size based measurements
@@ -1396,7 +1389,6 @@ BENCHMARK(BM_ZFlat)->DenseRange(0, ARRAYSIZE(files) - 1);
} // namespace snappy
-
int main(int argc, char** argv) {
InitGoogle(argv[0], &argc, &argv, true);
RunSpecifiedBenchmarks();
@@ -1404,11 +1396,11 @@ int main(int argc, char** argv) {
if (argc >= 2) {
for (int arg = 1; arg < argc; arg++) {
if (FLAGS_write_compressed) {
- CompressFile(argv[arg]);
+ snappy::CompressFile(argv[arg]);
} else if (FLAGS_write_uncompressed) {
- UncompressFile(argv[arg]);
+ snappy::UncompressFile(argv[arg]);
} else {
- MeasureFile(argv[arg]);
+ snappy::MeasureFile(argv[arg]);
}
}
return 0;