diff --git a/README.md b/README.md index 56b3b5f..b59719a 100644 --- a/README.md +++ b/README.md @@ -78,6 +78,15 @@ BenchmarkHash32K-12 232.87 911.85 3.92x BenchmarkHash128K-12 233.37 918.93 3.94x ``` +### AVX2: Comparison to other hashing techniques + +$ go test -bench=Comparison +BenchmarkComparisonMD5-12 1000 1726121 ns/op 607.48 MB/s +BenchmarkComparisonSHA1-12 500 2005164 ns/op 522.94 MB/s +BenchmarkComparisonSHA256-12 300 5531036 ns/op 189.58 MB/s +BenchmarkComparisonSHA512-12 500 3423030 ns/op 306.33 MB/s +BenchmarkComparisonBlake2B-12 1000 1232690 ns/op 850.64 MB/s + Benchmarks below were generated on a MacBook Pro with a 2.7 GHz Intel Core i7. ### AVX diff --git a/benchmarks_test.go b/benchmarks_test.go new file mode 100644 index 0000000..bb1f7e4 --- /dev/null +++ b/benchmarks_test.go @@ -0,0 +1,101 @@ +/* + * Minio Cloud Storage, (C) 2016 Minio, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package blake2b + +import ( + "crypto/md5" + "crypto/sha1" + "crypto/sha256" + "crypto/sha512" + "hash" + "testing" +) + +func benchmarkHash(b *testing.B, hash func() hash.Hash) { + b.SetBytes(1024 * 1024) + data := make([]byte, 1024) + for i := 0; i < b.N; i++ { + h := hash() + for j := 0; j < 1024; j++ { + h.Write(data) + } + h.Sum(nil) + } +} + +func BenchmarkComparisonMD5(b *testing.B) { + benchmarkHash(b, md5.New) +} + +func BenchmarkComparisonSHA1(b *testing.B) { + benchmarkHash(b, sha1.New) +} + +func BenchmarkComparisonSHA256(b *testing.B) { + benchmarkHash(b, sha256.New) +} + +func BenchmarkComparisonSHA512(b *testing.B) { + benchmarkHash(b, sha512.New) +} + +func BenchmarkComparisonBlake2B(b *testing.B) { + benchmarkHash(b, New512) +} + +// Benchmark blake2b implementation. +var bench = New512() +var buf = make([]byte, 128*1024) + +func benchmarkSize(b *testing.B, size int) { + b.SetBytes(int64(size)) + for i := 0; i < b.N; i++ { + bench.Reset() + bench.Write(buf[:size]) + bench.Sum(nil) + } +} + +// Benchmark writes of 64 bytes. +func BenchmarkSize64(b *testing.B) { + benchmarkSize(b, 64) +} + +// Benchmark writes of 128 bytes. +func BenchmarkSize128(b *testing.B) { + benchmarkSize(b, 128) +} + +// Benchmark writes of 1KiB bytes. +func BenchmarkSize1K(b *testing.B) { + benchmarkSize(b, 1024) +} + +// Benchmark writes of 8KiB bytes. +func BenchmarkSize8K(b *testing.B) { + benchmarkSize(b, 8*1024) +} + +// Benchmark writes of 32KiB bytes. +func BenchmarkSize32K(b *testing.B) { + benchmarkSize(b, 32*1024) +} + +// Benchmark writes of 128KiB bytes. +func BenchmarkSize128K(b *testing.B) { + benchmarkSize(b, 128*1024) +} diff --git a/blake2b_test.go b/blake2b_test.go index 5ec56fa..63ce6d3 100644 --- a/blake2b_test.go +++ b/blake2b_test.go @@ -596,46 +596,3 @@ var goldenKeyed = []string{ "d444bfa2362a96df213d070e33fa841f51334e4e76866b8139e8af3bb3398be2dfaddcbc56b9146de9f68118dc5829e74b0c28d7711907b121f9161cb92b69a9", "142709d62e28fcccd0af97fad0f8465b971e82201dc51070faa0372aa43e92484be1c1e73ba10906d5d1853db6a4106e0a7bf9800d373d6dee2d46d62ef2a461", } - -// Benchmark blake2b implementation. -var bench = New512() -var buf = make([]byte, 128*1024) - -func benchmarkSize(b *testing.B, size int) { - b.SetBytes(int64(size)) - for i := 0; i < b.N; i++ { - bench.Reset() - bench.Write(buf[:size]) - bench.Sum(nil) - } -} - -// Benchmark writes of 64 bytes. -func BenchmarkHash64(b *testing.B) { - benchmarkSize(b, 64) -} - -// Benchmark writes of 128 bytes. -func BenchmarkHash128(b *testing.B) { - benchmarkSize(b, 128) -} - -// Benchmark writes of 1KiB bytes. -func BenchmarkHash1K(b *testing.B) { - benchmarkSize(b, 1024) -} - -// Benchmark writes of 8KiB bytes. -func BenchmarkHash8K(b *testing.B) { - benchmarkSize(b, 8*1024) -} - -// Benchmark writes of 32KiB bytes. -func BenchmarkHash32K(b *testing.B) { - benchmarkSize(b, 32*1024) -} - -// Benchmark writes of 128KiB bytes. -func BenchmarkHash128K(b *testing.B) { - benchmarkSize(b, 128*1024) -}