Inline expansion (original) (raw)
Die Inline-Ersetzung ist eine Optimierungsmethode von Compilern zur Steigerung der Ausführungsgeschwindigkeit eines Computerprogramms. Dabei wird der Code der aufzurufenden Funktion an Stelle des Aufrufs kopiert. Das reduziert den Mehraufwand für den Aufruf (Sichern der Register, Vorbereiten des Stacks), verbessert die Lokalität und weiterhin kann bei der Optimierung der Code beider Funktionen gemeinsam berücksichtigt werden.
Property | Value |
---|---|
dbo:abstract | Die Inline-Ersetzung ist eine Optimierungsmethode von Compilern zur Steigerung der Ausführungsgeschwindigkeit eines Computerprogramms. Dabei wird der Code der aufzurufenden Funktion an Stelle des Aufrufs kopiert. Das reduziert den Mehraufwand für den Aufruf (Sichern der Register, Vorbereiten des Stacks), verbessert die Lokalität und weiterhin kann bei der Optimierung der Code beider Funktionen gemeinsam berücksichtigt werden. (de) In computing, inline expansion, or inlining, is a manual or compiler optimization that replaces a function call site with the body of the called function. Inline expansion is similar to macro expansion, but occurs during compilation, without changing the source code (the text), while macro expansion occurs prior to compilation, and results in different text that is then processed by the compiler. Inlining is an important optimization, but has complicated effects on performance. As a rule of thumb, some inlining will improve speed at very minor cost of space, but excess inlining will hurt speed, due to inlined code consuming too much of the instruction cache, and also cost significant space. A survey of the modest academic literature on inlining from the 1980s and 1990s is given in Peyton Jones & Marlow 1999. (en) En informatique, l'extension inline, ou inlining, est une optimisation d'un compilateur qui remplace un appel de fonction par le code de cette fonction. Cette optimisation vise à réduire le temps d'exécution ainsi que la consommation mémoire. Toutefois, l'extension inline peut augmenter la taille du programme (par la répétition du code d'une fonction). Certains langages (par exemple le C ou le C++) ont un mot clé inline attachable à la définition d'une fonction. Ce mot clé indique au compilateur qu'il devrait essayer d'étendre cette fonction. Le compilateur pourra ensuite utiliser plusieurs heuristiques pour décider quelle fonction doit être étendue inline. (fr) 컴퓨팅에서 인라인 확장(inline expansion) 또는 인라이닝(inlining)은 함수를 함수라는 이름의 몸체의 로 대체하는 수동 또는 컴파일러 최적화 기법이다. 인라인 확장은 매크로 확장과 비슷하지만 소스 코드의 변경 없이 컴파일 중에 발생하는 반면, 매크로 확장은 컴파일 전에 발생하며 컴파일러에 의해 처리되는 텍스트 결과물이 다르다. 인라이닝은 중요한 최적화이지만 성능에 복잡한 효력을 발휘한다. 에 의거하여 일부 인라이닝은 매우 사소한 공간적 비용으로 속도를 개선시키지만 과도한 인라이닝은 인라인된 코드에 의해 함수 캐시를 상당 부분 소비하기 때문에 속도가 감소되며 상당한 공간 비용이 발생한다. 인라인에 관한 한정된 학술 논문 조사는 Jones & Marlow 1999를 통해 이루어졌다. (ko) インライン展開(インラインてんかい、英: inline expansion または 英: inlining)とは、コンパイラによる最適化手法の1つで、関数を呼び出す側に呼び出される関数のコードを展開し、関数への制御転送をしないようにする手法。これにより関数呼び出しに伴うオーバーヘッドを削減する。特に小さくて頻繁に呼ばれる関数では効果的であり、呼び出し側にそのコードを展開することで定数畳み込みなどのさらなる最適化を施せる可能性が生じる。問題点はバイナリコードが一般に肥大化する結果を招く点であり、参照の局所性を損なうほどだったり、リソースの限界を超えると性能がかえって悪化することになる。 関数型言語の世界では、インライン展開をβ変換とも呼び、関数型言語の理論的基盤となっているラムダ計算の用語としてよく使われる。 (ja) В вычислительной технике встраивание функций (англ. Inlining) — способ оптимизации, при котором вызов функции заменяется непосредственно её телом. Встраивание функций аналогично по сути подстановке из макроса, но в отличие от неё не изменяет исходный код и происходит во время компиляции, в то время как макросы изменяют исходный код перед компиляцией. Встраивание функций — это важная оптимизация, однако оказываемый эффект на производительность может быть различным. Как правило, некоторое количество встраиваний помогает улучшить быстродействие при очень незначительных затратах пространства, но избыточность использования может замедлить программу из-за того, что встроенный код станет потреблять слишком много кэша инструкций, а также займёт значительное количество пространства. В книге Jones & Marlow 1999 года приведён обзор академической литературы 1980-х и 1990-х годов по встраиванию функций. (ru) 内联展开(或称内联,下文或交替使用)是一种将函数体直接展开到的一种优化技术。它可以由手工指定(如inline关键字),或者经由自动完成。内联展开类似于,区别在于内联展开在编译时完成,而宏展开则可能在(如C/C++)、编译时(如Scheme)、运行时(如Scheme)时完成。 内联是一种重要的优化技术。内联的好处主要在于消除函数的调用开销(压栈,保护/恢复现场),但内联展开对于性能的提升不能一概而论,它可能导致生成的代码体积膨胀,并且影响指令缓存的命中率。有研究表明函数内联展开在缓存小的时候能提升性能,缓存较大的时候性能有可能下降。 除此之外,内联展开会引入大量冗余代码,需要通过一系列编译优化步骤进行缩减。比如一个记录(或理解为结构体)中的值是不变的,那么可以将其值直接替换到引用处;逻辑上不被使用到的分支代码或者变量,会被自动消除掉;逻辑上不可能进入的分支也可以消除掉。通过这些优化可以极大缩减冗余的代码,使得程序编译后获得较为紧凑的体量。 (zh) |
dbo:wikiPageExternalLink | http://impact.crhc.illinois.edu/shared/report/crhc-91-17.icache.pdf%7C https://en.cppreference.com/w/cpp/language/inline)%7Cdate=April http://research.microsoft.com/~simonpj/Papers/inlining/ https://web.archive.org/web/20041010124209/http:/www.codeproject.com/tips/gloption.asp https://web.archive.org/web/20060907183845/http:/www.cs.arizona.edu/alto/Doc/alto.html https://web.archive.org/web/20160303171839/http:/www.iecc.com/linker/linker11.html http://citeseer.ist.psu.edu/viewdoc/summary%3Fdoi=10.1.1.114.1036 http://citeseer.ist.psu.edu/viewdoc/summary%3Fdoi=10.1.1.187.7208 |
dbo:wikiPageID | 216884 (xsd:integer) |
dbo:wikiPageLength | 26244 (xsd:nonNegativeInteger) |
dbo:wikiPageRevisionID | 1092209597 (xsd:integer) |
dbo:wikiPageWikiLink | dbr:Rule_of_thumb dbr:Enabling_transformation dbr:Mutator_method dbr:Bjarne_Stroustrup dbr:Dead_code_elimination dbc:Articles_with_example_Haskell_code dbr:Register_spilling dbr:Call_by_reference dbr:Call_by_sharing dbr:Inline_function dbr:Intermediate_representation dbr:Interprocedural_optimization dbr:Register_allocation dbr:Common_Lisp dbr:Compiler dbr:Constant_(mathematics) dbr:Run_time_(program_lifecycle_phase) dbr:Escape_analysis dbr:Command-line_option dbr:Order_of_operations dbr:Optimization_(computer_science) dbr:Function_prologue dbr:Glasgow_Haskell_Compiler dbr:Branch_(computer_science) dbr:Control_flow dbr:Macro_assembler dbr:Call_by_address dbr:Call_graph dbr:Call_site dbr:Subroutine dbr:Computing dbr:Embedded_system dbr:Functional_programming dbr:Function_call dbr:Page_fault dbr:Profile-guided_optimization dbr:Statement_(computer_science) dbr:Translation_unit_(programming) dbr:C++ dbr:C99 dbr:C_(programming_language) dbc:Compiler_optimizations dbc:Subroutines dbr:Thrashing_(computer_science) dbr:Type_checking dbr:Code_outlining dbr:Lazy_evaluation dbr:Linker_(computing) dbr:Locality_of_reference dbr:Parameter dbr:Partial_evaluation dbr:Directive_(programming) dbr:Fast_path dbr:John_R._Levine dbr:Source_code dbr:Functional_programming_language dbr:Return_statement dbr:Haskell_(programming_language) dbr:Heuristics dbr:Ada_programming_language dbr:Java_(programming_language) dbc:Articles_with_example_C_code dbr:Abstract_syntax_tree dbc:Articles_with_example_Lisp_(programming_language)_code dbr:Lambda_calculus dbr:Binary_file dbr:Constant_(programming) dbr:Copy_and_paste_programming dbr:Recursion_(computer_science) dbr:Self_(programming_language) dbr:Knapsack_problem dbr:Urs_Hölzle dbr:Loop-invariant_code_motion dbr:Loop_unrolling dbr:Macro_(computer_science) dbr:Link-time_optimization dbr:Executable dbr:Instruction_cache dbr:Object-oriented_programming_language dbr:Parameterized_macro dbr:Working_set dbr:Run-time_system dbr:L1_cache dbr:Macro_expansion dbr:Java_Hotspot_compiler dbr:C_(computer_language) dbr:Function_epilogue dbr:Functional_language dbr:Induction_variable_elimination dbr:Accessor_method dbr:Conditional_branch dbr:Code_duplication dbr:Compiler_directive dbr:Compiler_optimization dbr:Just-in-time_compiler dbr:Tail-call_elimination dbr:Brandon_Bray dbr:Brad_Calder dbr:Dirk_Grumwald dbr:Gerald_Aigner dbr:Load_forwarding dbr:Tail_duplication |
dbp:wikiPageUsesTemplate | dbt:Cite_techreport dbt:Cite_journal dbt:Efn dbt:Main_article dbt:Notelist dbt:Refbegin dbt:Refend dbt:Refimprove dbt:Reflist dbt:Sfn dbt:Short_description dbt:Update dbt:Use_American_English dbt:Wiktionary dbt:Compiler_optimizations |
dct:subject | dbc:Articles_with_example_Haskell_code dbc:Compiler_optimizations dbc:Subroutines dbc:Articles_with_example_C_code dbc:Articles_with_example_Lisp_(programming_language)_code |
gold:hypernym | dbr:Optimization |
rdf:type | dbo:Software yago:WikicatCompilerOptimizations yago:WikicatSubroutines yago:Abstraction100002137 yago:Act100030358 yago:Action100037396 yago:Change100191142 yago:ChangeOfState100199130 yago:Code106355894 yago:CodingSystem106353757 yago:Communication100033020 yago:Event100029378 yago:Improvement100248977 yago:Optimization100260051 yago:PsychologicalFeature100023100 yago:Writing106359877 yago:WrittenCommunication106349220 yago:YagoPermanentlyLocatedEntity yago:Routine106582403 yago:Software106566077 |
rdfs:comment | Die Inline-Ersetzung ist eine Optimierungsmethode von Compilern zur Steigerung der Ausführungsgeschwindigkeit eines Computerprogramms. Dabei wird der Code der aufzurufenden Funktion an Stelle des Aufrufs kopiert. Das reduziert den Mehraufwand für den Aufruf (Sichern der Register, Vorbereiten des Stacks), verbessert die Lokalität und weiterhin kann bei der Optimierung der Code beider Funktionen gemeinsam berücksichtigt werden. (de) 컴퓨팅에서 인라인 확장(inline expansion) 또는 인라이닝(inlining)은 함수를 함수라는 이름의 몸체의 로 대체하는 수동 또는 컴파일러 최적화 기법이다. 인라인 확장은 매크로 확장과 비슷하지만 소스 코드의 변경 없이 컴파일 중에 발생하는 반면, 매크로 확장은 컴파일 전에 발생하며 컴파일러에 의해 처리되는 텍스트 결과물이 다르다. 인라이닝은 중요한 최적화이지만 성능에 복잡한 효력을 발휘한다. 에 의거하여 일부 인라이닝은 매우 사소한 공간적 비용으로 속도를 개선시키지만 과도한 인라이닝은 인라인된 코드에 의해 함수 캐시를 상당 부분 소비하기 때문에 속도가 감소되며 상당한 공간 비용이 발생한다. 인라인에 관한 한정된 학술 논문 조사는 Jones & Marlow 1999를 통해 이루어졌다. (ko) インライン展開(インラインてんかい、英: inline expansion または 英: inlining)とは、コンパイラによる最適化手法の1つで、関数を呼び出す側に呼び出される関数のコードを展開し、関数への制御転送をしないようにする手法。これにより関数呼び出しに伴うオーバーヘッドを削減する。特に小さくて頻繁に呼ばれる関数では効果的であり、呼び出し側にそのコードを展開することで定数畳み込みなどのさらなる最適化を施せる可能性が生じる。問題点はバイナリコードが一般に肥大化する結果を招く点であり、参照の局所性を損なうほどだったり、リソースの限界を超えると性能がかえって悪化することになる。 関数型言語の世界では、インライン展開をβ変換とも呼び、関数型言語の理論的基盤となっているラムダ計算の用語としてよく使われる。 (ja) 内联展开(或称内联,下文或交替使用)是一种将函数体直接展开到的一种优化技术。它可以由手工指定(如inline关键字),或者经由自动完成。内联展开类似于,区别在于内联展开在编译时完成,而宏展开则可能在(如C/C++)、编译时(如Scheme)、运行时(如Scheme)时完成。 内联是一种重要的优化技术。内联的好处主要在于消除函数的调用开销(压栈,保护/恢复现场),但内联展开对于性能的提升不能一概而论,它可能导致生成的代码体积膨胀,并且影响指令缓存的命中率。有研究表明函数内联展开在缓存小的时候能提升性能,缓存较大的时候性能有可能下降。 除此之外,内联展开会引入大量冗余代码,需要通过一系列编译优化步骤进行缩减。比如一个记录(或理解为结构体)中的值是不变的,那么可以将其值直接替换到引用处;逻辑上不被使用到的分支代码或者变量,会被自动消除掉;逻辑上不可能进入的分支也可以消除掉。通过这些优化可以极大缩减冗余的代码,使得程序编译后获得较为紧凑的体量。 (zh) In computing, inline expansion, or inlining, is a manual or compiler optimization that replaces a function call site with the body of the called function. Inline expansion is similar to macro expansion, but occurs during compilation, without changing the source code (the text), while macro expansion occurs prior to compilation, and results in different text that is then processed by the compiler. (en) En informatique, l'extension inline, ou inlining, est une optimisation d'un compilateur qui remplace un appel de fonction par le code de cette fonction. Cette optimisation vise à réduire le temps d'exécution ainsi que la consommation mémoire. Toutefois, l'extension inline peut augmenter la taille du programme (par la répétition du code d'une fonction). (fr) В вычислительной технике встраивание функций (англ. Inlining) — способ оптимизации, при котором вызов функции заменяется непосредственно её телом. Встраивание функций аналогично по сути подстановке из макроса, но в отличие от неё не изменяет исходный код и происходит во время компиляции, в то время как макросы изменяют исходный код перед компиляцией. (ru) |
rdfs:label | Inline-Ersetzung (de) Inline expansion (en) Extension inline (fr) 인라인 확장 (ko) インライン展開 (ja) Встраивание функций (ru) 内联展开 (zh) |
owl:sameAs | freebase:Inline expansion yago-res:Inline expansion wikidata:Inline expansion dbpedia-az:Inline expansion dbpedia-de:Inline expansion dbpedia-fa:Inline expansion dbpedia-fr:Inline expansion dbpedia-ja:Inline expansion dbpedia-ko:Inline expansion dbpedia-ru:Inline expansion dbpedia-sr:Inline expansion dbpedia-zh:Inline expansion https://global.dbpedia.org/id/dRXz |
prov:wasDerivedFrom | wikipedia-en:Inline_expansion?oldid=1092209597&ns=0 |
foaf:isPrimaryTopicOf | wikipedia-en:Inline_expansion |
is dbo:wikiPageDisambiguates of | dbr:Inline |
is dbo:wikiPageRedirects of | dbr:Method_inlining dbr:Inlining dbr:Function_inlining dbr:In-line-expand dbr:In-line_expand dbr:In-line_expansion dbr:In-line_substitution dbr:In-lining dbr:Inline-expansion dbr:Inline_code dbr:Inline_expand dbr:Inline_substitution |
is dbo:wikiPageWikiLink of | dbr:ProGuard dbr:Enabling_transformation dbr:Message_sequence_chart dbr:Tail_call dbr:Julia_(programming_language) dbr:Duplicate_code dbr:Index_of_object-oriented_programming_articles dbr:Inline_function dbr:Interprocedural_optimization dbr:Inline dbr:Comparison_of_C_Sharp_and_Java dbr:Comparison_of_programming_paradigms dbr:Compiler dbr:Rust_(programming_language) dbr:Function_(computer_programming) dbr:Game_Oriented_Assembly_Lisp dbr:Glasgow_Haskell_Compiler dbr:Google_AdSense dbr:Anonymous_function dbr:Load-Hit-Store dbr:LuaJIT dbr:MX-1_Kalakian dbr:Functional_programming dbr:Mutual_recursion dbr:Burroughs_large_systems dbr:Just-in-time_compilation dbr:Adaptive_optimization dbr:Haxe dbr:Assembly_language dbr:AMD_FireStream dbr:LCC_(compiler) dbr:Java_performance dbr:Stack_trace dbr:As-if_rule dbr:PostgreSQL dbr:Final_(Java) dbr:Method_inlining dbr:Inheritance_(object-oriented_programming) dbr:Microsoft-specific_exception_handling_mechanisms dbr:Operator_(computer_programming) dbr:Optimizing_compiler dbr:Macro_(computer_science) dbr:Sort_(C++) dbr:Virtual_method_table dbr:Inlining dbr:Function_inlining dbr:In-line-expand dbr:In-line_expand dbr:In-line_expansion dbr:In-line_substitution dbr:In-lining dbr:Inline-expansion dbr:Inline_code dbr:Inline_expand dbr:Inline_substitution |
is rdfs:seeAlso of | dbr:Inline_function |
is foaf:primaryTopic of | wikipedia-en:Inline_expansion |