-
-
Notifications
You must be signed in to change notification settings - Fork 183
/
main_test.go
110 lines (89 loc) · 2.33 KB
/
main_test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
package main
import (
"strings"
"testing"
"time"
require "github.com/alecthomas/assert/v2"
thriftparser "github.com/alecthomas/go-thrift/parser"
"github.com/alecthomas/participle/v2"
)
var (
source = strings.TrimSpace(`
namespace cpp thrift.example
namespace java thrift.example
enum TweetType {
TWEET
RETWEET = 2
DM = 3
REPLY
}
struct Location {
1: required double latitude
2: required double longitude
}
struct Tweet {
1: required i32 userId
2: required string userName
3: required string text
4: optional Location loc
5: optional TweetType tweetType = TweetType.TWEET
16: optional string language = "english"
}
typedef list<Tweet> TweetList
struct TweetSearchResult {
1: TweetList tweets
}
exception TwitterUnavailable {
1: string message
}
const i32 MAX_RESULTS = 100
service Twitter {
void ping()
bool postTweet(1:Tweet tweet) throws (1:TwitterUnavailable unavailable)
TweetSearchResult searchTweets(1:string query)
void zip()
}
`)
)
func BenchmarkParticipleThrift(b *testing.B) {
thrift := &Thrift{}
err := parser.ParseString("", source, thrift)
require.NoError(b, err)
b.ResetTimer()
b.ReportAllocs()
start := time.Now()
for i := 0; i < b.N; i++ {
thrift := &Thrift{}
_ = parser.ParseString("", source, thrift)
}
b.ReportMetric(float64(len(source)*b.N)*float64(time.Since(start)/time.Second)/1024/1024, "MiB/s")
}
func BenchmarkParticipleThriftGenerated(b *testing.B) {
parser := participle.MustBuild(&Thrift{},
participle.Lexer(Lexer),
participle.Unquote(),
participle.Elide("Whitespace"),
)
thrift := &Thrift{}
err := parser.ParseString("", source, thrift)
require.NoError(b, err)
b.ResetTimer()
b.ReportAllocs()
start := time.Now()
for i := 0; i < b.N; i++ {
thrift := &Thrift{}
_ = parser.ParseString("", source, thrift)
}
b.ReportMetric(float64(len(source)*b.N)*float64(time.Since(start)/time.Second)/1024/1024, "MiB/s")
}
func BenchmarkGoThriftParser(b *testing.B) {
_, err := thriftparser.ParseReader("user.thrift", strings.NewReader(source))
require.NoError(b, err)
b.ResetTimer()
b.ReportAllocs()
start := time.Now()
for i := 0; i < b.N; i++ {
_, _ = thriftparser.ParseReader("user.thrift", strings.NewReader(source))
}
b.ReportMetric(float64(len(source)*b.N)*float64(time.Since(start)/time.Second)/1024/1024, "MiB/s")
}