Skip to content

Instantly share code, notes, and snippets.

@danfarino
Created July 28, 2019 01:15
Show Gist options
  • Save danfarino/de0b1be94e5c544cca428bd0160c2cac to your computer and use it in GitHub Desktop.
Save danfarino/de0b1be94e5c544cca428bd0160c2cac to your computer and use it in GitHub Desktop.
#!/bin/bash
set -Eeuo pipefail
cat > with.go <<EOF
package main
import (
"fmt"
"strings"
)
func main() {
splits := strings.Split("a,b,c,d", ",")
n := len(splits)
for i := 1; i < n; i++ {
s := splits[i]
fmt.Printf("%s %d\n", s, n)
}
}
EOF
cat > without.go <<EOF
package main
import (
"fmt"
"strings"
)
func main() {
splits := strings.Split("a,b,c,d", ",")
for i := 1; i < len(splits); i++ {
s := splits[i]
fmt.Printf("%s %d\n", s, len(splits))
}
}
EOF
go build with.go
go build without.go
go tool objdump -S -s main.main with > with.asm
go tool objdump -S -s main.main without > without.asm
git --no-pager diff -w --ws-error-highlight=none --no-index with.asm without.asm
@danfarino
Copy link
Author

Output on my machine:

index 8a08e72..9206a63 100644
--- a/with.asm
+++ b/without.asm
@@ -1,4 +1,4 @@
-TEXT main.main(SB) /tmp/with.go
+TEXT main.main(SB) /tmp/without.go
 func main() {
   0x1095c50		65488b0c2530000000	MOVQ GS:0x30, CX
   0x1095c59		488d4424e8		LEAQ -0x18(SP), AX
@@ -19,19 +19,19 @@ func Split(s, sep string) []string { return genSplit(s, sep, 0, -1) }
   0x1095ca9		48c744242000000000	MOVQ $0x0, 0x20(SP)
   0x1095cb2		48c7442428ffffffff	MOVQ $-0x1, 0x28(SP)
   0x1095cbb		e8a0f3ffff		CALL strings.genSplit(SB)
-  0x1095cc0		488b442430		MOVQ 0x30(SP), AX
-  0x1095cc5		4889442460		MOVQ AX, 0x60(SP)
-  0x1095cca		488b4c2438		MOVQ 0x38(SP), CX
-  0x1095ccf		48894c2450		MOVQ CX, 0x50(SP)
+  0x1095cc0		488b442438		MOVQ 0x38(SP), AX
+  0x1095cc5		4889442450		MOVQ AX, 0x50(SP)
+  0x1095cca		488b4c2430		MOVQ 0x30(SP), CX
+  0x1095ccf		48894c2460		MOVQ CX, 0x60(SP)
   0x1095cd4		ba01000000		MOVL $0x1, DX
-    for i := 1; i < n; i++ {
+    for i := 1; i < len(splits); i++ {
   0x1095cd9		e9db000000		JMP 0x1095db9
   0x1095cde		4889542458		MOVQ DX, 0x58(SP)
         s := splits[i]
   0x1095ce3		48c1e204		SHLQ $0x4, DX
-  0x1095ce7		488b1c10		MOVQ 0(AX)(DX*1), BX
-  0x1095ceb		488b541008		MOVQ 0x8(AX)(DX*1), DX
-        fmt.Printf("%s %d\n", s, n)
+  0x1095ce7		488b1c11		MOVQ 0(CX)(DX*1), BX
+  0x1095ceb		488b541108		MOVQ 0x8(CX)(DX*1), DX
+        fmt.Printf("%s %d\n", s, len(splits))
   0x1095cf0		48891c24		MOVQ BX, 0(SP)
   0x1095cf4		4889542408		MOVQ DX, 0x8(SP)
   0x1095cf9		e8f22ef7ff		CALL runtime.convTstring(SB)
@@ -65,14 +65,14 @@ func Split(s, sep string) []string { return genSplit(s, sep, 0, -1) }
   0x1095d8f		48c744242802000000	MOVQ $0x2, 0x28(SP)
   0x1095d98		48c744243002000000	MOVQ $0x2, 0x30(SP)
   0x1095da1		e8fa6fffff		CALL fmt.Fprintf(SB)
-    for i := 1; i < n; i++ {
+    for i := 1; i < len(splits); i++ {
   0x1095da6		488b442458		MOVQ 0x58(SP), AX
   0x1095dab		488d5001		LEAQ 0x1(AX), DX
+  0x1095daf		488b442450		MOVQ 0x50(SP), AX
         s := splits[i]
-  0x1095daf		488b442460		MOVQ 0x60(SP), AX
-    for i := 1; i < n; i++ {
-  0x1095db4		488b4c2450		MOVQ 0x50(SP), CX
-  0x1095db9		4839ca			CMPQ CX, DX
+  0x1095db4		488b4c2460		MOVQ 0x60(SP), CX
+    for i := 1; i < len(splits); i++ {
+  0x1095db9		4839c2			CMPQ AX, DX
   0x1095dbc		0f8c1cffffff		JL 0x1095cde
   0x1095dc2		488bac2490000000	MOVQ 0x90(SP), BP
   0x1095dca		4881c498000000		ADDQ $0x98, SP```

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment