To demonstrate the need for the core.enableSHA1DC knob, this test compares the performance of the SHA-1 algorithms with collision detection vs OpenSSL's (that does not detect attempted collision attacks). The payload size of 300MB was actually not concocted from thin air, but is based on the massive Windows monorepo, whose index file weighs in with roughly that size (and which is SHA-1'ed upon every single read and write). On this developer's machine, this comparison shows a hefty difference: 0013.1: calculate SHA-1 for 300MB (SHA1DC) 3.03(0.03+0.17) 0013.2: calculate SHA-1 for 300MB (OpenSSL) 0.58(0.06+0.16) It is not only that ~6x slower performance is a pretty tall order, the absolute numbers themselves speak a very clear language: having to wait one second every time a file is `git add`ed is noticeable, but one can handwave it away. Having to wait six seconds (3 to read the index, a fraction of a millisecond to hash the new contents and update the in-memory index, then 3 seconds to write out the index) is outright annoying. And unnecessary, too: the content of the index is never crafted to cause SHA-1 collisions. Obviously, this test requires that Git was built with the new DC_AND_OPENSSL_SHA1 make flag; it is skipped otherwise. Signed-off-by: Johannes Schindelin <johannes.schindelin@xxxxxx> --- t/perf/p0013-sha1dc.sh | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 t/perf/p0013-sha1dc.sh diff --git a/t/perf/p0013-sha1dc.sh b/t/perf/p0013-sha1dc.sh new file mode 100644 index 00000000000..e08473ac969 --- /dev/null +++ b/t/perf/p0013-sha1dc.sh @@ -0,0 +1,23 @@ +#!/bin/sh + +test_description="Tests performance of SHA1DC vs OpenSSL" + +. ./perf-lib.sh + +test -n "$DC_AND_OPENSSL_SHA1" || { + skip_all='DC_AND_OPENSSL_SHA1 required for this test' + test_done +} + +test_perf 'calculate SHA-1 for 300MB (SHA1DC)' ' + dd if=/dev/zero bs=1M count=300 | + test-sha1 +' + +test_perf 'calculate SHA-1 for 300MB (OpenSSL)' ' + dd if=/dev/zero bs=1M count=300 | + test-sha1 --disable-sha1dc +' + +test_done + -- 2.12.1.windows.1