खोज…


टिप्पणियों

इनलाइन विस्तार संकलित कोड में एक सामान्य अनुकूलन है जो बाइनरी आकार पर प्रदर्शन को प्राथमिकता देता है। यह संकलक को फ़ंक्शन के वास्तविक निकाय के साथ फ़ंक्शन कॉल को बदलने देता है; संकलित समय पर एक स्थान से दूसरे स्थान पर प्रभावी ढंग से कॉपी / पेस्ट करना। चूँकि कॉल साइट का विस्तार सिर्फ मशीन के निर्देशों के लिए होता है जो फ़ंक्शन के लिए संकलित होता है, हमें 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
…


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow