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
|
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) {
_, err := parser.ParseString("", source)
require.NoError(b, err)
b.ResetTimer()
b.ReportAllocs()
start := time.Now()
for i := 0; i < b.N; i++ {
_, _ = parser.ParseString("", source)
}
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"),
)
_, err := parser.ParseString("", source)
require.NoError(b, err)
b.ResetTimer()
b.ReportAllocs()
start := time.Now()
for i := 0; i < b.N; i++ {
_, _ = parser.ParseString("", source)
}
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")
}
|