Lexer benchmarks
This commit is contained in:
		
							parent
							
								
									a8137d5b87
								
							
						
					
					
						commit
						93023774d2
					
				
							
								
								
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,2 @@ | |||||||
|  | main | ||||||
|  | big*.json | ||||||
| @ -1,62 +1,84 @@ | |||||||
| package lexer | package lexer | ||||||
| 
 | 
 | ||||||
| import ( | import ( | ||||||
|  | 	"encoding/json" | ||||||
|  | 	"io/ioutil" | ||||||
|  | 	"os" | ||||||
| 	"runtime" | 	"runtime" | ||||||
| 	"testing" | 	"testing" | ||||||
| 
 | 
 | ||||||
| 	"github.com/localhots/punk/buffer" | 	"github.com/localhots/punk/buffer" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
|  | func BenchmarkRun(t *testing.B) { | ||||||
|  | 	f, _ := os.Open("big1.json") | ||||||
|  | 	b, _ := ioutil.ReadAll(f) | ||||||
|  | 	t.ReportAllocs() | ||||||
|  | 	for i := 0; i < t.N; i++ { | ||||||
|  | 		lex(b) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func BenchmarkStandardJSON(t *testing.B) { | ||||||
|  | 	f, _ := os.Open("big1.json") | ||||||
|  | 	b, _ := ioutil.ReadAll(f) | ||||||
|  | 	t.ReportAllocs() | ||||||
|  | 	for i := 0; i < t.N; i++ { | ||||||
|  | 		var res interface{} | ||||||
|  | 		json.Unmarshal(b, &res) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
| func TestEmpty(t *testing.T) { | func TestEmpty(t *testing.T) { | ||||||
| 	compare(t, lex(""), []Item{ | 	compare(t, lex([]byte("")), []Item{ | ||||||
| 		{EOF, "\x00", 0, 0}, | 		{EOF, "\x00", 0, 0}, | ||||||
| 	}) | 	}) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func TestNull(t *testing.T) { | func TestNull(t *testing.T) { | ||||||
| 	compare(t, lex("null"), []Item{ | 	compare(t, lex([]byte("null")), []Item{ | ||||||
| 		{Null, "null", 0, 0}, | 		{Null, "null", 0, 0}, | ||||||
| 		{EOF, "\x00", 0, 0}, | 		{EOF, "\x00", 0, 0}, | ||||||
| 	}) | 	}) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func TesBool(t *testing.T) { | func TesBool(t *testing.T) { | ||||||
| 	compare(t, lex("true"), []Item{ | 	compare(t, lex([]byte("true")), []Item{ | ||||||
| 		{Bool, "true", 0, 0}, | 		{Bool, "true", 0, 0}, | ||||||
| 		{EOF, "\x00", 0, 0}, | 		{EOF, "\x00", 0, 0}, | ||||||
| 	}) | 	}) | ||||||
| 	compare(t, lex("false"), []Item{ | 	compare(t, lex([]byte("false")), []Item{ | ||||||
| 		{Bool, "false", 0, 0}, | 		{Bool, "false", 0, 0}, | ||||||
| 		{EOF, "\x00", 0, 0}, | 		{EOF, "\x00", 0, 0}, | ||||||
| 	}) | 	}) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func TestString(t *testing.T) { | func TestString(t *testing.T) { | ||||||
| 	compare(t, lex(`"foo"`), []Item{ | 	compare(t, lex([]byte(`"foo"`)), []Item{ | ||||||
| 		{String, "foo", 0, 0}, | 		{String, "foo", 0, 0}, | ||||||
| 		{EOF, "\x00", 0, 0}, | 		{EOF, "\x00", 0, 0}, | ||||||
| 	}) | 	}) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func TestNumber(t *testing.T) { | func TestNumber(t *testing.T) { | ||||||
| 	compare(t, lex("123"), []Item{ | 	compare(t, lex([]byte("123")), []Item{ | ||||||
| 		{Number, "123", 0, 0}, | 		{Number, "123", 0, 0}, | ||||||
| 		{EOF, "\x00", 0, 0}, | 		{EOF, "\x00", 0, 0}, | ||||||
| 	}) | 	}) | ||||||
| 	compare(t, lex("123.456"), []Item{ | 	compare(t, lex([]byte("123.456")), []Item{ | ||||||
| 		{Number, "123.456", 0, 0}, | 		{Number, "123.456", 0, 0}, | ||||||
| 		{EOF, "\x00", 0, 0}, | 		{EOF, "\x00", 0, 0}, | ||||||
| 	}) | 	}) | ||||||
| 	compare(t, lex("123.456.789"), []Item{ | 	compare(t, lex([]byte("123.456.789")), []Item{ | ||||||
| 		{Error, `Invalid number: "123.456.789"`, 0, 0}, | 		{Error, `Invalid number: "123.456.789"`, 0, 0}, | ||||||
| 	}) | 	}) | ||||||
| 	compare(t, lex("123."), []Item{ | 	compare(t, lex([]byte("123.")), []Item{ | ||||||
| 		{Error, `Invalid number: "123."`, 0, 0}, | 		{Error, `Invalid number: "123."`, 0, 0}, | ||||||
| 	}) | 	}) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func TestArray(t *testing.T) { | func TestArray(t *testing.T) { | ||||||
| 	compare(t, lex(`[1, "2", 3]`), []Item{ | 	compare(t, lex([]byte(`[1, "2", 3]`)), []Item{ | ||||||
| 		{BracketOpen, "[", 0, 0}, | 		{BracketOpen, "[", 0, 0}, | ||||||
| 		{Number, "1", 0, 0}, | 		{Number, "1", 0, 0}, | ||||||
| 		{Comma, ",", 0, 0}, | 		{Comma, ",", 0, 0}, | ||||||
| @ -69,7 +91,7 @@ func TestArray(t *testing.T) { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func TestObject(t *testing.T) { | func TestObject(t *testing.T) { | ||||||
| 	compare(t, lex(`{"a": 1, "b": 2}`), []Item{ | 	compare(t, lex([]byte(`{"a": 1, "b": 2}`)), []Item{ | ||||||
| 		{BraceOpen, "{", 0, 0}, | 		{BraceOpen, "{", 0, 0}, | ||||||
| 		{String, "a", 0, 0}, | 		{String, "a", 0, 0}, | ||||||
| 		{Colon, ":", 0, 0}, | 		{Colon, ":", 0, 0}, | ||||||
| @ -85,8 +107,7 @@ func TestObject(t *testing.T) { | |||||||
| 
 | 
 | ||||||
| // Yay! | // Yay! | ||||||
| func TestEverything(t *testing.T) { | func TestEverything(t *testing.T) { | ||||||
| 	input := ` | 	input := []byte(`{ | ||||||
| { |  | ||||||
| 	    "foo": true, | 	    "foo": true, | ||||||
| 	    "bar": false, | 	    "bar": false, | ||||||
| 	    "zilch": null, | 	    "zilch": null, | ||||||
| @ -94,8 +115,8 @@ func TestEverything(t *testing.T) { | |||||||
| 	    "bullshit": { | 	    "bullshit": { | ||||||
| 	        "nothing": "anything" | 	        "nothing": "anything" | ||||||
| 	    }! | 	    }! | ||||||
| } | 	}`) | ||||||
| ` | 
 | ||||||
| 	compare(t, lex(input), []Item{ | 	compare(t, lex(input), []Item{ | ||||||
| 		{BraceOpen, "{", 0, 0}, | 		{BraceOpen, "{", 0, 0}, | ||||||
| 		{String, "foo", 0, 0}, | 		{String, "foo", 0, 0}, | ||||||
| @ -152,8 +173,8 @@ func compare(t *testing.T, reality, expectations []Item) { | |||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func lex(jstr string) []Item { | func lex(b []byte) []Item { | ||||||
| 	buf := buffer.NewBytesBuffer([]byte(jstr)) | 	buf := buffer.NewBytesBuffer(b) | ||||||
| 	lex := New(buf) | 	lex := New(buf) | ||||||
| 	go lex.Run() | 	go lex.Run() | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user