go run แล้วทำไมช้า?

slow-snail-1409322

บางครั้งที่เรา import Library เข้ามาบางตัวเช่น github.com/mattn/go-sqlite3  หรือกระทั่ง github.com/lib/pq พอสั่ง go run … หรือ go test แล้วปรากฏว่าทำงานช้าผิดปกติ อาจใช้เวลา30-50 วินาที กว่าจะรันโปรแกรมเราได้ ทั้งๆที่ปกติโกขึ้นชื่อเรื่องเร็วจี๋มิใช่ฤา แปลกใจปนหงุดหงิดนั่งสงสัยอยู่นาน

พบคำตอบที่ Library

ตัวไลบรารี่ที่ผมเจอปัญหาคือไลบรารี่ที่เป็น Database driver ตอน go get มา มันมาแต่ source code ดังนั้นทุกครั้งที่เรา import มันมาใช้ แล้วรัน หรือเทสผมค้นพบว่า มันไม่ได้คอมไพล์โค้ดให้เป็นไบนารี่ หรือภาษาเครื่องแล้วเซฟลงดิสก์ให้เรา ดังนั้นมันเลยต้องเสียเวลาคอมไพล์ใหม่ทุกครั้งที่สั่งรัน คือคำสั่ง go run มันคอมไพล์ไว้ในไดเรคทอรี่ชั่วคราวแต่ไม่เก็บไบนารี่ไฟล์ให้เรา และจะล้างทิ้งเองมันจะคอมไพล์ซอร์สโค้ดใหม่ทั้งหมดนั่นเอง! เราสามารถดูที่เก็บไฟล์ชั่วคราวด้วยการรันพร้อมอาร์กิวเม้นต์ –work เช่น

go run –work main.go

ยาแก้ก็คือใช้ go install เช่น

go install github.com/mattn/go-sqlite3

ซะ go tool จะคอมไพล์ไลบรารี่ go-sqlite3 เป็นไบนารี่ (บนวินโดวส์จะมี .exe ตามท้าย) โดยเก็บไว้ใน $GOPATH/bin ให้เราเรียกใช้เมื่อไรก็ได้ทุกครั้งหลังจากนี้เมื่อ go run หรือ go test ผลก็คือ golang เร็วส์…

เพิ่งเข้าใจว่า go install มันใช้ประโยชน์อย่างนี้นี่เอง