Go
इनलाइन विस्तार
खोज…
टिप्पणियों
इनलाइन विस्तार संकलित कोड में एक सामान्य अनुकूलन है जो बाइनरी आकार पर प्रदर्शन को प्राथमिकता देता है। यह संकलक को फ़ंक्शन के वास्तविक निकाय के साथ फ़ंक्शन कॉल को बदलने देता है; संकलित समय पर एक स्थान से दूसरे स्थान पर प्रभावी ढंग से कॉपी / पेस्ट करना। चूँकि कॉल साइट का विस्तार सिर्फ मशीन के निर्देशों के लिए होता है जो फ़ंक्शन के लिए संकलित होता है, हमें CALL या PUSH (GOTO स्टेटमेंट का x86 समतुल्य या स्टैक फ्रेम पुश) या उनके समतुल्य प्रदर्शन नहीं करना है। आर्किटेक्चर।
इनलाइनर कई विशेषताओं के आधार पर किसी फ़ंक्शन को इनलाइन करने या न करने के बारे में निर्णय लेता है, लेकिन सामान्य रूप से डिफ़ॉल्ट रूप से इनलाइन होता है। क्योंकि इनलाइनर को फ़ंक्शन कॉल से छुटकारा मिल जाता है, यह प्रभावी रूप से यह तय करने के लिए मिलता है कि शेड्यूलर को गोरआउट करने से पहले कहां अनुमति दी जाती है।
फ़ंक्शन कॉल इनलाइन नहीं होगी यदि निम्न में से कोई भी सत्य हो (कई अन्य कारण भी हैं, यह सूची अपूर्ण है):
- कार्य परिवर्तनशील हैं (उदाहरण के लिए
...
उनके पास...
args) - फ़ंक्शंस में बजट की तुलना में "अधिकतम बालों का झड़ना" होता है (वे किसी अन्य कारण से बहुत अधिक पुनरावृत्ति करते हैं या उनका विश्लेषण नहीं किया जा सकता है)
- उनमें
panic
,recover
याdefer
इनलाइन विस्तार अक्षम करना
इनलाइन विस्तार को go:noinline
साथ अक्षम किया जा सकता है go:noinline
pragma। उदाहरण के लिए, यदि हम निम्नलिखित सरल प्रोग्राम बनाते हैं:
package main
func printhello() {
println("Hello")
}
func main() {
printhello()
}
हमें आउटपुट मिलता है जो इस तरह दिखता है (पठनीयता के लिए छंटनी):
$ go version
go version go1.6.2 linux/amd64
$ go build main.go
$ ./main
Hello
$ go tool objdump main
TEXT main.main(SB) /home/sam/main.go
main.go:7 0x401000 64488b0c25f8ffffff FS MOVQ FS:0xfffffff8, CX
main.go:7 0x401009 483b6110 CMPQ 0x10(CX), SP
main.go:7 0x40100d 7631 JBE 0x401040
main.go:7 0x40100f 4883ec10 SUBQ $0x10, SP
main.go:8 0x401013 e8281f0200 CALL runtime.printlock(SB)
main.go:8 0x401018 488d1d01130700 LEAQ 0x71301(IP), BX
main.go:8 0x40101f 48891c24 MOVQ BX, 0(SP)
main.go:8 0x401023 48c744240805000000 MOVQ $0x5, 0x8(SP)
main.go:8 0x40102c e81f290200 CALL runtime.printstring(SB)
main.go:8 0x401031 e89a210200 CALL runtime.printnl(SB)
main.go:8 0x401036 e8851f0200 CALL runtime.printunlock(SB)
main.go:9 0x40103b 4883c410 ADDQ $0x10, SP
main.go:9 0x40103f c3 RET
main.go:7 0x401040 e87b9f0400 CALL runtime.morestack_noctxt(SB)
main.go:7 0x401045 ebb9 JMP main.main(SB)
main.go:7 0x401047 cc INT $0x3
main.go:7 0x401048 cc INT $0x3
main.go:7 0x401049 cc INT $0x3
main.go:7 0x40104a cc INT $0x3
main.go:7 0x40104b cc INT $0x3
main.go:7 0x40104c cc INT $0x3
main.go:7 0x40104d cc INT $0x3
main.go:7 0x40104e cc INT $0x3
main.go:7 0x40104f cc INT $0x3
…
ध्यान दें कि printhello
में कोई CALL
नहीं है। हालांकि, अगर हम जगह में कार्यक्रम के साथ निर्माण करते हैं:
package main
//go:noinline
func printhello() {
println("Hello")
}
func main() {
printhello()
}
आउटपुट में प्रिंटहेलो फ़ंक्शन और एक CALL main.printhello
:
$ go version
go version go1.6.2 linux/amd64
$ go build main.go
$ ./main
Hello
$ go tool objdump main
TEXT main.printhello(SB) /home/sam/main.go
main.go:4 0x401000 64488b0c25f8ffffff FS MOVQ FS:0xfffffff8, CX
main.go:4 0x401009 483b6110 CMPQ 0x10(CX), SP
main.go:4 0x40100d 7631 JBE 0x401040
main.go:4 0x40100f 4883ec10 SUBQ $0x10, SP
main.go:5 0x401013 e8481f0200 CALL runtime.printlock(SB)
main.go:5 0x401018 488d1d01130700 LEAQ 0x71301(IP), BX
main.go:5 0x40101f 48891c24 MOVQ BX, 0(SP)
main.go:5 0x401023 48c744240805000000 MOVQ $0x5, 0x8(SP)
main.go:5 0x40102c e83f290200 CALL runtime.printstring(SB)
main.go:5 0x401031 e8ba210200 CALL runtime.printnl(SB)
main.go:5 0x401036 e8a51f0200 CALL runtime.printunlock(SB)
main.go:6 0x40103b 4883c410 ADDQ $0x10, SP
main.go:6 0x40103f c3 RET
main.go:4 0x401040 e89b9f0400 CALL runtime.morestack_noctxt(SB)
main.go:4 0x401045 ebb9 JMP main.printhello(SB)
main.go:4 0x401047 cc INT $0x3
main.go:4 0x401048 cc INT $0x3
main.go:4 0x401049 cc INT $0x3
main.go:4 0x40104a cc INT $0x3
main.go:4 0x40104b cc INT $0x3
main.go:4 0x40104c cc INT $0x3
main.go:4 0x40104d cc INT $0x3
main.go:4 0x40104e cc INT $0x3
main.go:4 0x40104f cc INT $0x3
TEXT main.main(SB) /home/sam/main.go
main.go:8 0x401050 64488b0c25f8ffffff FS MOVQ FS:0xfffffff8, CX
main.go:8 0x401059 483b6110 CMPQ 0x10(CX), SP
main.go:8 0x40105d 7606 JBE 0x401065
main.go:9 0x40105f e89cffffff CALL main.printhello(SB)
main.go:10 0x401064 c3 RET
main.go:8 0x401065 e8769f0400 CALL runtime.morestack_noctxt(SB)
main.go:8 0x40106a ebe4 JMP main.main(SB)
main.go:8 0x40106c cc INT $0x3
main.go:8 0x40106d cc INT $0x3
main.go:8 0x40106e cc INT $0x3
main.go:8 0x40106f cc INT $0x3
…