From 052395f917fe55cfa2e1ab5c42539ed3c07df5bc Mon Sep 17 00:00:00 2001 From: James Houlahan Date: Wed, 4 Nov 2020 14:58:45 +0100 Subject: [PATCH] test: add benchmarks for rfc5322 address/date parser --- pkg/message/rfc5322/benchmark_test.go | 157 ++++++++++++++++++++++++++ 1 file changed, 157 insertions(+) create mode 100644 pkg/message/rfc5322/benchmark_test.go diff --git a/pkg/message/rfc5322/benchmark_test.go b/pkg/message/rfc5322/benchmark_test.go new file mode 100644 index 00000000..ad075c8e --- /dev/null +++ b/pkg/message/rfc5322/benchmark_test.go @@ -0,0 +1,157 @@ +// Copyright (c) 2020 Proton Technologies AG +// +// This file is part of ProtonMail Bridge. +// +// ProtonMail Bridge is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ProtonMail Bridge is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with ProtonMail Bridge. If not, see . + +package rfc5322 + +import ( + "net/mail" + "testing" +) + +func BenchmarkStandardSet(b *testing.B) { + for i := 0; i < b.N; i++ { + parseSet(benchStandardSet) + } +} + +func BenchmarkStandardSetGolang(b *testing.B) { + for i := 0; i < b.N; i++ { + parseSetGolang(benchStandardSet) + } +} + +func BenchmarkEncodedSet(b *testing.B) { + for i := 0; i < b.N; i++ { + parseSet(benchEncodedSet) + } +} + +func BenchmarkEncodedSetGolang(b *testing.B) { + for i := 0; i < b.N; i++ { + parseSetGolang(benchEncodedSet) + } +} + +func BenchmarkAddressListSet(b *testing.B) { + for i := 0; i < b.N; i++ { + parseSet(benchAddressListSet) + } +} + +func BenchmarkAddressListSetGolang(b *testing.B) { + for i := 0; i < b.N; i++ { + parseSetGolang(benchAddressListSet) + } +} + +func BenchmarkGroupSet(b *testing.B) { + for i := 0; i < b.N; i++ { + parseSet(benchGroupSet) + } +} + +func BenchmarkGroupSetGolang(b *testing.B) { + for i := 0; i < b.N; i++ { + parseSetGolang(benchGroupSet) + } +} + +func parseSet(set []string) { + for _, addr := range set { + _, _ = ParseAddressList(addr) + } +} + +func parseSetGolang(set []string) { + for _, addr := range set { + _, _ = mail.ParseAddressList(addr) + } +} + +var benchStandardSet = []string{ + `user@example.com`, + `John Doe `, + `Mary Smith `, + `"Joe Q. Public" `, + `Mary Smith `, + `jdoe@example.org`, + `Who? `, + ``, + `"Giant; \"Big\" Box" `, + `Pete `, + `"Mary Smith: Personal Account" `, + `Pete(A nice \) chap) `, + `Gogh Fir `, + `normal name `, + `"comma, name" `, + `name (ignore comment)`, + `"Mail Robot" <>`, + `Michal Hořejšek `, + `First Last `, + `First Last `, + `First Last `, + `First Last `, + `First Last `, + ``, + `user@domain `, + `First Last < user@domain.com>`, + `First Middle @ Last `, + `user@domain.com,`, + `First Middle "Last" `, + `First Middle Last `, + `First Middle"Last" `, + `First Middle "Last"`, + `First "Middle" "Last" `, + `First "Middle""Last" `, +} + +var benchEncodedSet = []string{ + `=?US-ASCII?Q?Keith_Moore?= `, + `=?ISO-8859-1?Q?Keld_J=F8rn_Simonsen?= `, + `=?ISO-8859-1?Q?Andr=E9?= Pirard `, + `=?ISO-8859-1?Q?Olle_J=E4rnefors?= `, + `=?ISO-8859-1?Q?Patrik_F=E4ltstr=F6m?= `, + `Nathaniel Borenstein (=?iso-8859-8?b?7eXs+SDv4SDp7Oj08A==?=)`, + `=?UTF-8?B?PEJlemUgam3DqW5hPg==?= `, + `First Middle =?utf-8?Q?Last?= `, + `First Middle =?utf-8?Q?Last?=`, + `First =?utf-8?Q?Middle?= =?utf-8?Q?Last?= `, + `First =?utf-8?Q?Middle?==?utf-8?Q?Last?= `, + `First "Middle"=?utf-8?Q?Last?= `, + `First "Middle" =?utf-8?Q?Last?= `, + `First "Middle" =?utf-8?Q?Last?=`, + `=?UTF-8?B?PEJlemUgam3DqW5hPg==?= `, + `=?utf-8?B?6YCZ5piv5ryi5a2X55qE5LiA5YCL5L6L5a2Q?= `, + `=?utf-8?B?8J+MmfCfjbc=?= `, + `=?utf-8?B?8J+MmfCfjbc=?= `, +} + +var benchAddressListSet = []string{ + `Alice , Bob , Eve `, + `Ed Jones ,joe@where.test,John `, + `name (ignore comment) , (Comment as name) username2@server.com`, + `"normal name" , "comma, name" `, + `"comma, one" , "comma, two" `, + `normal name , (comment)All.(around)address@(the)server.com`, + `normal name , All.("comma, in comment")address@(the)server.com`, +} + +var benchGroupSet = []string{ + `A Group:Ed Jones ,joe@where.test,John ;`, + `Undisclosed recipients:;`, + `(Empty list)(start)Hidden recipients :(nobody(that I know)) ;`, +}